使用Java创建SSL连接

时间:2011-06-21 21:24:29

标签: java sockets ssl jce

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

现在我正在尝试编写一个将从SSLServerSocket接收数据的Java服务器,现在只需将其打印出来。我最终希望这些数据来自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

我尝试了谷歌的例外,大部分内容都是一个教程,描述了如何创建一个密钥库(我的印象是我已经拥有)。我将继续筛选这些搜索结果。

谢谢!

1 个答案:

答案 0 :(得分:3)

当您创建这样的密钥库时,您只在证书库中放置证书:

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

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

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

如果您使用OpenSSL创建的证书是自签名的(或者来自您自己使用的迷你CA,例如使用CA.pl),那么进行转换可能不值得。您也可以直接使用keytool生成自签名证书。请参阅官方keytool文档中的"Generating Your Key Pair" example

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,如果它仅用于本地测试)。 (我认为Java 7提供的keytool也支持主题替代名称,这会更好。)

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

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

openssl pkcs12 -export -in cert.pem -inkey key.pem -out creds.p12