【问题标题】:CertificateException with async-http-client for https带有 async-http-client for https 的 CertificateException
【发布时间】:2014-01-26 02:42:21
【问题描述】:

几天前我开始在使用async-http-client 访问https://ws.plimus.com/ 时遇到问题。我收到“一般 SSLEngine 问题”消息,在堆栈跟踪中我可以看到它是由

java.security.cert.CertificateException: Certificates does not conform to algorithm constraints

This SO question 描述的内容基本相同。 Commenting out the line in java.security 使错误消失,但我认为禁用 MD2 是有充分理由的。

使用 Raman's answer 作为提示,我发现确实是 async-http-client 库 uses the X509TrustManager interface,但我无能为力。

运行这个:

openssl s_client -showcerts -connect ws.plimus.com:443 | grep -i md2

什么也没找到,所以我什至不知道是哪个证书导致了这个问题。

除了解决方法,我还能做些什么吗?

我放了重现问题的演示代码on github

【问题讨论】:

    标签: java ssl asynchttpclient


    【解决方案1】:

    您提到的服务器确实使用了与我在other answer 中描述的 md2WithRSAEncryption 算法相同的 Verisign Class 3 证书:

    openssl s_client -showcerts -no_ign_eof -connect ws.plimus.com:443
    CONNECTED(00000003)
    ... [ stripped ] ...
     3 s:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
       i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
    -----BEGIN CERTIFICATE-----
    MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
    A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
    cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
    MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
    BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
    YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
    ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
    BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
    I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
    CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
    lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
    AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
    -----END CERTIFICATE-----
    

    然后将该证书转换为文本形式:

    openssl x509 -text -noout < cert.pem
    Certificate:
        Data:
            Version: 1 (0x0)
            Serial Number:
                70:ba:e4:1d:10:d9:29:34:b6:38:ca:7b:03:cc:ba:bf
        Signature Algorithm: md2WithRSAEncryption
            Issuer: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority
            Validity
                Not Before: Jan 29 00:00:00 1996 GMT
                Not After : Aug  1 23:59:59 2028 GMT
            Subject: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority
    ... [ stripped ] ...
    

    仔细阅读 async-http-client 的 javadocs,看起来您可以在构建 AsyncHttpClientConfig 的实例时调用 setSSLContext

    https://github.com/AsyncHttpClient/async-http-client/blob/master/api/src/main/java/org/asynchttpclient/AsyncHttpClientConfig.java#L841

    因此,您可以使用X509ExtendedTrustManager 创建自己的SSLContext 并配置异步http 客户端库以使用它,而不是使用其内部默认值。那应该可以解决您的问题!

    这是一个 Gist,其中包含我用来调试此问题的 SSL 测试代码。您可以轻松地从中提取您需要创建自己的SSLContext:https://gist.github.com/rocketraman/8312705

    【讨论】:

      猜你喜欢
      • 2016-09-07
      • 2020-04-13
      • 1970-01-01
      • 2014-12-19
      • 2016-11-09
      • 2022-08-04
      • 2017-06-01
      • 1970-01-01
      • 2021-07-06
      相关资源
      最近更新 更多