CSR的x500name中的EmailAddress? BOUNCY 1.54

时间:2016-04-27 20:45:31

标签: bouncycastle csr

我想将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?

2 个答案:

答案 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