0

我正在尝试构建一个使用 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 正确设置。有什么建议吗?

4

1 回答 1

1

我把事情搞砸了,完整的解决方案在这里:https ://forums.oracle.com/forums/thread.jspa?threadID=1531716

于 2010-07-09T12:20:31.770 回答