2012-06-14 8 views
6

W nowej wersji biblioteki Bouncy Castle są zmiany w PKCS10CertificationRequest. W poprzednich wersjach można było uzyskać PublicKey z takiego żądania za pomocą metody getPublicKey() (patrz old doc).Jak zdobyć PublicKey z PKCS10CertificationRequest przy użyciu nowej biblioteki Castle Bouncy?

Ta metoda została odrzucona. Jak mogę zdobyć PublicKey z takiego żądania? Istnieje getSubjectPublicKeyInfo().parsePublicKey(), ale zwraca ASN1Primitive.

Widzę to z SPKAC NetscapeCertRequest Ciągle mogę czytać PublicKey bezpośrednio przez wywołanie getPublicKey().

Odpowiedz

11

Istnieje klasa narzędziowa w głównym pakiecie dostawcy o nazwie PublicKeyFactory. Metoda createKey zwraca wartość, którą rzutujesz na dowolny typ klucza publicznego, np. Potrzebne są

Ponadto, aby stworzyć java.security.PublicKey jeszcze kilka kroków::

SubjectPublicKeyInfo pkInfo = pkcs10CertReq.getSubjectPublicKeyInfo(); 
RSAKeyParameters rsa = (RSAKeyParameters) PublicKeyFactory.createKey(pkInfo); 

EDIT 1

RSAPublicKeySpec rsaSpec = new RSAPublicKeySpec(rsa.getModulus(), rsa.getExponent()); 
KeyFactory kf = KeyFactory.getInstance("RSA"); 
PublicKey rsaPub = kf.generatePublic(rsaSpec); 
+0

Dzięki, ale kiedy próbuję go rzucić, dostałem: 'java.lang.ClassCastException: org.bouncycastle.crypto.params.RSAKeyParameters nie można przesłać do java.security .PublicKey' –

+0

Michal Niklas: Nie, oczywiście, że nie, miałem na myśli rzucić go na odpowiedni rodzaj klucza publicznego Bouncycastle. Dodam kod do konwertowania na klucz publiczny Java w ciągu minuty. –

+0

Działa teraz! Dzięki! –

1

Co na temat korzystania JcaPKCS10CertificationRequest?

JcaPKCS10CertificationRequest jcaPKCS10CertificationRequest = new JcaPKCS10CertificationRequest(pkcs10CertReq); 
PublicKey publicKey = jcaPKCS10CertificationRequest.getPublicKey(); 
+0

Edytuj swoją odpowiedź z wyjaśnieniem. – gsamaras

4

Szukałem w tym samym numerze, a to będzie działać zbyt (z korzyścią, że nie trzeba określać algorytm):

SubjectPublicKeyInfo pkInfo = pkcs10CertReq.getSubjectPublicKeyInfo(); 
JcaPEMKeyConverter converter = new JcaPEMKeyConverter(); 
PublicKey pubKey = converter.getPublicKey(pkInfo); 

Zobacz org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter

0
PKCS10CertificationRequest csr =...;  
PublicKey pk = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(csr.getSubjectPublicKeyInfo().toASN1Primitive().getEncoded())); 

RFC 2986 - PKCS #10: Certification Request Syntax

CertificationRequestInfo :: = SEQUENCE {
wersja INTEGER {v1 (0)} (v1, ...)
przedmiotem Nazwa,
subjectPKInfo subjectPublicKeyInfo {{PKInfoAlgorithms}}
atrybuty [0] Atrybuty} {{CRIAttributes }
}

subjectPublicKeyInfo {algorytmu: IOSet} :: = Sekwencja {
algorytm AlgorithmIdentifier {{IOSet}}
subjectPublicKey ciągu bitów
}

a następnie można zobaczyć dokument java.security.spec.X509EncodedKeySpec

subjectPublicKeyInfo :: = ciąg {
algorytm AlgorithmIdentifier,
subjectPublicKey BIT STRING}

więc będziesz wiedział, że kodowanie tego klucza publicznego to X.509.a następnie zmień go na X509EncodedKeySpec i wygeneruj klucz publiczny przez keyFactory

+0

kod Jamesa K Polka zamienia klucz na kodowanie PKCS # 1 – sjaojya

+0

przy pomocy JcaPKCS10CertificationRequest to dobry pomysł, kod amareno – sjaojya

Powiązane problemy