2013-08-29 11 views

Odpowiedz

31

Czy rzeczywiście jest prawdą, że nie ma sposobu na wygenerowanie pliku magazynu kluczy i zaimportowanie certyfikatu CA?

Istnieje sposób to zrobić bez pliku kluczy, ale ponieważ trzeba by załadować certyfikat CA chcesz zaufać taki czy inny sposób, będziesz musiał załadować pliku lub zasobu jakoś.

(Można również z pewnością wdrożyć własną TrustManager, która wykonuje wszystkie połączenia, aby korzystać z API Ścieżki Certyfikacji, bez korzystania w ogóle z interfejsu API KeyStore, ale to tylko zwiększyłoby złożoność kodu, a nie zmniejszyło go. również trzeba zrozumieć, aby wykonać to poprawnie.)

Jeśli naprawdę nie chcesz pliku magazynu kluczy, możesz użyć interfejsu API KeyStore w pamięci i załadować certyfikat bezpośrednio.

Coś wzdłuż tych linii powinny działać (nie testowane):

InputStream is = new FileInputStream("cacert.crt"); 
// You could get a resource as a stream instead. 

CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
X509Certificate caCert = (X509Certificate)cf.generateCertificate(is); 

TrustManagerFactory tmf = TrustManagerFactory 
    .getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
ks.load(null); // You don't need the KeyStore instance to come from a file. 
ks.setCertificateEntry("caCert", caCert); 

tmf.init(ks); 

SSLContext sslContext = SSLContext.getInstance("TLS"); 
sslContext.init(null, tmf.getTrustManagers(), null); 

(. Pamiętaj, aby zamknąć wszystko i obsługi wyjątków)

czy ładowanie certyfikatowi tędy lub ładowania certyfikatu w podobny KeyStore wystąpienie z pliku magazynu kluczy jest bardziej wygodne, zależy od Ciebie.

+4

Każdemu, kto przejdzie tę odpowiedź, należy użyć importu 'javax.net.ssl.TrustManagerFactory' oraz NOT' com.sun.net.ssl.TrustManagerFactory'; później jest teraz przestarzałe. Twoje zdrowie. –

+3

@MattClark Ogólnie, nie powinieneś importować żadnych pakietów 'com.sun. *' Lub 'sun. *' Bezpośrednio. – Bruno

+0

W moim przypadku certyfikat jest dodawany przez użytkownika (poprzez ustawienia) i pojawia się jako ciąg Base64: 'java.io.InputStream is = new java.io.ByteArrayInputStream (java.util.Base64.getDecoder(). Decode (cert)); 'działa jak urok. Dzięki! – mvreijn

Powiązane problemy