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

本文介绍了如何解决因主机名不匹配导致的SSL异常错误。提供了针对org.apache.http及原始URLConnect两种情况下的解决方案,包括设置自定义的主机名验证器。
部署运行你感兴趣的模型镜像

抛出的错误是这样的:

 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();
}



您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

`javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name` 错误通常是由于客户端在 SSL/TLS 握手过程中发送了一个服务器无法识别的 SNI(Server Name Indication)扩展导致的。以下是一些可能的解决方法: ### 禁用 SNI 如果服务器不支持 SNI,可以在客户端代码中禁用 SNI。以下是一个 Java 示例: ```java import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLParameters; import java.io.IOException; import java.net.URL; public class DisableSNIExample { public static void main(String[] args) throws Exception { URL url = new URL("https://your-url.com"); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, null, null); SSLParameters sslParameters = new SSLParameters(); sslParameters.setServerNames(null); // 禁用 SNI conn.setSSLSocketFactory(sslContext.getSocketFactory()); conn.setSSLParameters(sslParameters); try { conn.connect(); System.out.println("Connected successfully"); } catch (IOException e) { e.printStackTrace(); } } } ``` ### 升级 JDK 版本 较新的 JDK 版本可能会修复一些与 SNI 相关的问题。可以尝试将 JDK 升级到最新的稳定版本。 ### 检查服务器配置 确保服务器端正确配置了 SNI 支持。如果服务器不支持 SNI,可能需要联系服务器管理员进行相应的配置调整。 ### 检查域名和证书 确保使用的域名和证书是正确的,并且证书没有过期或存在其他问题。 ### 指定 TLS 版本 类似于解决 `SSLHandshakeException` 的方法,可以尝试指定使用的 TLS 版本: ```java import org.apache.http.client.HttpClient; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.TrustSelfSignedStrategy; import org.apache.http.impl.client.HttpClients; import org.apache.http.ssl.SSLContexts; import javax.net.ssl.SSLContext; import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; public class SpecifyTLSVersionExample { public static HttpClient getHttpClient() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException { SSLContext sslContext = SSLContexts.custom() .loadTrustMaterial(null, new TrustSelfSignedStrategy()) .build(); SSLConnectionSocketFactory scsf = new SSLConnectionSocketFactory( sslContext, new String[]{"TLSv1.2"}, null, NoopHostnameVerifier.INSTANCE ); return HttpClients.custom() .setSSLSocketFactory(scsf) .build(); } } ```
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RobinTang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值