Java编程生成CSR时添加SAN名称的实现问题咨询
关于Java生成CSR添加SAN字段的问题解答
问题1:当前添加SAN名称的实现是否正确?
不正确。你当前创建GeneralName的写法不符合SAN字段的规范:
SAN的每个条目必须明确指定类型(比如DNS域名、IP地址、邮箱等),直接传入new DerValue("b")没有声明类型,最终生成的SAN字段是无效的,CA机构无法正常识别。
正确的GeneralName构造方式示例:
GeneralNames generalNames = new GeneralNames(); // 添加DNS类型的SAN generalNames.add(new GeneralName(GeneralName.dNSName, "journaldev.com")); generalNames.add(new GeneralName(GeneralName.dNSName, "www.journaldev.com")); // 如需添加IP类型的SAN,可使用:new GeneralName(GeneralName.iPAddress, "192.168.1.1")
问题2:CertificateExtensions对象的使用方法
你之前的理解存在误区:X500Name仅用来存储证书主体的DN信息(国家、省份、城市、组织、通用名等),不需要也不能传入扩展信息。扩展需要封装为PKCS#10的扩展请求属性,传入PKCS10的签名方法中。
具体实现步骤:
- 首先补充导入依赖类:
import sun.security.pkcs.PKCS9;
- 将构造好的
CertificateExtensions封装为PKCS10属性:
CertificateExtensions ext = new CertificateExtensions(); ext.set(SubjectAlternativeNameExtension.NAME, new SubjectAlternativeNameExtension(generalNames)); // 封装为PKCS#10扩展请求属性 PKCS10.Attribute[] attrs = new PKCS10.Attribute[1]; attrs[0] = new PKCS10.Attribute(PKCS9.OID_EXTENSION_REQUEST, new DerValue(ext.getEncoded()));
- 替换原有
encodeAndSign调用,传入扩展属性:
// 原来的调用:pkcs10.encodeAndSign(x500Name, signature); // 修改为传入属性的重载方法 pkcs10.encodeAndSign(x500Name, attrs, signature);
额外注意事项
- 你当前使用的
sun.security.*属于JDK内部非公开API,不同JDK版本的实现可能存在差异,兼容性较差,生产环境建议使用BouncyCastle这类公开的加密库实现CSR生成逻辑。 - 签名算法
MD5WithRSA的安全性极低,已经被业界淘汰,建议替换为SHA256WithRSA。
内容的提问来源于stack exchange,提问作者Neeraj
相关产品推荐
相关产品推荐

