1

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

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

这个 SO question描述了基本相同的事情。注释掉 java.security 中的行会使错误消失,但我认为禁用 MD2 是有充分理由的。

使用拉曼的提示答案,我发现确实, async-http-client 库使用 X509TrustManager 接口,但我无法改变它。

运行这个:

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

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

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

我将重现问题的演示代码放在 github 上

4

1 回答 1

3

您提到的服务器确实使用了与我在其他答案中描述的 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,看起来您可以setSSLContext在构建以下实例时调用AsyncHttpClientConfig

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

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

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

于 2014-01-08T06:30:22.817 回答