2013-08-29 50 views

回答

31

確實沒有辦法生成密鑰庫 文件並導入CA證書?

有辦法做到這一點沒有一個密鑰存儲文件,但因爲你必須加載要信任這樣或那樣的CA證書,你就必須加載一個文件或資源莫名其妙。 (您當然也可以實現您自己的TrustManager,它可以讓所有呼叫使用Certification Path API,根本不使用KeyStore API,但這隻會增加代碼的複雜性,而不會減少代碼的複雜性。還需要了解Java PKI Programmer's Guide才能正確執行此操作。)

如果您確實不想使用密鑰存儲文件,則可以在內存中使用KeyStore API並直接加載證書。

東西沿着這些路線應該工作(未測試):

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); 

(記住,關閉一切,並處理異常)

是否加載證書這樣或證書加載到一個類似KeyStore實例從一個keystore文件更方便是由您來決定的。

+4

對於任何人都會遇到這個答案,一定要使用導入'javax.net.ssl.TrustManagerFactory'和不'com.sun.net.ssl.TrustManagerFactory';後者現在已被棄用。乾杯。 –

+3

@MattClark通常,您不應直接導入任何'com.sun。*'或'sun。*'包。 – Bruno

+0

在我的情況下,證書是由用戶添加(通過設置),並以Base64字符串的形式到達:java.io.InputStream is = new java.io.ByteArrayInputStream(java.util.Base64.getDecoder()。decode(cert ));'像魅力一樣工作。謝謝! – mvreijn

相關問題