【发布时间】:2014-08-02 10:47:45
【问题描述】:
我正在开发一个 Android 应用程序,需要使用我自己的 SSL 证书提供一个 SSL 安全的 TCP-Server。 我有以下文件:
- server.crt
- server.key(私有)
- my-ca.crt
1) 证书创建:
如本文所述,我使用命令行工具“keytool”从 mycert.pem 创建 BKS 密钥库。把它放在我的应用程序的 /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 才能完成这项工作?还有其他建议吗?
非常感谢任何帮助。提前致谢。
【问题讨论】:
标签: java android ssl ssl-certificate sslhandshakeexception