TLS协议的兼容性测试
0導言
工作中遇到,系統服務內部調用增加對TLSv1.2協議的支持,因此做了兼容測試
1測試結果
如表,TLS有一個內置機制來協商是使用那個版本的協議,客戶端發送一個高版本協議,其中包含低版本協議,如果服務器不支持此高版本協議,他們將協議使用低版本協議。
2測試環境
jdk版本:? 1.8,默認支持:[SSLv2Hello,SSLv3,TLSv1,TLS1.1,TLS1.2]
? 瀏覽器:
? 谷歌, 其版本80.0.3987.132(正式版本)(64位) 31以上就默認支持TLSv1.2
? 客戶端:
? httpClient 3.0
? 服務器
? Tomcat7 7以上版本支持TLSv1.2
3測試變量控制
變量1:tomcat服務端配置
? 準備:
? 1、使用jdk的keytools創建密鑰放入tomcat中
? 2、tomcat配置https,添加443端口,配置密鑰信息
? 通過修改tomcat7的配置文件,D:\Developtools\apache-tomcat-7.0.107\conf\server.xml
原https配置:
配置當前服務器只支持SSL\TLS協議的版本:
<Connector port=“443” protocol=“org.apache.coyote.http11.Http11Protocol”
maxThreads=“150” SSLEnabled=“true” scheme=“https” secure=“true”
clientAuth=“false” sslProtocol=“TLS” keystoreFIle=“D:\tomcat.keystore” keystorePass=“123456” sslEnabledProtocols="xxx" />
分別配置:
變量2:httpClient客戶端配置
修改MySecureProtocolSocketFactory類中sslcontext=SSLContext.getInstance(“xxx”)
分別配置:
1. sslcontext=SSLContext.getInstance("TLSv1.2")2. sslcontext=SSLContext.getInstance("TLSv1.1")3. sslcontext=SSLContext.getInstance("TLSv1")4. sslcontext=SSLContext.getInstance("SSLv3")5. sslcontext=SSLContext.getInstance("SSL")注意1 客戶端配置高版本會兼容低版本(ps:只能拍照,懂得懂)
注意2
那么如何測試,當前客戶端發送的默認那種版本的協議呢?
抓包工具:Fiddler
HttpsProxyGet類的關鍵點是設置抓包工具的代理
package com.java; import java.io.BufferedReader; import java.io.InputStreamReader; import org.apache.http.HttpEntity; import org.apache.http.HttpHost; import org.apache.http.HttpResponse; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.methods.HttpGet; import org.apache.http.conn.params.ConnRoutePNames; import org.apache.http.impl.client.DefaultHttpClient;public class HttpsProxyGet {public static void main(String[] args) throws Exception {SSLClient httpclient = new SSLClient();// 訪問的目標站點,端口和協議HttpHost targetHost = new HttpHost("www.baidu.com", 443, "https");// 代理的設置HttpHost proxy = new HttpHost("localhost", 8888);httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);// 目標地址HttpGet httpget = new HttpGet("/s");System.out.println("目標: " + targetHost);System.out.println("請求: " + httpget.getRequestLine());System.out.println("代理: " + proxy);// 執行HttpResponse response = httpclient.execute(targetHost, httpget);HttpEntity entity = response.getEntity();System.out.println("----------------------------------------");System.out.println(response.getStatusLine());if (entity != null) {System.out.println("Response content length: " + entity.getContentLength());}// 顯示結果BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));String line = null;while ((line = reader.readLine()) != null) {System.out.println(line);}if (entity != null) {entity.consumeContent();}} } package com.java;import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.impl.client.DefaultHttpClient;/*** 用于進行Https請求的HttpClient* @ClassName: SSLClient* @Description: TODO* @author Devin <xxx>**/ public class SSLClient extends DefaultHttpClient {public SSLClient() throws Exception{super();SSLContext ctx = SSLContext.getInstance("TLSv1");X509TrustManager tm = new X509TrustManager() {public void checkClientTrusted(X509Certificate[] chain,String authType) throws CertificateException {}public void checkServerTrusted(X509Certificate[] chain,String authType) throws CertificateException {}public X509Certificate[] getAcceptedIssuers() {return null;}};ctx.init(null, new TrustManager[]{tm}, null);SSLSocketFactory ssf = new SSLSocketFactory(ctx,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);ClientConnectionManager ccm = this.getConnectionManager();SchemeRegistry sr = ccm.getSchemeRegistry();sr.register(new Scheme("https", 443, ssf));} }抓包結果: 與 SSLContext ctx = SSLContext.getInstance(“TLSv1”)中配置一致,默認高版本
4測試思路及過程
思路:
1、使用谷歌瀏覽器與提供端服務器建立連接訪問,可驗證到當前服務器協議版本。
調用谷歌瀏覽器,按F12查看:
2、消費者端發起服務調用,即使用httpClient發起https請求,查看服務調用情況。
變量1和變量2交叉改變,進行測試
測試結果共15種,在文章頭表中。
5結語
文章梳理可能有點亂,對這塊還是半只半知半解。
-----重言
總結
以上是生活随笔為你收集整理的TLS协议的兼容性测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Latex】从零开始学论文排版软件
- 下一篇: 腾讯点播试看视频功能分享