我正在尝试构建一个使用SSLSocket交换数据的简单客户端/服务器系统。 (JavaSE 6) 服务器必须有自己的证书,客户端不需要证书。
我从这开始 http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CreateKeystore 生成服务器密钥和自签名证书。 总结一下:
Create a new keystore and self-signed certificate with corresponding public/private keys.
keytool -genkeypair -alias mytest -keyalg RSA -validity 7 -keystore /scratch/stores/server.jks
Export and examine the self-signed certificate.
keytool -export -alias mytest -keystore /scratch/stores/server.jks -rfc -file server.cer
Import the certificate into a new truststore.
keytool -import -alias mytest -file server.cer -keystore /scratch/stores/client.jks
然后在我的服务器代码中
System.setProperty("javax.net.ssl.keyStore", "/scratch/stores/server.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "123456");
SSLServerSocketFactory sf = sslContext.getServerSocketFactory();
SSLServerSocket sslServerSocket = (SSLServerSocket)sf.createServerSocket( port );
Socket s = sslServerSocket.accept();
我基本上忽略了一点,因为我得到了一个“javax.net.ssl.SSLException:没有可用的证书或密钥对应于启用的SSL密码套件。”当我尝试运行服务器时。
证书可能有问题吗?在keytool中使用-validity时,证书会自我签名,所以如果我没有错,它应该可以工作。
阅读文档似乎设置属性“javax.net.ssl.keyStore”足以使SSLContext正确设置。有什么建议吗?
答案 0 :(得分:1)
我搞砸了一些事情,完整的解决方案在这里:https://forums.oracle.com/forums/thread.jspa?threadID=1531716