Java 以编程方式创建证书时使用密码加密私钥

Java 以编程方式创建证书时使用密码加密私钥,java,ssl,encryption,cryptography,certificate,Java,Ssl,Encryption,Cryptography,Certificate,当我使用openssl命令创建证书时,它可以选择使用密码保护私钥。但是,当我以编程方式在Java中创建证书和公钥/私钥对时,与openssl命令不同,Java API只能在keystone上设置密码,而不能在私钥上设置密码。那么,有没有办法像openssl命令那样用密码加密私钥呢 如果有帮助,下面是我如何用Java创建私钥和证书: KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); ke

当我使用openssl命令创建证书时,它可以选择使用密码保护私钥。但是,当我以编程方式在Java中创建证书和公钥/私钥对时,与openssl命令不同,Java API只能在keystone上设置密码,而不能在私钥上设置密码。那么,有没有办法像openssl命令那样用密码加密私钥呢

如果有帮助,下面是我如何用Java创建私钥和证书:

    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
    keyPairGenerator.initialize(KEY_SIZE, new SecureRandom());
    KeyPair keyPair = keyPairGenerator.generateKeyPair();

    X509CertInfo info = new X509CertInfo();
    CertificateValidity validityInterval = generateValidityInterval();
    BigInteger serialNumber = new BigInteger(SERIAL_NUMBER_SIZE, new SecureRandom());
    X500Name owner = new X500Name(DN);

    info.set(X509CertInfo.VALIDITY, validityInterval);
    info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(serialNumber));
    info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(owner));
    info.set(X509CertInfo.ISSUER, new CertificateIssuerName(owner));
    info.set(X509CertInfo.KEY, new CertificateX509Key(keyPair.getPublic()));
    info.set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V3));
    AlgorithmId certificateAlgorithm = new AlgorithmId(CERTIFICATE_ALGORITHM);
    info.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId(certificateAlgorithm));

    X509CertImpl certificate = new X509CertImpl(info);
    certificate.sign(keyPair.getPrivate(), new AlgorithmId(SIGNATURE_ALGORITHM).getName());

    AlgorithmId x509Algorithm = (AlgorithmId) certificate.get(X509CertImpl.SIG_ALG);
    info.set(CertificateAlgorithmId.NAME + "." + CertificateAlgorithmId.ALGORITHM, x509Algorithm);
    certificate = new X509CertImpl(info);
    certificate.sign(keyPair.getPrivate(), new AlgorithmId(SIGNATURE_ALGORITHM).getName());

请参阅,是否没有办法使用类似openssl命令中的密码加密私钥…-你在这里要小心。OpenSSL可以使用RFC1421的PEM消息加密对密钥进行加密。它是一种旧格式,OpenSSL默认使用它。不幸的是,当密钥大小大于16字节时,OpenSSL使用非标准派生函数。因此Java可能无法解密密钥。使用pkcs8实用程序,可以剥离旧格式的加密并对密钥应用pkcs8加密。Java应该能够解密PKCS8加密密钥。X509CertInfo?X509CertImpl?此代码使用了不受支持的内部类,任何人都不应该使用这些类。@GregS感谢您的反馈。你能详细解释一下为什么不应该使用这些内部类吗?这可能不是最可靠的源代码,但在本示例中使用了类。任何以sun.*或com.sun.*开头的内容都是不允许的。请参见以下问题: