Android 鏈接https出現 javax.net.ssl.SSLException: hostname in certificate didn't match:

拋出的錯誤是這樣的:

 javax.net.ssl.SSLException: hostname in certificate didn't match: <test.rigbee.cn> != <rigbee.cn> OR <rigbee.cn> OR <www.rigbee.cn>
 	at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:185)
 	at org.apache.http.conn.ssl.BrowserCompatHostnameVerifier.verify(BrowserCompatHostnameVerifier.java:54)
 	at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:114)
 	at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:95)
 	at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381)
 	at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:165)
 	at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
 	at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
 	at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
 	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
 	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
 	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)

嘗試過設置HttpsURLConnection.setDefaultHostnameVerifier(),不成功,估計是org.apache.http有自己的一套SSL東西,修改org.apache.http的主機名驗證解決問題。

增加則用的一行:

SSLSocketFactory.getSocketFactory().setHostnameVerifier(new AllowAllHostnameVerifier());

同時import一下:

import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
import org.apache.http.conn.ssl.SSLSocketFactory;

如果你使用org.apache.http的話上面的就夠了。


另外如果你使用原始的URLConnect的話請這樣設置一下:

try {		
	SSLContext sc = SSLContext.getInstance("TLS");
	sc.init(null, new TrustManager[] { new X509TrustManager() {
		@Override
		public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
		}


		@Override
		public void checkServerTrusted(X509Certificate[] chain, String authType)


		throws CertificateException {
		}


		@Override
		public X509Certificate[] getAcceptedIssuers() {
			return null;
		}
	} }, new SecureRandom());
	HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
	HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
		@Override
		public boolean verify(String arg0, SSLSession arg1) {
			return true;
		}
	});
} catch (Exception e) {
	e.printStackTrace();
}


之後就可以使用了:

String https = "https://www.google.com.hk";
try {
	HttpsURLConnection conn = (HttpsURLConnection) new URL(https).openConnection();
	conn.setDoOutput(true);
	conn.setDoInput(true);
	conn.connect();
	BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
	StringBuffer sb = new StringBuffer();
	String line;
	while ((line = br.readLine()) != null)
		sb.append(line);
	Log(sb.toString());


} catch (Exception e) {
	e.printStackTrace();
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章