To expand on Omikron's answer: I create an x500name for our own spec's:
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
and I put the email addr into the extension:
//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