我完全没有使用 SSL 的经验。我创建了一个非常简单的客户端服务器,并且可以使用我的客户端成功地从服务器发送和检索文件。我通过 keytool 命令行生成了一个带有自签名 X509 证书的 keystore ,并将其存储在我的服务器目录中。
虽然我有点困惑,因为我最初使用 http://stilius.net/java/java_ssl.php 创建了我的服务器作为指南,但无法正常工作,我正在使用
System.setProperty("javax.net.ssl.keyStore", jksFilepath);
System.setProperty("javax.net.ssl.keyStorePassword", jkspass);
将我的 keystore 与服务器链接起来。每当我尝试检索文件时,我都会得到 Java SSLHandshakeException“没有共同的密码套件”。
然而,当我现在使用与以下代码相同的代码时:http://www.java2s.com/Tutorial/Java/0490__Security/SSLContextandKeymanager.htm 设置我的服务器,它工作得很好。
此外,第二个指南只使用 ServerSocket 而不是 SSLSocket - 我应该使用哪个?当我运行服务器并检索文件时,在两者之间切换似乎没有任何改变。
最佳答案
检查这个 Java SSLHandshakeException "no cipher suites in common"可能重复您的问题
在第二个示例链接中,SSLContext 和 KeyManager
被初始化。在第一个示例中,它们不是。
如果你想让你的 keystore 被用作 keystore ,你需要加载它并用它初始化一个 KeyManagerFactory:
这是第二个例子的代码。 SSLContext
由 KeyManagers
context = SSLContext.getInstance("TLS");
kmf = KeyManagerFactory.getInstance("SunX509");
FileInputStream fin = new FileInputStream(storename);
ks = KeyStore.getInstance("JKS");
ks.load(fin, storepass);
context.init(kmf.getKeyManagers(), null, null);
在第一个例子中创建了一个默认的 SSLSocketFactory
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocketFactory.getDefault()
调用 SSLContext.getDefault()
创建默认上下文(没有您需要的参数)
关于Java - SSL 服务器创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37443735/