“SSL/TLS服务器瞬时Diffie-Hellman公共密钥过弱”
网站进行了https的部署,证书和秘钥都是用keytool生成的,但有不少人用最新版本的Google浏览器进行访问的时候报错:“服务器的瞬时 Diffie-Hellman 公共密钥过弱”
SSL/TLS协议是一种基于SSL/TLS协议的安全通信协议,广泛应用于互联网和企业内部网络中。Diffie-Hellman协议作为SSL/TLS协议的一部分,用于保证通信双方交换的密钥是安全的。然而,在实际使用中,Diffie-Hellman公共密钥存在一些弱点,可能对通信安全造成潜在的威胁。
原理
Diffie-Hellman协议用于生成公共密钥对,以确保通信双方交换的密钥是安全的。其原理是:在两个节点之间交换一些随机数,然后使用这些随机数计算出一个固定的椭圆曲线参数(ECC),接着生成两个大质数p和q,它们将成为Diffie-Hellman密钥交换的基础。在实际使用中,由于计算ECC的过程中可能存在误差,导致生成的密钥可能存在一定程度的弱点。
解决方案
为了解决Diffie-Hellman公共密钥过弱的问题,我们可以采取以下措施:
1、增加密钥长度:为了提高密钥的安全性,可以增加密钥长度。具体实现方法如下:一种简单的方法是将原始椭圆曲线参数扩展为n个点,每个点的离散距离为r=h/(2^n),其中h为大素数。另一种更复杂的方法是使用RSA加密算法中的大质数分解技术生成两个大质数p和q。这些大质数将成为Diffie-Hellman密钥交换的基础。
2、选择更好的证书:为了避免证书被伪造或篡改,可以选择更好的证书。具体实现方法如下:首先选择可信任的证书颁发机构(CA),并确保其颁发的证书是真实有效的。然后,要求CA对证书进行强制性检查和验证,以确保其有效性和完整性。
3、使用Diffie-Hellman签名:为了保证通信双方交换的密钥是安全的,可以使用Diffie-Hellman签名来验证密钥交换过程中是否存在误差。具体实现方法如下:首先计算出每个节点生成的随机数a和b,并使用公钥对它们进行加密生成公钥(e和d)。接着计算出私钥(d和c)并进行签名,即e和d”,j。通信双方将这两个签名与发送方交换的私钥对比,如果相同则认为无误差发生;如果不相同,则存在误差存在需要进行重传。
具体操作:
升级到最新的中间件版本,如JDK版本(8.0以上),就可以立刻解决该问题。
如果没有办法升级JDK,可以采用调整服务器加密套件的配置来解决。
-
Apache服务器相关配置
-
首先生成大于1024bit(例如2048bit)的dhkey:
openssl dhparam -out dhparams.pem 2048 -
然后在对应服务器中配置Apache2.4.8及以后版本 使用如下配置命令配置(
http.conf中或者对应的虚拟主机配置文件中添加)
SSLOpenSSLConfCmd DHParameters “{path to dhparams.pem}” -
Apache2.4.7版本、Apache2.2.31版本及以后版本、redhat debian等大多发行版中最新Apache2.2.x:通过把dhparams.pem的内容直接附加到证书文件后面
-
Apache2.4.7之前2.4.x版本、Apache2.2.31之前版本、dhparam默认为1024bit 无法修改
-
-
Nginx服务器相关配置
- 首先生成大于1024bit(例如2048bit)的dhkey:
openssl dhparam -out dhparams.pem 2048 - nginx使用如下命令配置(在对应的虚拟主机配置文件nginx.conf中server字段内添加)
ssl_dhparam {path todhparams.pem}cd /usr/local/nginx/conf openssl dhparam -out dhparams.pem 2048 chmod -R 755 dhparams.pem
- 首先生成大于1024bit(例如2048bit)的dhkey:
-
Tomcat服务器相关配置
- 基于Java 1.6,请在Server.xml中增加以下ciphers配置:
<Connector port=”443″ protocol=”org.apache.coyote.http11.Http11Protocol” …… ciphers=”TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_3DES_EDE_CBC_SHA”></connector> - 基于Java 7,请在Server.xml中增加以下ciphers配置:
<Connector port=”443″ protocol=”org.apache.coyote.http11.Http11Protocol” …… ciphers=”TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,SSL_RSA_WITH_3DES_EDE_CBC_SHA”></connector> - 如果以上不生效,可以尝试以下方法:
- 替换JAVA_HOME/jre/lib/security/下的两个加密套件
local_policy.jar US_export_policy.jar - 在部署单点的那个服务器中的tomcat的
conf/server.xml的8443端口配置中加入下面这个:sslEnabledProtocols = "TLSv1,TLSv1.1,TLSv1.2" ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA"
- 替换JAVA_HOME/jre/lib/security/下的两个加密套件
- 基于Java 1.6,请在Server.xml中增加以下ciphers配置:
-
Weblogic服务器相关配置
找到config.xml文件,修改编辑其中
参数,增加: <ciphersuite>TLS_RSA_WITH_3DES_EDE_CBC_SHA</ciphersuite> <ciphersuite>TLS_RSA_WITH_AES_128_CBC_SHA</ciphersuite>还可以在Chrome浏览器“右键–》属性”增加如下配置:
“C:\Program Files\Google\Chrome\Application\chrome.exe” –cipher-suite-blacklist=0x0088,0x0087,0x0039,0x0038,0x0044,0x0045,0x0066,0x0032,0x0033,0x0016,0x0013如果服务器配置无法修改,例如2.31之前版本,可以禁用DHE系列算法,采用保密性更好的ECDHE系列算法,如果ECDHE不可用可以采用普通的 RSA。
-
ssh
该漏洞是DHE算法协议漏洞,openssh不涉及该漏洞。咱们的sshd默认不开启这个算法,如果扫描出来这个漏洞可以通过修改配置文件来禁用:
修改sshd的配置文件/etc/ssh/sshd_config,在Kexalgorithms关键字的配置项中删除diffie hellman的相关字段(diffie-hellman-group-exchange-sha256)来禁用DHE算法,重启sshd服务即可不受攻击。
影响:在算法层面修复客户端的兼容性会产生较大影响,比如一些只支持diffie-hellman协议的客户端无法连接。 -
Springboot
建议修改Springboot配置文件
application.yml添加“server.ssl.enabled-protocols: TLSv1,TLSv1.1,TLSv1.2 ciphers: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_RC4_128_SHA”