DH密钥长度导致的SSL无法建立通信

Diffie-Hellman (DH) 密钥长度,Nginx默认是1024位 , Apache 从2.4.7版本开始会自动调整DH密钥交换的强度来匹配相应的私钥的强度。


问题背景

话说某支付客户接入防御平台之后报障,他们的用户支付的钱已经成功了,但是却一直不显示金额。多番排障,客户的回调域名SSL建立失败,银行请求防御节点的时候报错: “Could not generate dh keypair”

原因

银行的jdk版本太低,用的是jdk6,只支持1024位。

解决方法

Apache :

使用openssl命令生成一段1024位的参数,追加到证书的末端,然后在Apached的配置文件指定添加了参数的证书。

# openssl dhparam 1024 

# cat server.crt
...
-----BEGIN DH PARAMETERS-----
MIGHAoGBAP//////////yQ/aoiFowjTExmKLgNwc0SkCTgiKZ8x0Agu+pjsTmyJR
Sgh5jjQE3e+VGbPNOkMbMCsKbfJfFDdP4TVtbVHCReSFtXZiXn7G9ExC6aY37WsL
/1y29Aa37e44a/taiZ+lrp8kEXxLH+ZJKGZR7OZTgf//////////AgEC
-----END DH PARAMETERS-----

SSLCertificateFile "/usr/local/apache2/conf/ssl.crt/server.crt"

Nginx :

Nginx不能像Apache一样通过在证书末端添加DH参数的方法修改,必须修改配置文件。
正常情况下,为了安全性,我们会把DH参数改成4096位,如下所示

ssl_dhparam         keys/dhparam-4096.pem;

可以为单独的站点调用,先用openssl命令生成新的1024参数文件,然后在该站点引用新的参数文件

# openssl dhparam 1024 -out dhparam-1024.pem
ssl_dhparam         keys/dhparam-1024.pem;

参考文档
[1] http://httpd.apache.org/docs/current/ssl/ssl_faq.html#javadh
[2] http://httpd.apache.org/docs/current/mod/mod_ssl.html#sslcertificatefile
[3] 《HTTPS权威指南》

发表新评论