JAVA-使用SSL外部证书保护套接字服务器
我有一个web应用程序,它在端口443上由SSL证书(来自GoDaddy)保护 现在,我还需要保护一个TCP端口,套接字服务器应该在其中侦听 我想使用我已经拥有的证书(我应该吗?) 因此,我以这种方式使用openssl将crt文件和私钥导入密钥库JAVA-使用SSL外部证书保护套接字服务器,java,ssl,serversocket,Java,Ssl,Serversocket,我有一个web应用程序,它在端口443上由SSL证书(来自GoDaddy)保护 现在,我还需要保护一个TCP端口,套接字服务器应该在其中侦听 我想使用我已经拥有的证书(我应该吗?) 因此,我以这种方式使用openssl将crt文件和私钥导入密钥库 openssl pkcs12 -export -in mycert.crt -inkey mykey.key -out keystore.jks 如果我做了keytool-list-keystore keystore.jks我会在里面看到我的证书 现
openssl pkcs12 -export -in mycert.crt -inkey mykey.key -out keystore.jks
如果我做了keytool-list-keystore keystore.jks
我会在里面看到我的证书
现在,在我的SocketServer类中,我执行以下操作
final KeyStore keyStore = KeyStore.getInstance(new File("/home/ubuntu/certificates/keystore.jks"), password);
final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("NewSunX509");
keyManagerFactory.init(keyStore, password);
final SSLContext context = SSLContext.getInstance("TLS");//"SSL" "TLS"
context.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
SSLServerSocketFactory sslssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
serverSocket = (SSLServerSocket) sslssf.createServerSocket(port);
现在我想检查一下
如果我尝试在我的web应用程序上使用标准443端口
openssl s_client -connect host:443 -showcerts -servername www.host.com
我得到了关于证书的所有信息。
如果我转到我的套接字端口
openssl s_client -connect host:9000 -showcerts -servername www.host.com
我明白了
但如果我尝试从主机本身连接
openssl s_client -connect localhost:9000 -showcerts -servername www.host.com
我明白了
CONNECTED(00000003)
139667580962456:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:769:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 334 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1589219636
Timeout : 300 (sec)
Verify return code: 0 (ok)
看起来没有考虑任何证书
编辑
当我尝试连接openssl时,在应用程序日志中我看到了这个异常
javax.net.ssl.SSLHandshakeException: no cipher suites in common
该文件实际上是一个PKCS12(或P12)而不是一个JKS,但名称只会让人困惑;如果
keytool
在没有-storetype
的情况下工作,则必须使用java 8或更高版本,是的,这应该可以正常工作。你的应用程序有日志吗?如果有,它会说什么?如果没有,您能否捕获异常并获得回溯?如果没有其他内容,请设置系统属性javax.net.debug=ssl
,然后查看上面的内容。我使用的是java11。我在应用程序上添加了我在日志中读到的内容,当我尝试在Common中连接无密码套件时,我第一次没有注意到,但您的代码实际上没有使用此密钥库。不要使用SSLServerSocketFactory.getDefault()
而使用context.getServerSocketFactory()
.Thansk mate!!!这才是真正的答案,你救了我一周。如果你写一个答案,我会接受它的文件实际上是一个PKCS12(或P12)不是一个JKS,但名称只是混淆的人;如果keytool
在没有-storetype
的情况下工作,则必须使用java 8或更高版本,是的,这应该可以正常工作。你的应用程序有日志吗?如果有,它会说什么?如果没有,您能否捕获异常并获得回溯?如果没有其他内容,请设置系统属性javax.net.debug=ssl
,然后查看上面的内容。我使用的是java11。我在应用程序上添加了我在日志中读到的内容,当我尝试在Common中连接无密码套件时,我第一次没有注意到,但您的代码实际上没有使用此密钥库。不要使用SSLServerSocketFactory.getDefault()
而使用context.getServerSocketFactory()
.Thansk mate!!!这才是真正的答案,你救了我一周。如果你写一个答案,我会接受的
javax.net.ssl.SSLHandshakeException: no cipher suites in common