在我的服务器(生产服务器),我有一个goDaddy ssl证书。我有iOS和Android应用程序连接到服务器,iOS连接没有问题,Android版本4.* 一切都很好,但与2.3.* 我总是得到一个SSLHandshakeException设备。
我做了完全一样的Android开发者页面(https://developer.android.com/training/articles/security-ssl.html).
我已经在堆栈溢出(here)中看到了类似的线程,但没有一个有帮助。
然后我看到this线程在讨论扩展密钥使用,但是在调试时我得到了以下信息:
[2]: OID: 2.5.29.37, Critical: false
Extended Key Usage: [ "1.3.6.1.5.5.7.3.1", "1.3.6.1.5.5.7.3.2" ]
字符串
因此,我猜证书没有“强制”扩展密钥使用。
此外,在this线程上,还有一些其他可能的原因,如日期/时间完全错误,这些都是不存在的。
考虑到这一点,我现在不知道问题可能出在哪里。
有什么建议吗?
**编辑:**堆栈跟踪如下:
08-04 16:54:30.139: W/System.err(4832): Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
08-04 16:54:30.149: W/System.err(4832): at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:161)
08-04 16:54:30.149: W/System.err(4832): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:664)
08-04 16:54:30.149: W/System.err(4832): at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)
08-04 16:54:30.159: W/System.err(4832): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:474)
型
7条答案
按热度按时间mfpqipee1#
我在SO和Web中经历了很多地方来解决这个问题。这是为我工作的代码(Android 21):
字符串
app.certificateString
是一个包含证书的字符串,例如:型
我已经测试过,你可以把任何字符的证书字符串,如果它是自签名的,只要你保持上面的确切结构。我用我的笔记本电脑的终端命令行获得的证书字符串。我你需要知道更多的细节,让我知道。
eiee3dmh2#
如果上述所有答案都不起作用,并且您在使用android 30作为编译和目标sdk版本时发布应用程序中遇到任何问题。请从服务器下载您的ssl .cert文件。并将其放入原始文件夹。在XML文件夹中创建network_security_config。在应用程序标签内的menifest中使用行
Android:networkSecurityConfig="@xml/network_security_config”
在network_security_config文件中使用下面提到的代码。
字符串
bbmckpt73#
证书的颁发者似乎不在2.3设备的信任存储中。
查看GoDaddy证书的根证书和中间证书,并检查证书是否存在于2.3设备上。
请参阅http://www.andreabaccega.com/blog/2010/09/23/android-root-certification-authorities-list/获取2.3证书列表。
当只有根CA可用时,请确保您的Web服务器也根据请求提供中间证书。
e5nszbig4#
如果有人需要答案,我终于找到了答案后2谷歌天.基本上我们需要使用自定义TrustManager信任CA在我们的密钥库,这是因为在Android 2.3.x,密钥库没有被正确使用.信贷https://github.com/delgurth为CustomTrustManager.
请参阅:https://github.com/ikust/hello-pinnedcerts/issues/2
KeyPinStore.java
字符串
CustomTrustManager.java
型
要使用它,只需获取SSLSocketFactory并应用它,例如:
使用HttpURL连接
型
关于Volley
型
laik7k3q5#
如果你正在使用AndroidNetworking /Rx 2AndroidNetworking库,这个解决方案是为我工作后浪费4小时.
字符串
eqqqjvef6#
运行此命令以验证代码。keystore具有系统证书:
字符串
ykejflvf7#
我从网站上下载了证书并放在res/raw folderx 1c 0d1x上
的
并将此添加到网络配置文件中。
字符串