使用OpenSSL执行Diffie-Hellman密钥交换时报密钥不匹配错误如何解决?
问题根因
你遇到的报错核心原因是两台设备使用了不同的DH公共参数。Diffie-Hellman密钥交换的前提是通信双方必须使用完全相同的素数p、生成元g参数集,你现在两台机器各自生成了独立的DH参数,所以在密钥派生阶段触发了参数校验不通过的错误,和报错日志里的different parameters提示完全对应。
你可以直接对比两台机器的dhp.pem文件内容,显然参数块完全不同,这就是错误的来源。
修复步骤
- 仅在任意一台机器上生成一次DH参数文件
dhp.pem,将该文件完整复制到另一台机器,保证两台设备使用的参数完全一致 - 两台机器都基于这个统一的
dhp.pem生成各自的公私钥对:
机器1执行命令:
机器2执行命令:# 生成私钥 openssl genpkey -paramfile dhp.pem -out dhkey1.pem # 导出公钥 openssl pkey -in dhkey1.pem -pubout -out dhpub1.pem# 生成私钥 openssl genpkey -paramfile dhp.pem -out dhkey2.pem # 导出公钥 openssl pkey -in dhkey2.pem -pubout -out dhpub2.pem - 互相交换公钥后再执行密钥派生操作即可正常得到共享密钥。
验证方法
两边派生完成后可以对共享密钥做哈希比对,输出一致则说明操作成功:
机器1执行:
openssl pkeyutl -derive -inkey dhkey1.pem -peerkey dhpub2.pem | hexdump -C
机器2执行:
openssl pkeyutl -derive -inkey dhkey2.pem -peerkey dhpub1.pem | hexdump -C
内容的提问来源于stack exchange,提问作者aze2201
相关产品推荐
相关产品推荐

