首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中恢复SSL X509TrustManager

在Java中恢复SSL X509TrustManager
EN

Stack Overflow用户
提问于 2017-08-18 22:03:54
回答 1查看 596关注 0票数 1

我有以下代码,它有条件地(基于boolean)禁用SSL证书检查。

但是,如果我将boolean设置为false并重新运行我的代码,SSL检查似乎仍然被禁用(当它应该被重新启用时)。

那么,恢复检查的相反逻辑是什么呢?

代码语言:javascript
复制
if (bIgnoreSSL) {
  TrustManager[] trustAllCertificates = new TrustManager[] {
    new X509TrustManager()
    {
      @Override
      public X509Certificate[] getAcceptedIssuers() { return null; // Not relevant.}

      @Override
      public void checkClientTrusted(X509Certificate[] certs, String authType) { // Do nothing. Just allow them all. }

      @Override
      public void checkServerTrusted(X509Certificate[] certs, String authType){ // Do nothing. Just allow them all.}
    }
  };

   HostnameVerifier trustAllHostnames = new HostnameVerifier()
   {
        @Override
        public boolean verify(String hostname, SSLSession session) { return true; // Just allow them all. }
   };

        try
        {
            System.setProperty("jsse.enableSNIExtension", "false");
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, trustAllCertificates, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
            HttpsURLConnection.setDefaultHostnameVerifier(trustAllHostnames);
        }
        catch (GeneralSecurityException e)
        {
            throw new ExceptionInInitializerError(e);
        }
}
else {
  // Code to restore here (Opposite of above?)
}
EN

回答 1

Stack Overflow用户

发布于 2017-08-18 22:24:22

一种替代方法是首先将默认值保存在变量中,以便以后可以恢复它们:

代码语言:javascript
复制
// save defaults (do this before setting another defaults)
HostnameVerifier defaultVerifier = HttpsURLConnection.getDefaultHostnameVerifier();
SSLSocketFactory defaultFactory = HttpsURLConnection.getDefaultSSLSocketFactory();

if (bIgnoreSSL) {
...
} else {
    // restore defaults
    HttpsURLConnection.setDefaultHostnameVerifier(defaultVerifier);
    HttpsURLConnection.setDefaultSSLSocketFactory(defaultFactory);
}

另一种选择(更好的方法,IMO)是不为所有连接设置默认值,而是为每个单独的连接设置

代码语言:javascript
复制
HttpsURLConnection conn = // create connection

if (bIgnoreSSL) {
    // set custom verifier and factory only for this connection
    conn.setHostnameVerifier(trustAllHostnames);
    conn.setSSLSocketFactory(sc.getSocketFactory());
}
// no need to restore (else), as I didn't change the defaults

这只会更改指定连接的验证器和工厂,而不会影响默认值(因此不需要恢复)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45758605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档