Https請求握手驗證方式,對相應域名進行認證通過

對於Https請求,在握手期間,如果 URL 的主機名和服務器的標識主機名不匹配,則驗證機制可以回調此接口的實現程序來確定是否應該允許此連接。
策略可以是基於證書的或依賴於其他驗證方案。
當驗證 URL 主機名使用的默認規則失敗時會回調到HttpsURLConnection.setDefaultHostnameVerifier。

因此,我們可以通過實現自己的HostnameVerifier子類來對相應的域名進行認證通過
這裏是對所有請求的域名都認爲是通過的

package com.xxx.common.util;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;

public class TrustAllHttpsCertificatesUtil {

    static class TrustAllHostnameVerifier implements HostnameVerifier {
        @Override
        public boolean verify(String arg0, SSLSession arg1) {
            return true;
        }
    };

    static class TrustAllTrustManager implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        public boolean isServerTrusted(
                java.security.cert.X509Certificate[] certs) {
            return true;
        }

        public boolean isClientTrusted(
                java.security.cert.X509Certificate[] certs) {
            return true;
        }

        public void checkServerTrusted(
                java.security.cert.X509Certificate[] certs, String authType)
                throws java.security.cert.CertificateException {
            return;
        }

        public void checkClientTrusted(
                java.security.cert.X509Certificate[] certs, String authType)
                throws java.security.cert.CertificateException {
            return;
        }
    }

    public static void trustAll() throws Exception {
        TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
        TrustManager tm = new TrustAllTrustManager();
        trustAllCerts[0] = tm;
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, null);
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

        HttpsURLConnection.setDefaultHostnameVerifier(new TrustAllHostnameVerifier());
    }


}

通過調用TrustAllHttpsCertificatesUtil.trustAll方法就可能啓動新的驗證回調機制。

在Web項目中,可以通過使用filter來調用TrustAllHttpsCertificatesUtil.trustAll()方法。

package com.xxx.common.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.apache.log4j.Logger;

import com.xxx.common.util.TrustAllHttpsCertificatesUtil;

public class TrustAllHttpsCertificatesFilter implements Filter {

    private static final Logger LOG = Logger.getLogger(TrustAllHttpsCertificatesFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        try {
            TrustAllHttpsCertificatesUtil.trustAll();
        } catch (Exception e) {
            e.printStackTrace();
            LOG.error(e);
        }
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {

    }

}

然後在項目的web.xml中配置這個filter

<filter>
    <filter-name>trustAllHttpsCertificatesFilter</filter-name>
    <filter-class>com.xxx.common.filter.TrustAllHttpsCertificatesFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>trustAllHttpsCertificatesFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
發佈了24 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章