在没有BouncyCastle的Java中创建X509证书?

在没有BouncyCastle的Java中创建X509证书?,java,x509certificate,jce,Java,X509certificate,Jce,是否可以在不使用Bouncy CastleX509V*CertificateGenerator类的情况下用Java代码理智地创建X509证书?签署证书的功能不是标准Java库或扩展的一部分 许多需要自己完成的代码都是核心的一部分。有一些类用于编码和解码X.500名称、X.509证书扩展、各种算法的公钥,当然还有实际执行数字签名 自己实现这一点并不简单,但绝对是可行的——第一次为证书签名制作工作原型时,我可能花了整整4到5天的时间。对我来说,这是一个很棒的学习练习,但当有免费可用的库时,很难证明这

是否可以在不使用Bouncy Castle
X509V*CertificateGenerator
类的情况下用Java代码理智地创建X509证书?

签署证书的功能不是标准Java库或扩展的一部分

许多需要自己完成的代码都是核心的一部分。有一些类用于编码和解码X.500名称、X.509证书扩展、各种算法的公钥,当然还有实际执行数字签名


自己实现这一点并不简单,但绝对是可行的——第一次为证书签名制作工作原型时,我可能花了整整4到5天的时间。对我来说,这是一个很棒的学习练习,但当有免费可用的库时,很难证明这项费用是合理的。

签署证书的能力不是标准Java库或扩展的一部分

许多需要自己完成的代码都是核心的一部分。有一些类用于编码和解码X.500名称、X.509证书扩展、各种算法的公钥,当然还有实际执行数字签名


自己实现这一点并不简单,但绝对是可行的——第一次为证书签名制作工作原型时,我可能花了整整4到5天的时间。这对我来说是一个很棒的学习练习,但如果有免费可用的库,很难证明这项费用是合理的。

JRE中提供了制作自签名证书的所有基本组件(签名、X509编码等)。与BC不同,Sun的JCE不提供任何公共调用来签署证书。但是,所有功能都可以在Keytool中使用。您只需从keytool复制代码即可完成此操作。您需要复制的方法是
doSelfCert()

JRE中提供了生成自签名证书的所有基本组件(签名、X509编码等)。与BC不同,Sun的JCE不提供任何公共调用来签署证书。但是,所有功能都可以在Keytool中使用。您只需从keytool复制代码即可完成此操作。您需要复制的方法是
doSelfCert()

,具体取决于您想要做什么(可能还有您对“Sanely”的定义)。正如ZZ Coder指出的,您可以通过复制直接创建自签名证书。但我不相信您可以使用标准JCE创建PKCS10证书请求对象,如果您想要创建标准的CA签名EEC,您可能需要这样做。

取决于您想要做什么(以及您对“Sanely”的定义)。正如ZZ Coder指出的,您可以通过复制直接创建自签名证书。但我不相信您可以使用标准JCE创建PKCS10证书请求对象,如果您想创建标准的CA签名EEC,可能需要这样做。

是的,但不能使用公开文档化的类。我已经记录了这个过程


是的,但不是公开记录的类。我已经记录了这个过程

我喜欢vbence的答案,但我一直得到以下例外:

java.security.cert.CertificateException:主题类类型无效

经过多次尝试,我发现X509CerInfo需要一个X500Name的实例

1 info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(sn));
2 info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(owner));
3 info.set(X509CertInfo.ISSUER, new CertificateIssuerName(owner));
4 info.set(X509CertInfo.KEY, new CertificateX509Key(pair.getPublic()));
因此,第2行和第3行需要更改为

2 info.set(X509CertInfo.SUBJECT, owner);
3 info.set(X509CertInfo.ISSUER, owner);
我喜欢vbence的答案,但我一直得到以下例外:

java.security.cert.CertificateException:主题类类型无效

经过多次尝试,我发现X509CerInfo需要一个X500Name的实例

1 info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(sn));
2 info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(owner));
3 info.set(X509CertInfo.ISSUER, new CertificateIssuerName(owner));
4 info.set(X509CertInfo.KEY, new CertificateX509Key(pair.getPublic()));
因此,第2行和第3行需要更改为

2 info.set(X509CertInfo.SUBJECT, owner);
3 info.set(X509CertInfo.ISSUER, owner);


非常好的小费。使我免于导入令人恐惧(和喜爱)的Bouncycastle库。加油!有没有一种方法不需要打电话到sun.security.x509.*?事实上,它不是您应该使用的东西。如何添加扩展?对于JDK 8,它应该是:info.set(X509CertInfo.SUBJECT,owner);信息集(X509CertInfo.ISSUER,所有者);这里提到的改变@AxelFontaine是一个非常好的提示。使我免于导入令人恐惧(和喜爱)的Bouncycastle库。加油!有没有一种方法不需要打电话到sun.security.x509.*?事实上,它不是您应该使用的东西。如何添加扩展?对于JDK 8,它应该是:info.set(X509CertInfo.SUBJECT,owner);信息集(X509CertInfo.ISSUER,所有者);这里描述了阿克塞尔方丹的变化,为什么不?Keytool可以将自签名转换为csr,您只需复制该代码即可。嗯,为什么不呢?Keytool可以将自签名转换为csr,您只需复制该代码即可。不幸的是,Keytool使用
sun.*
类来实现此目的。因此,这不会适用于所有JRE。然而,不幸的是,Keytool使用了
sun.*
类。因此,这不会适用于所有JRE。然而,到2017年,这是否仍然准确?否,截取的代码使用过时的密码(Javadoc中的MD5withRSA或SHA1 WithRSA)来签署证书。相反,我建议使用SHA256 with RSA、SH384 with RSA、SH512 with RSA或SHA256 with ECDSA、SH384 with ECDSA和SH512 with ECDSA,具体取决于您所设计的安全级别。@DanielGartmann不清楚您所说的是什么“代码被剪断”。你的“否”是对之前评论的回答吗?@erickson是的,我显然在回答user674669的问题。我所说的“代码片段”是指下面前两个答案中显示的代码(在包含源代码的灰色区域)。@DanielGartmann评论者问我的答案在2017年是否仍然正确。我想是的;您不能在开箱即用的情况下签署证书,您必须自己构建证书。那么,如果你说这是错误的,你能解释一下原因吗?但你的第二句话就说明了这一点