Générer X509Certificate à l'aide de bouncycastle X509v3CertificateBuilder
Je suis d'essayer de port JXTA à exécuter sur App Engine. Étant donné que la BouncyCastle "BC" fournisseur n'est pas encore pris en charge sur App Engine, j'ai du port de l'existant JXTA le code pour générer un X509Certificate à l'aide de la liste blanche des classes. Ma connaissance de la Crypto est minime et je ne suis pas certaine que ce que je suis en train d'accomplir est encore possible. Voici le code d'origine de PSEUtils.java à partir de la JXTA projet:
Il y a une classe d'assistance qui contient le java.de sécurité.cert.X509Certificate:
public static class IssuerInfo {
public X509Certificate cert; //subject Cert
public PrivateKey subjectPkey; //subject private key
public X509Certificate issuer; //issuer Cert
public PrivateKey issuerPkey; //issuer private key
}
Dans la méthode:
public static IssuerInfo genCert(X500Principal subject, KeyPair keypair, IssuerInfo issuerinfo)
Je suis de passage dans le sujet:
new X500Principal("CN="+useCN)
paire de clés que (à partir du code original):
KeyPairGenerator g = KeyPairGenerator.getInstance("RSA");
g.initialize(1024, UTILS.srng);
KeyPair keypair = g.generateKeyPair();
et la jxta codé IssuerInfo.
Maintenant, puisque je ne peux pas tirer dans le bouncycastle.la jce de paquets, j'ai dû enlever le X509Principal et X509V3CertificateGenerator code JXTA usages et de tenter de la remplacer avec une mise en œuvre conforme à la FGA restrictions. Voici ce que j'ai actuellement pour la genCert méthode à l'aide de org.bouncycastle.X509.X509v3CertificateBuilder.
SubjectPublicKeyInfo subPubKeyInfo = SubjectPublicKeyInfo.getInstance(keypair.getPublic().getEncoded());
X509v3CertificateBuilder v3CertGen = new X509v3CertificateBuilder(
new X500Name(issuer.getName()),
BigInteger.ONE,
today, until,
new X500Name(subject.getName()),
subPubKeyInfo);
Le problème est que je n'arrive pas keypair.getPublic().getEncoded()
de travailler avec le SubjectPublicKeyInfo.getInstance()
méthode. Jette java.lang.IllegalArgumentException: objet inconnu dans l'usine: [B
Clé publique semble être renseigné lors de l'inspection:
Sun RSA public key, 1024 bits
modulus: 117521430893506212334140912845641570591161279468597426442875306202350445904550279678434051874985419676760802566018092318362676224355315431299979507080364677679613392086245588766565617009250512996843008784370448997729071786062596049780632058501646041736216482596596901215941577208285499619376322050871534546271
public exponent: 65537
J'ai trouvé la suite DONC, le lien qui démontre le présent code de travail:
Signe de la RSE à l'aide de Château Gonflable
Ma tentative de convertir genCert est en dessous, mais pour une raison quelconque, je ne peux pas obtenir au-delà de la création de SubjectPublicKeyInfo de la encodée à clé publique?
Toute aide est grandement appréciée.
public static IssuerInfo genCert(X500Principal subject, KeyPair keypair, IssuerInfo issuerinfo) {
IssuerInfo info = new IssuerInfo();
try {
//set up issuer
PrivateKey signer;
X500Principal issuer;
if (null == issuerinfo) { //self-signed root cert
signer = keypair.getPrivate();
issuer = new X500Principal(subject.getEncoded());
} else { //issuer signed service sert
signer = issuerinfo.subjectPkey;
X500Principal issuer_subject = issuerinfo.cert.getSubjectX500Principal();
issuer = new X500Principal(issuer_subject.getEncoded());
}
//set validity 10 years from today
Date today = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(today);
cal.add(Calendar.YEAR, 10);
Date until = cal.getTime();
SubjectPublicKeyInfo subPubKeyInfo = SubjectPublicKeyInfo.getInstance(keypair.getPublic().getEncoded());
//**Can't get here so i'm not sure if the rest of this works?**
AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder().find("SHA1withRSA");
AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);
RSAPrivateCrtKeyParameters cps = (RSAPrivateCrtKeyParameters) keypair.getPrivate();
ContentSigner sigGen = new BcRSAContentSignerBuilder(sigAlgId, digAlgId).build(cps);
X509CertificateHolder certHolder = v3CertGen.build(sigGen);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
//Read user Certificate
InputStream is1 = new ByteArrayInputStream(certHolder.getEncoded());
X509Certificate eeCert = (X509Certificate) cf.generateCertificate(is1);
is1.close();
Vous devez vous connecter pour publier un commentaire.
J'ai été en mesure d'accomplir ceci avec l'aide de René Mayrhofer code fourni ici: lien.
X509CertificateGenerator.java
J'ai fourni mes de mise en œuvre qui doit être testé dans un environnement de test, mais il semble fonctionner: