![](/img/trans.png)
[英]SSLHandshakeException: PKIX path building failed SunCertPathBuilderException: unable to find valid certification path to requested target
[英]Android Server-Application: SSLHandshakeException (unable to find valid certification path to requested target)
我正在開發一個Android應用程序,需要使用我自己的SSL證書提供一個SSL安全的TCP-Server。 我有以下文件:
1)證書創建:
如此SO中所述,我已經使用命令行工具“ keytool”從mycert.pem創建了BKS-keystore。 放到我的應用程序的/ res / raw文件夾中,雖然我不確定該如何處理私鑰,但是我不需要它來創建證書嗎?
2)服務器代碼:
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
KeyStore.load(context.getResouces().openRawResource(R.raw.mykeystore), "mypass".toCharArray();
String keyalg = KeyManagerFactory.getDefaultAlgorithm();
KeyManagerFactory kmf = KeyManagerFactory.getInstance(keyalg);
kmf.init(keyStore, "mypass".toCharArray());
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), null, null);
SSLServerSocket serverSocket = (SSLServerSocket)sslContext.getServerSocketFactory().createServerSocket(3333);
SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept();
//not shown: create BufferedReader from sslSocket.getInputStream(), while-loop for incoming messages
3)客戶代碼:
我編寫了一個包含以下代碼的虛擬Java客戶端:
SSLSocketFactory sslSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("192.168.2.101", 3333);
sslsocket.startHandshake();
並通過調用來運行它:
java -Djavax.net.ssl.trustStore = keystore -Djavax.net.ssl.trustStorePassword =密碼客戶端傳遞我為服務器創建的相同密鑰庫。
當調用startHandshake()
,客戶端拋出SSLHandshakeException,說“ PKIX路徑構建失敗:sun.security.provider.certpath.SunCertPathBuilderException:無法找到到所請求目標的有效認證路徑”。
對於客戶端和服務器,我使用僅包含server.crt文件的相同密鑰庫。 這可能是問題的根源嗎? 我是否必須使用私鑰(server.key)和/或ca-cert才能使其正常工作? 還有其他建議嗎?
任何幫助是極大的贊賞。 提前致謝。
我想我已經知道了。 這是一件很麻煩的事情,因此,如果有人遇到同樣的問題,這就是解決的方法。 我通過調用以下命令創建了一個新的pkcs12密鑰庫,添加了server.crt,server.key和ca.crt:
openssl pkcs12 -export -in cert.pem -inkey key.pem -out server.p12 -name server -CAfile cacert.pem -caname root
Android僅接受BKS文件,因此我需要進行轉換。 使用工具portecle進行的直接轉換無法將pkcs12轉換為bks,因此需要充氣城堡1.5,但android僅支持充氣城堡1.46。 所以我下載了兩個版本的充氣城堡。 首先,我添加了版本1.5,並將pkcs12轉換為JRE文件(有一個答案)。
然后,我用1.46替換了1.5版,並使用portecle再次將JRE轉換為BKS。
之后,您只需要將密鑰庫添加到Android中的/ res / raw並按照上面的代碼所示使用它即可。
希望這對某人有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.