安卓SSL错误:证书不受信任

3
在我正在开发的应用程序中,我需要与使用自签名证书的Web服务器建立HTTPS连接。我一直在收到证书不受信任的错误提示,后来在参考了Stack Overflow之后,我找到了这篇博客文章:http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/ 我使用Keytool命令为我的本地Tomcat创建了一个JKS密钥库,命令如下:
 keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048

我使用一个名为portecle的开源工具,从JKS密钥库中提取了DER编码格式的证书。

然后,我使用同样的portecle工具创建了一个新的BKS密钥库,并使用android内置的Bouncy Castle提供程序支持上述证书。

现在,如果我像第一个URL中所示进行http post请求,则在logcat中会出现以下异常。

WARN/System.err(498): javax.net.ssl.SSLException: Not trusted server certificate
WARN/System.err(498):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:371)
WARN/System.err(498):     at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:92)
WARN/System.err(498):     at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381)
WARN/System.err(498):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:164)
WARN/System.err(498):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
WARN/System.err(498):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
WARN/System.err(498):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348)
WARN/System.err(498):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
WARN/System.err(498):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
WARN/System.err(498):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
WARN/System.err(498):     at com.portal.activity.Registration$ProgressThread.run(Registration.java:324)
WARN/System.err(498): Caused by: java.security.cert.CertificateException: java.security.InvalidAlgorithmParameterException: the trust anchors set is empty
WARN/System.err(498):     at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:151)
WARN/System.err(498):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:366)
WARN/System.err(498):     ... 10 more
WARN/System.err(498): Caused by: java.security.InvalidAlgorithmParameterException: the trust anchors set is empty
WARN/System.err(498):     at java.security.cert.PKIXParameters.checkTrustAnchors(PKIXParameters.java:611)
WARN/System.err(498):     at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:86)
WARN/System.err(498):     at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.<init>(TrustManagerImpl.java:82)
WARN/System.err(498):     at org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl.engineGetTrustManagers(TrustManagerFactoryImpl.java:132)
WARN/System.err(498):     at javax.net.ssl.TrustManagerFactory.getTrustManagers(TrustManagerFactory.java:226)
WARN/System.err(498):     at org.apache.http.conn.ssl.SSLSocketFactory.createTrustManagers(SSLSocketFactory.java:263)
WARN/System.err(498):     at org.apache.http.conn.ssl.SSLSocketFactory.<init>(SSLSocketFactory.java:190)
WARN/System.err(498):     at org.apache.http.conn.ssl.SSLSocketFactory.<init>(SSLSocketFactory.java:216)
WARN/System.err(498):     at com.portal.httpclient.MyHttpClient.newSslSocketFactory(MyHttpClient.java:51)
WARN/System.err(498):     at com.portal.httpclient.MyHttpClient.createClientConnectionManager(MyHttpClient.java:31)
WARN/System.err(498):     at org.apache.http.impl.client.AbstractHttpClient.getConnectionManager(AbstractHttpClient.java:221)
WARN/System.err(498):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:539)
WARN/System.err(498):     ... 3 more

我的HttpClient与第一个URL中的相同,只是将http和https的端口分别更改为8080和8443,而不是80和443。

请帮忙。


https://dev59.com/b3E85IYBdhLWcg3wtV_1 - Samir Mangroliya
@Divyesh-感谢您的回复。我不想接受所有证书。我想建立自己的可信存储库,以便只能接受来自该服务器的证书。我希望它与我帖子中第一个URL指定的方式类似。 - Sreeram
2个回答

1

您可以在此处找到有关在Android中使用自定义信任存储的说明http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html

简要来说:

  • 获取服务器的公共证书
  • 使用该证书创建BKS信任存储
  • 创建并使用自定义HttpClient进行发布

听起来您已经完成了前两个步骤,但还没有完成最后一步。

另外,Portecle是否使用了正确的标志?在创建BKS存储时,您需要使用trustcacerts标志,否则它将无法正常工作。


谢谢回复。我完成了所有三个步骤。我没有在这里发布第三步。我需要在portecle中检查trustcacerts标志。 - Sreeram
我在Portecle中没有找到任何设置标志。你能否从我提供的URL下载并查看? - Sreeram
@Sreeram 我没有看到特定的选项,但我猜你应该使用“导入受信任的证书”选项。作为故障排除步骤,我建议您使用命令行重新创建您的信任存储库(根据我提供的链接)。 - Ryan Schipper
我找到了标志。我会尝试设置它并让您知道。 - Sreeram

0

我停止使用Portecle,现在一切都通过命令行完成。

我只使用keytool完成所有操作,如我问题中的URL所示。

这对我很有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接