如何仅使用 JDK 支持 类 生成自签名证书?
How to generate a self-signed certificate using only JDK supported classes?
我在 Java 中有一个程序,目前使用私有 JDK 类(CertAndKeyGen
和 X500Name
)来生成自签名 X.509证书。
这种做法问题太多:
- 内部包不断变化:
- "sun.security.x509.CertAndKeyGen", // Oracle/Sun/OpenJDK 6,7
- "sun.security.tools.keytool.CertAndKeyGen", // Oracle/Sun/OpenJDK 8
- "com.ibm.security.x509.CertAndKeyGen", // IBM SDK 7
- "com.ibm.security.tools.CertAndKeyGen" // IBM SDK 8
- 显然 JDK 7 更新 (u111?) 最近更改了上面列出的软件包
- Java 9 会隐藏这些 类
我想将此代码转换为使用支持的标准 JDK 类。
我看过使用名称错误的 CertificateFactory.generateCertificate()
方法,但没有成功:它们无法生成任何证书,只能加载现有的证书。
有人知道可以生成自签名证书的标准 JDK API 吗?
这是我所能做到的:
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048, SecureRandom.getInstance("SHA1WithRSA"));
KeyPair keyPair = generator.generateKeyPair();
PrivateKey privatekey = keyPair.getPrivate();
X500Principal principal = new X500Principal(dn);
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
// How to generate the self-signed certificate from there?
// certFactory.generate(inputStream) // only able to load an existing certificate
注:
- 如果可能的话,我们不想引入对 bouncy-castle 的依赖
- 我已经知道
X509V3CertificateGenerator
- 我们不想通过
ProcessBuilder
调用 keytool
:)
好吧,那我估计是不存在的
我提交给 JDK 的 RFE 已被接受,现在有一个官方错误:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8165481
我在 Java 中有一个程序,目前使用私有 JDK 类(CertAndKeyGen
和 X500Name
)来生成自签名 X.509证书。
这种做法问题太多:
- 内部包不断变化:
- "sun.security.x509.CertAndKeyGen", // Oracle/Sun/OpenJDK 6,7
- "sun.security.tools.keytool.CertAndKeyGen", // Oracle/Sun/OpenJDK 8
- "com.ibm.security.x509.CertAndKeyGen", // IBM SDK 7
- "com.ibm.security.tools.CertAndKeyGen" // IBM SDK 8
- 显然 JDK 7 更新 (u111?) 最近更改了上面列出的软件包
- Java 9 会隐藏这些 类
我想将此代码转换为使用支持的标准 JDK 类。
我看过使用名称错误的 CertificateFactory.generateCertificate()
方法,但没有成功:它们无法生成任何证书,只能加载现有的证书。
有人知道可以生成自签名证书的标准 JDK API 吗?
这是我所能做到的:
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048, SecureRandom.getInstance("SHA1WithRSA"));
KeyPair keyPair = generator.generateKeyPair();
PrivateKey privatekey = keyPair.getPrivate();
X500Principal principal = new X500Principal(dn);
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
// How to generate the self-signed certificate from there?
// certFactory.generate(inputStream) // only able to load an existing certificate
注:
- 如果可能的话,我们不想引入对 bouncy-castle 的依赖
- 我已经知道
X509V3CertificateGenerator
- 我已经知道
- 我们不想通过
ProcessBuilder
调用keytool
:)
好吧,那我估计是不存在的
我提交给 JDK 的 RFE 已被接受,现在有一个官方错误:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8165481