1. 程式人生 > >《HttpClient官方文件》2.7 連線套接字工廠

《HttpClient官方文件》2.7 連線套接字工廠

2.7.4. 主機名驗證

除了在SSL / TLS協議級別上進行信任驗證和客戶端身份驗證之外,一旦建立了連線,HttpClient可以選擇性地驗證目標主機名是否與儲存在伺服器的X.509證書中的名稱匹配。該驗證可以提供對伺服器信任材料的真實性的額外保證。javax.net.ssl.HostnameVerifier介面代表主機名驗證策略。 HttpClient附帶了javax.net.ssl.HostnameVerifier介面的兩個實現類。重要:主機名驗證和SSL信任驗證這兩者不應混淆。

  • DefaultHostnameVerifier: HttpClient使用的預設實現類,它應相容RFC 2818。主機名必須匹配證書指定的任何別名,或在證書持有者沒有為別名給出最明確的證書通用名(CN)的情況下。 在證書通用名(CN),以及任何subject-alts中都可以出現萬用字元。

  • NoopHostnameVerifier類:  作為主機名驗證工具,實質上關閉了主機名驗證,它接受任何有效的SSL會話並匹配到目標主機。

HttpClient預設使用DefaultHostnameVerifier類來實現。 如果需要,可以指定其他的主機名驗證器來實現。

SSLContext sslContext = SSLContexts.createSystemDefault();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
        sslContext,
        NoopHostnameVerifier.INSTANCE);

自版本4.4後HttpClient使用由Mozilla基金維護的公共字尾名列表,以確保SSL證書中的萬用字元不會被濫用於申請擁有公共頂級域名的多個域。 HttpClient 附帶了在釋放時回收的列表的副本。 https://publicsuffix.org/list/這個URL能夠獲取最近的版本號列表,強烈建議製作這個列表的本地副本,並每天從其原始位置下載不超過一次。

PublicSuffixMatcher publicSuffixMatcher = PublicSuffixMatcherLoader.load(
    PublicSuffixMatcher.class.getResource("my-copy-effective_tld_names.dat"));
DefaultHostnameVerifier hostnameVerifier = new DefaultHostnameVerifier(publicSuffixMatcher);

可以使用“null”這個引數來禁用對公共字尾名列表的驗證。

DefaultHostnameVerifier hostnameVerifier = new DefaultHostnameVerifier(null);