2011-06-21 71 views
1

我环顾四周,没有看到任何问题完全解答了我想要的问题,但如果这是重复的,请将问题指向我,然后我将继续前进。使用Java创建SSL连接

现在我正试图编写一个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 

我想谷歌的例外,大多数东西都描述了如何创建一个密钥(这我的印象是一个教程,我已经有)。我将继续筛选这些搜索结果。

谢谢!

+0

可以运行[您套接字对象] .getEnabledCipherSuites()和[您套接字对象] .getSupportedCipherSuites - 然后粘贴输出在你的问题(与你的证书是密码一起创建 - 例如RC4-128等)? – jefflunt

回答

3

当您创建这样一个密钥,你只把证书在您的密钥库:

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

你需要的是有一个私钥+证书。

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

如果您使用OpenSSL创建的证书是自签名的(或者来自您自己使用的迷你CA,例如CA.pl),那么转换可能不值得。您也可以直接使用keytool生成自签名证书。见"Generating Your Key Pair" example官方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如果它仅用于本地测试)。 (我认为随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 
+0

谢谢,我将致力于实施这些。看起来这可能会涵盖我需要的一切。 – Matt

+0

我忘记说了:您不一定需要将PKCS#12文件转换为JKS格式,因为它可以在Java中使用:如果这更方便,可以直接使用它们的PKCS12存储类型(请参阅'javax.net.ssl.keyStoreType')。 – Bruno