我正在android 4.4.2上运行我的应用程序,它会抛出以下错误:
07-03 08:43:59.255 21643-21803/com.myapp W/System.err: javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
07-03 08:43:59.255 21643-21803/com.myapp W/System.err: at com.android.org.conscrypt.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:146)
07-03 08:43:59.255 21643-21803/com.myapp W/System.err: at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:93)
07-03 08:43:59.255 21643-21803/com.myapp W/System.err: at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:388)
07-03 08:43:59.255 21643-21803/com.myapp W/System.err: at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:165)
07-03 08:43:59.255 21643-21803/com.myapp W/System.err: at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
07-03 08:43:59.255 21643-21803/com.myapp W/System.err: at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
07-03 08:43:59.255 21643-21803/com.myapp W/System.err: at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
07-03 08:43:59.255 21643-21803/com.myapp W/System.err: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
07-03 08:43:59.255 21643-21803/com.myapp W/System.err: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
07-03 08:43:59.255 21643-21803/com.myapp W/System.err: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
07-03 08:43:59.255 21643-21803/com.myapp W/System.err: at com.myapp.Util.Util$1.run(Util.java:242)
07-03 08:43:59.255 21643-21803/com.myapp W/System.err: at java.lang.Thread.run(Thread.java:841)
07-03 08:43:59.475 21643-21643/com.myapp E/ViewRootImpl: sendUserActionEvent() mView == null
它可以在android 6.x及更高版本上正常工作。只有Android 4.x和5.x会失败。我没有尝试过android 3.x及以下版本,但如果我只能在android 4.x和5.x版本中修复它,我会很好的。有趣的是,它过去曾经工作过,突然它停止工作,而我没有更改应用程序的源代码。当我去
https://www.digicert.com/help/
要测试我的服务器SSL证书,所有内容都通过:
DNS resolves <Domain> to <IP address>
HTTP Server Header: Apache
SSL certificate
Common Name =
Subject Alternative Names = <subdomain>.<Domain>, <Domain>, m.<Domain>, www.<Domain>
Issuer = COMODO RSA Extended Validation Secure Server CA
Serial Number = 5A34235B2A2B53B35354232B123B23C5
SHA1 Thumbprint = 98C357AC34A23B232134B2A4C23A2B23AC23A532
Key Length = 2048
Signature algorithm = SHA256 + RSA (excellent)
Secure Renegotiation: Supported
SSL Certificate has not been revoked
OCSP Staple: Good
OCSP Origin: Good
CRL Status: Good
SSL Certificate expiration
The certificate expires May 24, 2019 (325 days from today)
Certificate Name matches <Domain>
Subject
Valid from 11/Jun/2017 to 24/May/2019
Issuer COMODO RSA Extended Validation Secure Server CA
Subject COMODO RSA Extended Validation Secure Server CA
Valid from 12/Feb/2012 to 11/Feb/2027
Issuer COMODO RSA Certification Authority
Subject COMODO RSA Certification Authority
Valid from 30/May/2000 to 30/May/2020
Issuer AddTrust External CA Root
SSL Certificate is correctly installed
Congratulations! This certificate is correctly installed.
我的ssl证书看起来不错。我想知道为什么Android 4.x和5.x会抛出这个
javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
错误。
更新1
:ssl报告显示我的ssl证书一切正常。为什么Android会抱怨?报告如下:
我在用
https://www.ssllabs.com/ssltest/
更新2
:正在读取
https://developer.android.com/reference/javax/net/ssl/SSLPeerUnverifiedException.html#SSLPeerUnverifiedException(java.lang.String)
,我的理解是服务器无法识别自身。为什么?我想是因为理论上服务器缺少所需的对等证书。如果你知道如何使用
https://www.ssllabs.com/ssltest/
在更新1中,ssl报告显示我的服务器正确通过了证书测试。
更新3
:我的证书颁发机构(CA)是comodo。我的ssl报告显示我的ssl证书一切正常:
https://www.ssllabs.com/ssltest/analyze.html?d=cuponclub.net
是的。当我从Web浏览器发出服务器请求时,一切正常:
https://cuponclub.net/San-salvador/deals/json_index/
.看看https连接是如何成功的,证书在浏览器中是有效的,一切看起来都很完美。在android 6.x和更高版本上没有错误,但是为什么android 4.x和5.x一直在抱怨我的ssl证书,当我试图在android4.x或5.x上编译我的应用程序时,会在android studio日志上抛出这个错误?以下内容:
W/System.err: javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
W/System.err: at com.android.org.conscrypt.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:146)
W/System.err: at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:93)
W/System.err: at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:388)
W/System.err: at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:165)
W/System.err: at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
W/System.err: at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
W/System.err: at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
W/System.err: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
W/System.err: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
W/System.err: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
W/System.err: at com.couponclub.Util.Util$1.run(Util.java:242)
W/System.err: at java.lang.Thread.run(Thread.java:841)
更新4
:查看答案
Error in android application: javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
,他们认为问题可能与服务器名称指示(sni)有关。当我使用
https://www.ssllabs.com/ssltest/
要分析我的站点,我在红色的结果中看到:
替代名称[………]不匹配
信任不不信任
Mozilla苹果Android Java Windows
也许我的问题与服务器名称指示(sni)或缺少它有关?
更新5
:我要从
https://www.ssllabs.com/ssltest/
.也许这就是问题的根源?
更新6
以下内容:
Certificate #2
可以忽略我的问题的影响,因为它适用于不同的域。我只关心结果
Certificate #1
是的。
更新7
:Web宿主公司支持团队和SSL证书颁发者支持团队确认SSL证书及其安装一切正常,他们认为这可能是Android 4.x和5.x版的Android sdk混淆的问题,而不是SSL证书的实际问题。ssl证书看起来一切都很好。
更新8
:我在服务器上禁用了TLS 1.1和更早版本,以符合SSL标准,我开始怀疑错误的原因是Android 4.x和5.x可能希望看到支持TLS 1.1和更早版本的库,当它不存在时,它会自动抛出SSL错误,即使我有TLS 1.2。这是我的一个假设。例如,我在
https://help.salesforce.com/articleView?id=000231452&type=1
有关“为TLS 1.0弃用准备移动应用程序”的信息,他们说:
安卓。不幸的是,可能需要一些工作来确保
当TLS 1.0在
Salesforce实例。我们有一个在上执行TLS 1.1和1.2的修复程序
移动sdk android应用程序。
因此,他们意识到禁用tls 1.0可能会使一些android应用程序在salesforce实例中崩溃,并且他们知道在禁用tls1.0之后必须做一些工作来修复这个问题。类似地,我开始怀疑在我的案例中,问题可能是我的服务器中缺少对tls 1.0和更早版本的支持。
更新9
:在我向科摩多解释后,我可以支持我在
更新8
,这是他们的回答:
感谢您联系科摩多CA支持。Android版本4.3和
早期版本不支持TLS 1.2。因为您只启用了TLS 1.2
服务器,将不会从建立到服务器的连接
那些遗留设备。证书检查仅在
正在建立连接。
更新10
:一切似乎都表明我的遭遇是
https://blog.dev-area.net/2015/08/13/android-4-1-enable-tls-1-1-and-tls-1-2/
以下内容:
我最近不得不开发一个android应用程序,它使用了一个api,出于安全原因,该api取消了对tls 1.0连接的支持。sslsocket的android文档称tls 1.1和tls1.2在android启动的api级别16+中受支持(android 4.1,jelly bean)。但它在默认情况下是禁用的,但从API级别20+开始(Android4.4用于手表、Kitkat手表和Android5.0用于手机、棒棒糖)。但是很难找到任何关于如何为运行4.1的手机启用它的文档。
更新11
:正在查看
https://github.com/wireapp/wire-android/issues/1450
,例如
wire.com
作为一个流行的协作平台,Android4.x缺乏支持是有道理的:
嗨,谢谢你的反馈。不幸的是,升级到tlsv1.2
是加强通讯安全的必要步骤
在服务器和客户端之间
是开放的重新考虑。所有涉及放弃的决定
支持旧版本的东西,会有人
设备将被留下。然而,考虑到
安全和考虑到极少数人将失去
支持,我们决定升级。知道我们不是一个人
由于github本身也做了同样的事情,因此不再支持tls 1.2之前的版本。
最重要的是,android 4.x手机是相当老的设备
很可能没有从他们的
制造商,所以如果你是一个“隐私意识”的用户,我建议你
得到了更新的东西(安卓5在2014年发布)。我们是
如果你觉得自己被落在后面了,很抱歉,但是请理解
在作出这一决定时,我们最清楚的是
重要因素。
更新12
:关于问题是什么以及如何解决问题的有趣链接:
https://medium.com/tech-quizlet/working-with-tls-1-2-on-android-4-4-and-lower-f4f5205629a
.正如你在我对自己问题的回答中看到的那样,我已经继续前进了,但也许这个链接对其他人有用。