JAVA-使用SSL外部证书保护套接字服务器

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我会在里面看到我的证书 现

我有一个web应用程序,它在端口443上由SSL证书(来自GoDaddy)保护

现在,我还需要保护一个TCP端口,套接字服务器应该在其中侦听

我想使用我已经拥有的证书(我应该吗?)

因此,我以这种方式使用openssl将crt文件和私钥导入密钥库

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