gpt4 book ai didi

java - Android HttpClient - 证书中的主机名不匹配 != <*.example.com>

转载 作者:IT王子 更新时间:2023-10-28 23:35:36 27 4
gpt4 key购买 nike

我在 Android 上使用 HttpClient 连接到 https://someUrl.com/somePath .问题是该站点的证书适用于 *.someUrl.com,而不是 someUrl.com,所以我得到了 SSLException。是的,网站方面很蹩脚,但除非我能修复它,否则我会被卡住。有没有办法让 HttpClient 放松并接受证书?

最佳答案

这是我的(编辑过的)解决方案:

class MyVerifier extends AbstractVerifier {

private final X509HostnameVerifier delegate;

public MyVerifier(final X509HostnameVerifier delegate) {
this.delegate = delegate;
}

@Override
public void verify(String host, String[] cns, String[] subjectAlts)
throws SSLException {
boolean ok = false;
try {
delegate.verify(host, cns, subjectAlts);
} catch (SSLException e) {
for (String cn : cns) {
if (cn.startsWith("*.")) {
try {
delegate.verify(host, new String[] {
cn.substring(2) }, subjectAlts);
ok = true;
} catch (Exception e1) { }
}
}
if(!ok) throw e;
}
}
}


public DefaultHttpClient getTolerantClient() {
DefaultHttpClient client = new DefaultHttpClient();
SSLSocketFactory sslSocketFactory = (SSLSocketFactory) client
.getConnectionManager().getSchemeRegistry().getScheme("https")
.getSocketFactory();
final X509HostnameVerifier delegate = sslSocketFactory.getHostnameVerifier();
if(!(delegate instanceof MyVerifier)) {
sslSocketFactory.setHostnameVerifier(new MyVerifier(delegate));
}
return client;
}

除非存在通配符域,否则它的优点是不会更改默认行为,在这种情况下,它会重新验证,就好像 2 部分域(例如,someUrl.com)是证书的一部分,否则原始异常是重新抛出。这意味着真正无效的证书仍然会失败。

关于java - Android HttpClient - 证书中的主机名不匹配 <example.com> != <*.example.com>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3135679/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com