【问题标题】:Android 2.3: HttpClient SSL certificate problem: Intermediate certificate lacks BasicConstraintsAndroid 2.3:HttpClient SSL证书问题:中间证书缺少BasicConstraints
【发布时间】:2011-10-27 09:30:42
【问题描述】:

我在使用 this method 解决使用 HttpClient 4 遇到的“javax.net.ssl.SSLPeerUnverifiedException:无对等证书”异常时遇到了问题。然而,这导致了以下 javax.net.ssl.SSLHandshakeException :java.security.cert.CertPathValidatorException:

System.err  W  javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Intermediate certificate lacks BasicCon
               straints
System.err  W   at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:477)
System.err  W   at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.<init>(OpenSSLSocketImpl.java:750)
System.err  W   at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.getInputStream(OpenSSLSocketImpl.java:692)
System.err  W   at org.apache.http.impl.io.SocketInputBuffer.<init>(SocketInputBuffer.java:93)
System.err  W   at org.apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer(SocketHttpClientConnection.java:83)
System.err  W   at org.apache.http.impl.conn.DefaultClientConnection.createSessionInputBuffer(DefaultClientConnection.java:170)
System.err  W   at org.apache.http.impl.SocketHttpClientConnection.bind(SocketHttpClientConnection.java:106)
System.err  W   at org.apache.http.impl.conn.DefaultClientConnection.openCompleted(DefaultClientConnection.java:129)
System.err  W   at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:171)
System.err  W   at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
System.err  W   at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
System.err  W   at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359)
System.err  W   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
System.err  W   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
System.err  W   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
System.err  W   at com.example.activities.AuthTest.onCreate(AuthTest.java:69)
System.err  W   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
System.err  W   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
System.err  W   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
System.err  W   at android.app.ActivityThread.access$1500(ActivityThread.java:123)
System.err  W   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
System.err  W   at android.os.Handler.dispatchMessage(Handler.java:99)
System.err  W   at android.os.Looper.loop(Looper.java:130)
System.err  W   at android.app.ActivityThread.main(ActivityThread.java:3835)
System.err  W   at java.lang.reflect.Method.invokeNative(Native Method)
System.err  W   at java.lang.reflect.Method.invoke(Method.java:507)
System.err  W   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
System.err  W   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
System.err  W   at dalvik.system.NativeStart.main(Native Method)
System.err  W  Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Intermediate certificate
                lacks BasicConstraints
System.err  W   at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:161)
System.err  W   at com.example.models.EasyX509TrustManager.checkServerTrusted(EasyX509TrustManager.java:80)
System.err  W   at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:664)
System.err  W   at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)
System.err  W   at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:474)
System.err  W   ... 28 more
System.err  W  Caused by: java.security.cert.CertPathValidatorException: Intermediate certificate lacks BasicConstraints
System.err  W   at org.bouncycastle.jce.provider.RFC3280CertPathUtilities.prepareNextCertK(RFC3280CertPathUtilities.java:2127)
System.err  W   at org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi.engineValidate(PKIXCertPathValidatorSpi.java:384)
System.err  W   at java.security.cert.CertPathValidator.validate(CertPathValidator.java:197)
System.err  W   at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:156)
System.err  W   ... 32 more

我通过注释掉 EasyX509TrustManager.java 中的以下 else 块来解决 那个

public void checkServerTrusted( X509Certificate[] certificates, String authType )
    throws CertificateException
{
    if ( ( certificates != null ) && ( certificates.length == 1 ) )
    {
        certificates[0].checkValidity();
    }
    //else
    //{
    //    standardTrustManager.checkServerTrusted( certificates, authType );
    //}
}

瞧! 一切正常。问题是我真的不知道“中间证书缺少 BasicCosntraints”异常是什么意思,或者如果注释掉 else 块会引入我可能信任无效证书的安全风险。

原来的 SSLPeerUnverifiedException 在 Android 2.1 或 2.2 上都没有发生,所以这似乎只是 Android 2.3+ 上的问题。

有人可以帮我理解该异常的确切含义吗?如果这是一个安全风险,我将如何着手解决这个问题?

【问题讨论】:

    标签: android security ssl certificate trust


    【解决方案1】:

    基本约束指定一个证书是否可以颁发其他证书(它是证书颁发机构吗;从技术上讲,它的公钥可以签署其他证书),以及它颁发的证书是否可以反过来颁发其他证书(链长可以是谁)。因此,如果有人伪造它,您可以使用/信任由最初不应该颁发证书的人颁发的证书。注释掉checkServerTrusted不好:你基本上是在说:我不在乎这是谁的证书,只要它没有损坏也没有过期。这种方式违背了目的,因为任何人都可以颁发有效的证书。

    可能 2.1 和 2.2 不关心检查约束,而 2.3 开始这样做,这就是您收到错误的原因。您可以发布指向这些证书的链接吗?

    所有血腥细节都在RFC 3280

    【讨论】:

    • 我对直接链接到客户端证书犹豫不决,但层次结构中较高的证书是DigiCertGlobalCA(2048)Entrust.netCertificationAuthority(2048)。非常感谢。
    • 感谢 Entrust 证书确实没有 BasicConstraints 扩展,可能是因为它相当旧(1999 年)。但是,由于它不是中间证书,因此不应发生此错误。我认为即使在较旧的 Android 版本上它也在系统信任库中,那你为什么又要使用自己的 TrustManager 呢?
    猜你喜欢
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 2019-12-11
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多