当前位置: 首页 > 面试题库 >

Java拒绝浏览器接受的证书

禄光霁
2023-03-14
问题内容

我在Wildfly 9中配置有效的证书(非自签名!)时遇到了麻烦。我在Wildfly中配置了HTTPS连接器:

            <https-listener name="https" socket-binding="https" security-realm="UndertowRealm" />

安全领域:

        <security-realm name="UndertowRealm">
          <server-identities>
            <ssl>
              <keystore path="domain.p12" relative-to="jboss.server.config.dir" keystore-password="password"
                alias="appcert"  />
            </ssl>
          </server-identities>
        </security-realm>

并使用以下命令生成密钥库:

openssl pkcs12-导出-in domain.crt -inkey domain.key -out domain.p12 -name appcert -CAfile cafile.crt -caname root

现在,当我在浏览器中打开应用程序时,一切正常。浏览器将证书识别为有效证书,而不会提示出现自签名证书中的异常。

但是,当我尝试通过SSLPoke.java连接到相同的URL时,出现以下异常:

javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到到请求目标的有效证书路径
    在sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    在sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
    在sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
    在sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
    在sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1509)
    在sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
    在sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
    在sun.security.ssl.Handshaker.process_record(Handshaker.java:914)
    在sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
    在sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
    在sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:747)
    在sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)
    在sun.security.ssl.AppOutputStream.write(AppOutputStream.java:138)
    在SSLPoke.main(SSLPoke.java:26)
引起原因:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到到请求目标的有效证书路径
    在sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
    在sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
    在sun.security.validator.Validator.validate(Validator.java:260)
    在sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
    在sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
    在sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
    在sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491)
    ...另外9个
引起原因:sun.security.provider.certpath.SunCertPathBuilderException:无法找到到请求目标的有效证书路径
    在sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
    在sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
    在java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
    在sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
    ...另外15个

如果我在客户端中导入证书,此错误就会消失,但是我认为我不必这样做,因为这是有效的证书。

测试代码如下:

导入java.io.InputStream;
导入java.io.OutputStream;

导入javax.net.ssl.SSLSocket;
导入javax.net.ssl.SSLSocketFactory;

/ **建立与主机和端口的SSL连接,写入一个字节,然后
 *打印响应。看到
 * http://confluence.atlassian.com/display/JIRA/Connecting+to+SSL+services
 * /
公共类SSLPoke {
    公共静态void main(String [] args){

                如果(args.length!= 2){
                        System.out.println(“用法:” + SSLPoke.class.getName()+“”);
                        System.exit(1);
                }
                尝试{
                        SSLSocketFactory sslsocketfactory =(SSLSocketFactory)SSLSocketFactory.getDefault();
                        SSLSocket sslsocket =(SSLSocket)sslsocketfactory.createSocket(args [0],Integer.parseInt(args [1]));

                        InputStream in = sslsocket.getInputStream();
                        OutputStream out = sslsocket.getOutputStream();

                        //编写一个测试字节以获取响应:)
                        out.write(1);

                        而(in.available()> 0){
                                System.out.print(in.read());
                        }
                        System.out.println(“成功连接”);

                } catch(Exception exception){
                        exception.printStackTrace();
                }
        }
}

为什么会发生这种情况?设置SSL证书的正确方法是什么?


问题答案:

之所以发生这种情况,是因为Java信任库不信任链中的所有证书。

最通用的解决方案是将 顶级 证书(链中的最后一个证书,最顶级的签名者)导入JRE的lib/security/cacerts文件中。



 类似资料:
  • 我无法配置有效证书(不是自签名的!)在Wildfly 9中。我已经在WildFly中配置了HTTPS连接器: 如果我在客户端中导入证书,这个错误就会消失,但是我认为我不应该这样做,因为这是一个有效的证书。 测试代码如下: 为什么会发生这种情况?设置SSL证书的正确方法是什么?

  • 我正在尝试在我的计算机中第一次使用Selenium。但是我在第一行中有一个错误: 我的代码: 错误消息: 我的操作系统是Linux薄荷,19.3,肉桂。 我安装了selenium-server-standalone-3.141.59。jar和geckodriver-v0。26

  • 我使用Charles代理(在OS X 10.9.3下,Mavericks)修改Origin标头,以便我连接的API(在开发中)接受来自开发环境的传入请求。 我设法用一个简单的重写规则来完成这项工作,直到今天一切都正常。 当前的问题是浏览器没有连接到代理(由Charles设置)。请求中的“Failure”(失败)字段表示:“未发出任何请求。SSL证书可能已被拒绝。”,下面,在Notes字段中:“您可

  • 问题内容: selenium不能接受谷歌浏览器发出的警报。 Firefox和IE运作良好。购买Google chrome无效! 我如何接受Google chrome的警报! 问题答案: 而不是接受警报。您可以将其作为骇客操作。这将删除警报,使其不再显示

  • 问题内容: 我在通过Java与HTTPS站点交互时遇到问题。每次程序运行时,我的程序都使用一个带有不受信任证书的URL。该程序必须在多个系统上运行。目前,我有以下内容: 使用此代码,我可以执行以下操作: 但是,我无法执行以下操作: 当执行executeMethod(postMethod)时,我得到一个SSLHandshakeException,CertPathBuilderException等。

  • 有些HTTP客户端接受此证书,有些则不接受。什么能起到作用呢? 即将连接()到www.lucidpress.com端口443(#0) 尝试54.236.129.63...已连接 成功设置证书验证位置: cafile:none capath:/etc/ssl/certs SSLv3、TLS握手、客户端hello(1): SSLv3、TLS握手、服务器hello(2): SSLv3、TLS握手,证书(