网站进行了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,可以采用调整服务器加密套件的配置来解决。
首先生成大于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 无法修改
openssl dhparam -out dhparams.pem 2048
ssl_dhparam {path todhparams.pem}
cd /usr/local/nginx/conf
openssl dhparam -out dhparams.pem 2048
chmod -R 755 dhparams.pem
<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>
<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>
local_policy.jar
US_export_policy.jar
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"
找到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。
该漏洞是DHE算法协议漏洞,openssh不涉及该漏洞。咱们的sshd默认不开启这个算法,如果扫描出来这个漏洞可以通过修改配置文件来禁用:
修改sshd的配置文件/etc/ssh/sshd_config
,在Kexalgorithms关键字的配置项中删除diffie hellman的相关字段(diffie-hellman-group-exchange-sha256)来禁用DHE算法,重启sshd服务即可不受攻击。影响
:在算法层面修复客户端的兼容性会产生较大影响,比如一些只支持diffie-hellman协议的客户端无法连接。
建议修改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”
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
加入交流群
请使用微信扫一扫!