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权威指南》
最后更新于 2017-11-24 12:22:30 并被添加「」标签,已有 2120 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处