1

我环顾四周,没有看到任何完全回答了我想要的问题,但如果这是重复的,请指出我的问题,我将继续前进。

现在我正在尝试编写一个 Java 服务器,它将接收来自的数据SSLServerSocket,现在,只需将其打印出来。我最终希望这些数据来自 Android,但现在SSLException它甚至在开始监听数据之前就抛出了一个。

代码:

System.setProperty("javax.net.ssl.keyStore","C:\\ProgramFiles\\jre6\\bin\\server.jks");
System.setProperty("javax.net.ssl.keyStorePassword","password");
SSLServerSocketFactory factory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
ServerSocket ss = factory.createServerSocket(6543);
Socket s = ss.accept();

之后有更多代码来处理它,但它被挂断并在那里抛出异常,所以我不确定发布它是否会有所帮助,但如果有的话,只需评论它。

我按照 Ubuntu 上的 openssl 教程创建了证书,并将其传输过来并使用以下命令创建了我的密钥库:

keytool -import -file "C:\Documents and Settings\matt\Desktop\server.crt" -keystore server.jks

我可以很容易地承认,我并不完全理解其中很大一部分是如何工作的,因此我们将不胜感激。另外,我想我将把它放在这个问题的范围之外,因为我觉得这本身就是一个很大的问题,但我也想了解如何在可能的情况下连接客户端。很抱歉给您带来所有麻烦,并提前感谢您提供的所有帮助。

编辑:

我遵循的教程在这里: http ://www.akadia.com/services/ssh_test_certificate.html

再次感谢!

编辑:

抛出的异常是:

javax.net.ssl.SSLException: No available certificate or key corresponds to the SSL cipher suites which are enabled

我试图用谷歌搜索异常,大多数内容都是描述如何创建密钥库的教程(我的印象是我已经拥有了)。我将继续筛选这些搜索结果。

谢谢!

4

1 回答 1

3

当您像这样创建密钥库时,您只需在密钥库中放置一个证书:

keytool -import -file "server.crt" -keystore server.jks

您需要的是拥有私钥+证书。

如果您已经拥有证书颁发机构颁发的证书,您可以从其他地方导入它们,或者如果它是用于有限用途的,您可以创建一个自签名证书。

如果您使用 OpenSSL 创建的证书是自签名的(或来自迷你 CA 供您自己使用,例如使用CA.pl),那么进行转换可能不值得麻烦。您不妨直接使用keytool. 请参阅官方文档中的“生成您的密钥对”示例:keytool

keytool -genkeypair -dname "cn=Mark Jones, ou=JavaSoft, o=Sun, c=US"
     -alias business -keypass kpi135 -keystore /working/mykeystore
     -storepass ab987c -validity 180

确保您使用cn=your.fqdn.host.name(或者cn=localhost如果它仅用于本地测试)。(我认为keytoolJava 7 提供的还支持主题替代名称,这会更好。)

如果您已经有想要以 PKCS#12 格式(通常是文件)重复使用的私钥 + 证书,则可以使用此问题.p12中描述的方法将其导入。

如果您使用 OpenSSL 生成的内容是 PEM 格式,则可能更容易将它们与 OpenSSL 捆绑在 PKCS#12 文件中,然后按上述方式导入它们。这可以通过以下方式完成:

openssl pkcs12 -export -in cert.pem -inkey key.pem -out creds.p12
于 2011-06-21T21:48:27.750 回答