代码之家  ›  专栏  ›  技术社区  ›  Crystal

使用现有的中间CA密钥和证书以及keytool生成客户端证书

  •  0
  • Crystal  · 技术社区  · 8 年前

    我正在接管一个现有的项目,其中我有使用openssl创建的密钥/证书(根CA和中间CA)。我被告知尝试使用keytool为Java中的SSL的客户端身份验证生成客户端证书。

    我不是一个加密人,所以这都是很新的,但我在这个poc中使用了Bouncy Castle,它可以正确生成客户端证书,因为客户端可以通过我们的服务进行身份验证,并建立SSL连接。

    public X509Certificate buildEndEntityCert(PublicKey entityKey, PrivateKey caKey, X509Certificate caCert, String clientName)
            throws Exception {
        String name = "CN=Test";
        X509v3CertificateBuilder certBldr = new JcaX509v3CertificateBuilder(
                caCert.getSubjectX500Principal(),
                BigInteger.ONE,
                new Date(System.currentTimeMillis()),
                new Date(System.currentTimeMillis() + VALIDITY_PERIOD),
                new X500Principal(name),
                entityKey);
    
        JcaX509ExtensionUtils extUtils = new JcaX509ExtensionUtils();
    
        certBldr.addExtension(Extension.authorityKeyIdentifier, false, extUtils.createAuthorityKeyIdentifier(caCert))
                .addExtension(Extension.subjectKeyIdentifier, false, extUtils.createSubjectKeyIdentifier(entityKey))
                .addExtension(Extension.basicConstraints, false, new BasicConstraints(false))
                .addExtension(Extension.keyUsage, false, new KeyUsage(KeyUsage.digitalSignature | KeyUsage.keyEncipherment | KeyUsage.nonRepudiation))
                .addExtension(Extension.extendedKeyUsage, false, new ExtendedKeyUsage(KeyPurposeId.id_kp_clientAuth));
    
        ContentSigner signer = new JcaContentSignerBuilder("SHA256withRSA").setProvider("BC").build(caKey);
    
        return new JcaX509CertificateConverter().setProvider("BC").getCertificate(certBldr.build(signer));
    }
    

    如果没有一个命令或一组命令可以实现这一点,有没有一种方法可以做到这一点?就像创建一个新的信任库一样,导入这些证书,然后从作为CA的信任库中创建新的证书?