簡體   English   中英

Android服務器應用程序:SSLHandshakeException(無法找到到請求目標的有效證書路徑)

[英]Android Server-Application: SSLHandshakeException (unable to find valid certification path to requested target)

我正在開發一個Android應用程序,需要使用我自己的SSL證書提供一個SSL安全的TCP-Server。 我有以下文件:

  • server.crt
  • server.key(專用)
  • 我的客戶

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.

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