Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试通过Tomcat进行SSL连接但通过java主测试应用成功连接时,证书错误_Java_Ssl_Tomcat_Sslhandshakeexception - Fatal编程技术网

尝试通过Tomcat进行SSL连接但通过java主测试应用成功连接时,证书错误

尝试通过Tomcat进行SSL连接但通过java主测试应用成功连接时,证书错误,java,ssl,tomcat,sslhandshakeexception,Java,Ssl,Tomcat,Sslhandshakeexception,我有一个java测试应用程序,可以对远程服务器进行Restful SSL连接/调用,但从Tomcat下的servlet运行的相同代码返回Bad_证书错误 在引用我通过System.setProperty指定的密钥库和信任库后,测试应用程序版本成功连接到远程(“javax.net.ssl….?用于文件位置和密码的语句。此测试程序是一个独立的简单类,具有成功建立连接并获得响应的main方法。但是,如果我将此代码移动到在Tomcat上运行的servlet中,我会得到一个”SSLHandshakeExc

我有一个java测试应用程序,可以对远程服务器进行Restful SSL连接/调用,但从Tomcat下的servlet运行的相同代码返回Bad_证书错误

在引用我通过System.setProperty指定的密钥库和信任库后,测试应用程序版本成功连接到远程(“javax.net.ssl….?用于文件位置和密码的语句。此测试程序是一个独立的简单类,具有成功建立连接并获得响应的main方法。但是,如果我将此代码移动到在Tomcat上运行的servlet中,我会得到一个”SSLHandshakeException“Bad_Certificate error.And ssl:all:verbose debug trace没有提供任何帮助,因为它似乎没有进入握手阶段。只有在未设置指向证书的系统属性的情况下,我才能在测试应用程序上重新创建此错误。从Tomcat运行时,似乎正在覆盖设置System.setProperty。我还尝试在web.xml中放置位置,但也没有任何影响

我的代码不容易获得,因为它存在于防火墙后面,不允许我复制任何东西。但我会对任何你想验证的东西进行胖手指

操作系统:Redhat 7.4 雄猫:7.0.76 Java:JDK10.0.2

javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate
java.base/sun.security.ssl.Alerts.getSSLException(Alerts.java 198)
java.base/sun.security.ssl.Alerts.getSSLException(Alerts.java 159)
java.base/sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2046)
java.base/sun.security.ssl.SSLSocketImpl.processInputRecord(SSLSocketImpl.java:1207)
java.base/sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1074)
java.base/sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)
java.base/sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1402)
java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1429)
java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)   
java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:567)
java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1581)
java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1509)
java.base/java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:527)
java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:329)
由于在Tomcat配置文件中向JAVA_OPTS添加了调试,我得到了更多细节。在我昨天提供的stacktrace之前,我现在看到了握手。握手的最后一部分如下所示:

update handshake state: finished
upcoming handshake states: server change_cipher_spec[-1]
upcoming handshake states: server finished [20]
ajp-bio-8009-exec-1, WRITE TLSv1.2 Handshake, length = 32
ajp-bio-8009-exec-1, READ TLSv1.2 Alert, length = 2
ajp-bio-8009-exec-1, RECV TLSv1.2 ALERT: fatal, bad certificate
%%invalidated: [Session-3 TLS_RSA_WITH_AES_128_CBC_SHA]
ajp-bio-8009-exec-1, call closeSocket()

但是我不知道该怎么办。

在servlet中的什么地方进行设置?javax.net.ssl sysprops在首次加载JSSE类时是只读的,如果有使用JSSE的HTTPS连接器(即不是APR,或者在8.5+OpenSSL提供程序中),这将在Tomcat启动时发生,或者如果同一服务器中的任何其他代码使用SSL。而您的独立程序在运行代码之前不会执行任何其他操作。如果您无法让代码尽早运行,请在CATALINA_OPTS或JSSE_OPTS中尝试-Dprop值。或者,不要使用默认上下文,而是创建显式上下文并将其工厂提供给HttpsURLConnection。…@IhorHerasymenko:这不是信任库的问题。信任库很好,因为如果我们的终端没有验证远程设备的证书,那么在远程设备有机会反对我们的证书之前(或者更可能没有证书),握手就会中止在servlet中,我在servlet的启动和初始化时将其放入。自从提交此请求以来,我将其放入Tomcat配置文件“Tomcat.conf”中,并注释掉servlet中的所有设置。在配置文件中,我将它们包括在JAVA_OPTS中。它显然会拾取这两个存储,但仍然会出错。请参阅上面添加的堆栈跟踪详细信息。