2012-03-20 18 views

Odpowiedz

4

Wbudowany bibliotek Java X500 są nastawione bardziej na użyciu certyfikatów niż generowania i parsowania certyfikaty. Możesz znaleźć sposób na zrobienie tego, co chcesz, ale prawie na pewno będzie brudny i zabezpieczony API (sun.security.*).

Proponuję dołączyć bibliotekę Zamku nadmuchiwanego (licencja Apache). Ma klasę o nazwie X509V3CertificateGenerator, której można użyć do ustawienia pól certyfikatu (wystawcy, tematu, daty wygaśnięcia itp.).

Powinieneś być w stanie uzyskać ciąg PEM z niego przy użyciu klasy PEMWriter.

+5

Należy zauważyć, że 'X509V3CertificateGenerator' został przestarzały (przynajmniej w Bouncy Castle 1.47). Sugerują użycie 'X509v3CertificateBuilder' (nie w' bcprov', ale w słoiku 'bcpkix'). – martijno

+0

Teraz jest w słoiku 'bcmail'nym – KeksArmee

+0

@KeksArmee: nadal jest w' bcpkix'. – jackyalcine

3

Aby dodać do rozwiązania podanego przez martijno,

Zamiast pisać własne treści podpisującego, JCAContentSigner mogą być stosowane w celu uniknięcia mapowania do AlgorithmIdentifier (tj OID).

JcaContentSignerBuilder przyjmuje nazwy algorytmów zgodnie z definicją here.

X509v3CertificateBuilder certBuilder = new X509v3CertificateBuilder(issuer, serialNumber, startDate, expiryDate, subject, SubjectPublicKeyInfo.getInstance(keyPair.getPublic().getEncoded())); 
JcaContentSignerBuilder builder = new JcaContentSignerBuilder("SHA256withRSA"); 
ContentSigner signer = builder.build(keyPair.getPrivate()); 

byte[] certBytes = certBuilder.build(signer).getEncoded(); 
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); 
X509Certificate certificate = (X509Certificate)certificateFactory.generateCertificate(new ByteArrayInputStream(certBytes)); 
+0

Czy mam rację, jeśli to nie jest samopodpisany certyfikat i po prostu zastępuję klucz prywatny kluczem prywatnym urzędu certyfikacji? – maxbit89

Powiązane problemy