当前位置: 首页 > 知识库问答 >
问题:

只针对一个特定的服务器忽略SSLHandshake异常

西门嘉石
2023-03-14

我需要忽略PKIX路径构建异常

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderExc
ption: unable to find valid certification path to requested target

我知道如何通过编写我自己的类实现X509TrustManager来做到这一点,在那里我总是从isServerTrusted返回true。

但这是相当广泛的。我的代码将成为更大项目的一部分。我不想因为我更换了信托经理而影响其他一切。

我总是要连接到一个固定的域名,即“www.myws.com”。我只想忽略连接到“www.myws.com”的SSLHandshakeException

这样的事情可能吗?

共有1个答案

昌博易
2023-03-14

这两个问题的答案几乎不可能是相同的,因为我认为信任管理者根本无法获得服务器的域名。

实际上,信任管理器可以获得您想要的主机名的名称。不过,这取决于许多因素。

>

如果您在Java代码中使用了与当前代码相同的方法,那么您将使用与当前代码相同的方法。

当使用X509ExtendedTrustManager实例初始化时,SSLContext会使用这些方法,但当它是普通的X509TrustManager时则不会,因此在进行这些调用之前,它必须先检查类型(请参阅本答案末尾的快速测试,基于该答案中的代码)。

我不确定API在哪里指定了这种行为。《JSSE参考指南》中似乎没有关于此X509ExtendedTrustManager类型检查的任何内容。确保使用扩展方法的一种方法是在sslparemeters中设置一个enpoint标识算法(如HTTPS),但需要对客户端代码及其使用的库进行一定程度的控制。(这也是Java 7中引入的一项功能。)

从那里获得的SSLSocketSSLEngine中,您可以获得SSLSession和对等主机,以便在那里执行检查。(请注意,如果创建SSLSocketSSLEngine的库没有使用将该名称作为String传递的方法之一,而是传递了InetAddress,则主机名可能与预期不太匹配。在这种情况下,您也会丢失SNI。)

然后,您可以在默认的SSLContext中使用这样的信任管理器(使用setDefault(…) )。

如果您不想影响默认的SSLContext(这是进行此类调整的明智选择),则需要弄清楚客户端库如何在每个连接中使用不同的库。这完全取决于使用了什么。

对于传统的URLConnection,将其转换为HttpsURLConnection,并设置为SSLSocketFactory作为自定义SSLContext的一个构建。

使用哪些方法将取决于您是实例化了X509ExtendedTrustManager还是X509TrustManager

X509TrustManager customTm = new X509ExtendedTrustManager() {
    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return finalTm.getAcceptedIssuers();
    }

    @Override
    public void checkServerTrusted(X509Certificate[] chain,
            String authType) throws CertificateException {
        System.out
                .println("Current method: checkServerTrusted(chain, authType)");
        finalTm.checkServerTrusted(chain, authType);
    }

    //@Override
    public void checkServerTrusted(X509Certificate[] chain,
            String authType, Socket socket) throws CertificateException {
        System.out
                .println("Current method: checkServerTrusted(chain, authType, socket)");
        finalTm.checkServerTrusted(chain, authType, socket);
    }

    //@Override
    public void checkServerTrusted(X509Certificate[] chain,
            String authType, SSLEngine engine)
            throws CertificateException {
        System.out
                .println("Current method: checkServerTrusted(chain, authType, engine)");
        finalTm.checkServerTrusted(chain, authType, engine);
    }

    // Same for client-related methods.
};

 类似资料:
  • 我试图爬过craiglist的论坛类别。组织机构(https://forums.craigslist.org/).我的蜘蛛: 我通过错误回调收到以下消息: [失败实例:Traceback:: /usr/local/lib/python2.7/site-packages/twisted/internet/defer.py: 455:回调 /usr/local/lib/python2.7/site-p

  • 使用ESLint是否可以忽略整个目录的一个特定规则? 在我的例子中,我想忽略为一个名为的目录

  • 问题内容: 我正在研究一个jQuery主题,其中包括对尽可能多的表单元素进行样式化。最初,它是为Webkit(Chrome)开发的。现在,我也想使其与Firefox一起使用。 问题是;Firefox在某些特定于Webkit的语法上存在问题。 例如: 问题是位。删除它,Firefox运行正常。它也做到这一点对于其他类似语法,并使用所有其他的事情标签。它可以识别出自己的标签,虽然很好。 Webkit似

  • 并在握手失败结束时找到“无效”记录器: 从记录器来看,我认为使用的SSL协议版本是TLS1.2,看起来不错。它看起来像密码不匹配-但不确定我是否忽略了什么,以及如何补救这一点。 在进一步检查日志时,发现以下一个错误:

  • 我有一个游戏角色,它位于一个棱柱形关节的中心,只能垂直移动(跳跃)。在初始化时,我在屏幕上加载各种游戏障碍,当“产生”时,这些障碍会从屏幕外向角色移动。最好我想用cocos2d位置更新来控制游戏障碍运动的重新定位,而不是box 2d速度控制。 基本上,我希望我的游戏角色能对游戏障碍做出反应,但我不希望游戏障碍对游戏角色做出反应,我希望能够在box 2d之外改变游戏障碍的位置。 我试着只更新游戏角色