首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android HttpClient -证书中的主机名与<example.com> != <*.example.com>不匹配

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

Stack Overflow用户
提问于 2010-06-29 03:52:54
回答 4查看 26.5K关注 0票数 18

我正在使用安卓系统上的HttpClient连接到https://someUrl.com/somePath。问题是站点的证书是针对*.someUrl.com的,而不是针对someUrl.com的,所以我得到了一个SSLException。网站的问题,是的,但除非我能把它修好,否则我就卡住了。有没有办法让HttpClient放松下来,接受证书?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-29 07:55:23

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

代码语言:javascript
复制
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;
}

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

票数 33
EN

Stack Overflow用户

发布于 2010-06-29 05:34:38

Android上的BouncyCastle太旧了,不能识别通配符证书。

您可以编写自己的X509TrustManager来检查通配符。

或者,如果您可以接受风险,则可以完全禁用证书检查。看这个问题,

Self-signed SSL acceptance on Android

票数 3
EN

Stack Overflow用户

发布于 2010-06-29 03:59:18

如果它想要*.someUrl.com,那么看起来你可以给它www.someUrl.com/somePath而不是someUrl.com/somePath

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3135679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档