无法使DefaultHttpClient与自签名证书一起使用

时间:2011-03-09 22:41:48

标签: android

我无法接受我的自签名证书,我使用以下方法:

HostnameVerifier hostnameVerifier = 
    org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;

DefaultHttpClient dummy = new DefaultHttpClient();

SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);

SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("https", socketFactory, 8443));

SingleClientConnManager mgr = new SingleClientConnManager(
    dummy.getParams(), registry);
DefaultHttpClient client = new DefaultHttpClient(mgr, dummy.getParams());

// make connection with 'client' now.

我的服务器正在使用https监听8443,我可以通过浏览器验证这一点。我正在从同一主题的其他几篇文章中采取上述内容:

不确定为什么它对我不起作用,只是在连接时不断获得“不信任的服务器证书”例外。任何想法?

Accepting a certificate for HTTPs on Android

由于

2 个答案:

答案 0 :(得分:1)

默认情况下,java信任默认信任库中的证书,即cacerts 当然,您的自签名证书,您已将服务器配置为发送以进行服务器身份验证,因为它不在受信任的证书中,因此将被拒绝为不受信任。 为了解决这个问题,你必须配置JSSE使用的sslcontext来使用你自己的自定义信任库,它将覆盖java的默认值并包含你的自签名证书。
这是通过在初始化时在信任管理器中加载密钥库来完成的 没有在Android上工作,但是如果您看到这篇文章appache httpsclient,您可以在问题和Oleg的答案中找到用作参考的代码。
希望这有帮助

答案 1 :(得分:-1)

我在众多开发服务器上都有这个。除了不将SSL与自签名证书一起使用之外,别无他法。

这似乎是一个Java安全问题。