13
我需要設置javax.net.ssl.SSLContext
以用於Jersey-Client應用程序。我想要做的就是接受自定義根CA證書的上下文。生成密鑰庫文件和導入CA證書沒有辦法解決嗎?使用帶有CA證書和無密鑰庫的SSLContext
我需要設置javax.net.ssl.SSLContext
以用於Jersey-Client應用程序。我想要做的就是接受自定義根CA證書的上下文。生成密鑰庫文件和導入CA證書沒有辦法解決嗎?使用帶有CA證書和無密鑰庫的SSLContext
確實沒有辦法生成密鑰庫 文件並導入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文件更方便是由您來決定的。
對於任何人都會遇到這個答案,一定要使用導入'javax.net.ssl.TrustManagerFactory'和不'com.sun.net.ssl.TrustManagerFactory';後者現在已被棄用。乾杯。 –
@MattClark通常,您不應直接導入任何'com.sun。*'或'sun。*'包。 – Bruno
在我的情況下,證書是由用戶添加(通過設置),並以Base64字符串的形式到達:java.io.InputStream is = new java.io.ByteArrayInputStream(java.util.Base64.getDecoder()。decode(cert ));'像魅力一樣工作。謝謝! – mvreijn