我想将EmailAddress添加到我的PKCS10 CSR:
.addRDN( BCStrictStyle.EmailAddress, emailAddr )
为什么Bouncy / Spongey规范会说以下内容?:
org.spongycastle.asn1.x500.style.BCStyle public static final org.spongycastle.asn1.ASN1ObjectIdentifier EmailAddress电子邮件地址 (RSA PKCS#9扩展名) - IA5String。注意:如果你想要超级 正统的,不要用这个!它不应该在这里。
有什么东西"错误" w /将EmailAddr添加到x500name作为CSR的一部分吗?
如果有,那我该如何正确地将EmailAddr添加到我的CSR?
答案 0 :(得分:1)
警告的原因是最新的X.509规范要求将邮件地址放在subjectAlternativeName扩展名中。
引自RFC5280:
存在电子邮件地址的旧版实现 嵌入主题专有名称作为emailAddress 属性[RFC2985]。 emailAddress的属性值是类型 IA5String允许包含字符'@',这不是一部分 PrintableString字符集。 emailAddress属性值 不区分大小写(例如,“subscriber@example.com”与 “SUBSCRIBER@EXAMPLE.COM”)。
符合使用生成新证书的实现 电子邮件地址必须在主题中使用rfc822Name 替代名称扩展(第4.2.1.6节)来描述这样的 身份。同时包含emailAddress属性 用于支持遗留实现的主题专有名称是 弃用但允许。
当您创建CSR而不是证书时,我不会担心它。无论如何,很少有CA可以(或者更愿意)处理CSR中的扩展。
答案 1 :(得分:0)
扩展Omikron的答案:我为自己的规范创建了一个x500名称:
static private X500Name getX500Name(){
final String testPostalCode = "94602-4105";
return new X500NameBuilder( BCStrictStyle.INSTANCE )
.addRDN( BCStyle.CN, Alias )
//.addRDN( BCStrictStyle.EmailAddress, emailAddr )
.addRDN( BCStrictStyle.POSTAL_CODE, testPostalCode )
.addRDN( BCStrictStyle.SERIALNUMBER, deviceID )
.addRDN( BCStrictStyle.C, deviceID )
.build();
}//getX500Name
我将电子邮件地址添加到扩展程序中:
//https://msdn.microsoft.com/en-us/library/windows/desktop/aa376502(v=vs.85).aspx
// http://stackoverflow.com/questions/20532912/generating-the-csr-using-bouncycastle-api
// http://www.bouncycastle.org/wiki/display/JA1/X.509+Public+Key+Certificate+and+Certification+Request+Generation#X.509PublicKeyCertificateandCertificationRequestGeneration-SubjectAlternativeName
static public PKCS10CertificationRequest genCSR(){
KeyPair pair = getKeyPair();
PKCS10CertificationRequestBuilder p10Builder;
ContentSigner signer;
try{
GeneralNames subjectAltName = new GeneralNames(
new GeneralName(GeneralName.rfc822Name, emailAddr));
PublicKey publicKey = getKeyStore().getCertificate( certKeyAlias ).getPublicKey();
p10Builder = new JcaPKCS10CertificationRequestBuilder(
getX500Name()
, publicKey )
.addAttribute(Extension.subjectAlternativeName, new DEROctetString( subjectAltName) )
.setLeaveOffEmptyAttributes(true)
;
JcaContentSignerBuilder csBuilder = new JcaContentSignerBuilder( SHA256withECDSA );
signer = csBuilder.build( pair.getPrivate() );
}catch ( KeyStoreException | OperatorCreationException| IOException X ){
pkException CRYPTOERR = new pkException( pkErrCode.CRYPTO ).set( "registrations err", X );
mLog.error( CRYPTOERR.toString() );
throw CRYPTOERR;
}
PKCS10CertificationRequest CSR = p10Builder.build( signer );
return CSR;
}//genCSR