我正试图通过Java中的SSL套接字从客户端连接到服务器。客户端接收握手失败,服务器端没有共同的密码套件(www)。
服务器配置为SSL Tomcat 9,这里是连接器:
<Connector SSLEnabled="true" acceptCount="100" clientAuth="false"
disableUploadTimeout="true" enableLookups="false" maxThreads="25"
port="8443" keystoreFile="C:/Users/xxx/.keystore" keystorePass="xxx"
keystoreType="PKCS12"
protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https"
secure="true" sslProtocol="TLS" />
客户端是Java项目。密钥工具中双方都有证书。证书已从key工具导出,并在客户端通过key工具导入。因此,在客户端和服务器端,我们导入了server.cer.Tomcat在端口8443上启动,套接字使用端口443。
我尝试了什么?-在代码设置密码套件中设置协议-更改端口-从8080和8443端口启动Tomcat
服务器:
void mySSLServerSocket(int port) throws IOException {
SSLServerSocketFactory sslServerSocketFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket sslServerSocket = (SSLServerSocket) sslServerSocketFactory.createServerSocket(port);
sslServerSocket.setEnabledProtocols(new String[] {"TLSv1.2"});
sslServerSocket.setEnabledCipherSuites(new String[] {"TLS_RSA_WITH_AES_256_CBC_SHA"});
SSLSocket socket = (SSLSocket) sslServerSocket.accept();
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();
while(true) {
int orderNumber = in.read();
System.out.println("order number readed: " + orderNumber);
}
}
客户:
void mySocket(String ip, int port) throws IOException {
SSLSocketFactory sslSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslSocket = (SSLSocket) sslSocketFactory.createSocket(ip, port);
sslSocket.setEnabledProtocols(new String[] {"TLSv1.2"});
sslSocket.setEnabledCipherSuites( new String[] {"TLS_RSA_WITH_AES_256_CBC_SHA"});
sslSocket.startHandshake();
InputStream in = sslSocket.getInputStream();
OutputStream out = sslSocket.getOutputStream();
out.write(1);
while (in.available() > 0) {
System.out.print(in.read());
}
}
客户端错误:
Exception in thread "main" javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2020)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1127)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379)
at com.company.SocketUtil.mySocket(SocketUtil.java:31)
at com.company.Main.main(Main.java:15)
服务器(错误来自 Web - JSP 页面):
Type Exception Report
Message no cipher suites in common
Description The server encountered an unexpected condition that prevented it from fulfilling the request.
Exception
javax.net.ssl.SSLHandshakeException: no cipher suites in common
java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131)
java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:307)
java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:263)
java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:254)
java.base/sun.security.ssl.ServerHello$T12ServerHelloProducer.chooseCipherSuite(ServerHello.java:460)
java.base/sun.security.ssl.ServerHello$T12ServerHelloProducer.produce(ServerHello.java:295)
java.base/sun.security.ssl.SSLHandshake.produce(SSLHandshake.java:436)
java.base/sun.security.ssl.ClientHello$T12ClientHelloConsumer.consume(ClientHello.java:1102)
java.base/sun.security.ssl.ClientHello$ClientHelloConsumer.onClientHello(ClientHello.java:854)
java.base/sun.security.ssl.ClientHello$ClientHelloConsumer.consume(ClientHello.java:813)
java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392)
java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:443)
java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:421)
java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:177)
java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:164)
java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1180)
java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1091)
java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:402)
java.base/sun.security.ssl.SSLSocketImpl.ensureNegotiated(SSLSocketImpl.java:721)
java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:804)
java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:763)
ServerSocketUtils.mySSLServerSocket(ServerSocketUtils.java:38)
MusicControl.doPost(MusicControl.java:24)
javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Note The full stack trace of the root cause is available in the server logs.
错误说没有密码套件,但我检查了支持的密码,并选择了一个,可用于双方。宣布TSL议定书,仍然没有成功。
我想从客户端连接到服务器,但由于在互联网上找不到任何建议,我不知道下一步该做什么。
我读过一些关于连接所需的私钥的东西。它在哪里?我想,server.cer只有公钥。
当tomcat在8443上运行时,将端口443用于套接字合适吗?也许我应该在某个地方指定这些端口?
您的问题的一部分是关于“证书”的,我认为它代表证书。
你是对的,证书只包含一个由证书颁发机构(CA)签名的公钥。公钥只是非对称密钥对(例如RSA)的公共部分。服务器需要有私钥。否则,它无法解密使用公钥加密的内容,也无法对发送到客户端的内容进行签名。
也就是说,您需要创建一个RSA密钥对,并将其提供给Tomcat。要么让它由知名CA签名(制作证书),要么使用密钥工具生成自签名证书。在第一种情况下,客户端不需要特殊操作,因为java(或浏览器)已经知道知名CA的公钥,这些公钥是验证服务器交付的证书所必需的。如果是自签名证书,您必须在客户端将其作为受信任的证书导入。
问题内容: 尝试获取网页: 获取https://www.fl.ru/:远程错误:握手失败。 如果我尝试获取另一个HTTPS页面-一切正常。 问题答案: 该服务器仅支持一些弱密码: 如果确实必须连接到该服务器,则Go会支持列表中的最后一个密码,但默认情况下不支持。使用新的tls.Config创建一个客户端,并指定所需的密码:
尝试获取网页: 收到https://www.fl.ru/:远程错误:握手失败。 如果我尝试获取另一个HTTPS页面,一切都可以。
请阅读上一篇文章的上下文。这个问题已经解决。重新创建队列并重新连接到rabbitMQ 现在,我正在尝试在rabbitmq服务器和rabbit客户端之间建立启用ssl的连接。我正在使用spring boot和spring cloud bus。没有SSL,一切都会很完美。 用于运行java rabbit客户端 Java 1.8 sping-cloud-starter-bus-amqp= Spring启
问题内容: 我正在连接到以前成功使用过的Web服务,但是现在他们已经更改了主机名并向我发送了两个.pem文件。一个是CA,另一个是我的新客户证书。 (我将Java 1.5,Spring + Spring Web Services与Apache httpclient一起使用,但是我怀疑我的问题是证书,密钥和SSL本身。) 我已经导入了.pem文件以及从Firefox导出到cacerts中的主机的.c
我有一个使用OpenSSL的C客户机,在服务器上的SSL_do_handshake()调用期间,使用服务器端验证失败的证书时,该客户机的测试失败。当应用程序使用TLS 1.2时,服务器上的SSL_do_handshake()故障将在客户端调用SSL_do_handshake()作为故障返回值时报告给客户端。 在将我的应用程序升级到OpenSSL 1.1.1和TLS 1.3时,我注意到验证错误仍在服
我已经能够通过HTTP使用Eureka+ZUUL+Ribbon+Config Server设置并成功验证Spring cloud设置。 然而,当我尝试转移到HTTPS时,单个服务在HTTPS上运行良好,但Eureka客户端发现却失败了。