簡體   English   中英

Java證書/密鑰庫異常

[英]Java Certificate / Keystore Exceptions

嘗試在Java SOAP客戶端中實現密鑰庫以訪問WS時,出現異常:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

我們確定這是因為CA(DigiSign)不在Java受信任的CA中。 最初,我使用了兩位高級工程師頒發給我的證書,並通過keytool將它們結合在一起:

keytool.exe -v -alias digicert_3 -import -file DigiCertHighAssuranceCA-3.pem -keystore mykeystore.jks
keytool.exe -v -alias digicert_root -import -file DigiCertHighAssuranceEVRootCA.pem -keystore mykeystore.jks

然后,我將keystore.jks文件復制到src / main / resources下的Eclipse項目中。

但是,現在我得到了其他例外。 我嘗試了多種將證書加載到密鑰庫中的方法,但遇到了各種異常。

這是我嘗試實現密鑰庫的不同方法(一次實現一種):

//Load keystore from project resource
KeyStore keyStore = KeyStore.getInstance("JKS");

//Keystore created using two individual PEM certs
//Exception: java.io.IOException: Keystore was tampered with, or password was incorrect
keyStore.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("mykeystore_PEM.jks"), "password".toCharArray());

//Keystore created with two certs combined into a single file
//Exception: java.io.IOException: Keystore was tampered with, or password was incorrect
keyStore.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("mykeystore_Com.jks"), "password".toCharArray());

//Keystore created using two individual DER cert calls
//Exception: java.io.IOException: DerInputStream.getLength(): lengthTag=127, too big.
keyStore.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("mykeystore_DER.jks"), "password".toCharArray());

//Keystore created using InstallCert
//Exception: java.security.cert.CertificateParsingException: java.io.IOException: insufficient data
keyStore.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("jssecacerts"), "changeit".toCharArray());

TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustFactory.init(keyStore);
TrustManager[] trustManagers = trustFactory.getTrustManagers();
tlsParams.setTrustManagers(trustManagers);
conduit.setTlsClientParameters(tlsParams);
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(36000);
httpClientPolicy.setAllowChunking(false);
httpClientPolicy.setReceiveTimeout(32000);
conduit.setClient(httpClientPolicy);

1和2。)我已經驗證並仔細檢查了密碼,所以我不知道為什么前兩個密碼失敗。

3.)關於長度的第三個例外,我讀到END CERTIFICATE行之后的數據通常是一個問題。 我試過后使用單個空白行(給出“太大”異常)或最后一行作為END CERTIFICATE行(給出其他異常)。

4.)從此處運行InstallCert類,系統提示我獲取一個證書,該證書顯示在密鑰庫中。

知道為什么我的密鑰庫無法正常工作嗎? Java代碼是否有問題,或者證書/密鑰庫生成不正確?

過去,我在使用ssl,java和keystore時也遇到了一些麻煩,並使用此類來將證書從某些服務器導入到keystore中:
http://wiki.openkm.com/images/a/a0/InstallCert.java
https://code.google.com/p/java-use-examples/source/browse/trunk/src/com/aw/ad/util/InstallCert.java

可以在Internet上的某些站點上使用。

密鑰庫資源管理器(用於Windows)也是導入證書的好工具:
http://keystore-explorer.sourceforge.net/

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM