代码之家  ›  专栏  ›  技术社区  ›  Jaime Montoya

javax.net.ssl.sslpeerunverifiedexception:Android 4.x和5.x上没有对等证书

  •  6
  • Jaime Montoya  · 技术社区  · 7 年前

    我正在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会抱怨?报告如下:

    enter image description here

    我在用 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/ .也许这就是问题的根源?

    enter image description here

    更新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 .正如你在我对自己问题的回答中看到的那样,我已经继续前进了,但也许这个链接对其他人有用。

    2 回复  |  直到 6 年前
        1
  •  2
  •   LLL    6 年前

    从你的描述来看,这是安卓系统的问题。可能在新版本中修复了。如果我不得不猜测的话,我会说你的证书解析在android端的某个地方会悄无声息地失败,并且 过了一会儿 当android尝试getpeercertificates()时,它抛出异常,因为它们没有初始化(由于我推测的静默失败)。如果失败不是无声的,您可以在问题发生之前尝试找到一些stacktrace。

    你也可以尝试通过调整你的网站使之适合旧的android操作系统来解决这个问题。我没有好的建议或解决方案,但我将首先比较您的证书和从旧的android操作系统角度看很好的站点的证书。

        2
  •  0
  •   Jaime Montoya    6 年前

    原因: 默认情况下,在Android 4.x上禁用TLS 1.2。 解决方案: 因为启用TLS 1.2并不像在 build.gradle 提交我想要使用的tls版本,我决定不支持我的应用程序使用android 4.x,同样的理由是 wire.com 用过,我复制了 更新11 我的问题。