我环顾四周,没有看到任何完全回答我想要的问题,但如果这是重复的话,请指出我的问题,我将会继续前进。
现在我正在尝试编写一个将从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
我尝试了谷歌的例外,大部分内容都是一个教程,描述了如何创建一个密钥库(我的印象是我已经拥有)。我将继续筛选这些搜索结果。
谢谢!
答案 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