繁体   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