Golang配置的ECDHE类TLS密码套件为何未在Nmap扫描中显示?
为什么Golang TLS配置中的ECDHE密码套件未在Nmap扫描中显示?
我用Golang 1.19搭建了一个Web服务器,将最低TLS版本配置为1.2,并指定了一组包含ECDHE类的密码套件:
config := &tls.Config{ Certificates: certs, MinVersion: tls.VersionTLS12, CipherSuites: []uint16{ tls.TLS_RSA_WITH_AES_256_CBC_SHA, tls.TLS_RSA_WITH_AES_256_GCM_SHA384, tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, }, }
部署到Linux服务器后用Nmap扫描,结果却只显示了RSA类的密码套件:
> nmap --script ssl-enum-ciphers -p 443 myserver.mydomain.com Starting Nmap 6.40 ( http://nmap.org ) at 2023-07-31 07:24 PDT Nmap scan report for myserver.mydomain.com (<IP redacted>) Host is up (0.00052s latency). PORT STATE SERVICE 443/tcp open https | ssl-enum-ciphers: | TLSv1.2: | ciphers: | TLS_RSA_WITH_AES_256_CBC_SHA - strong | TLS_RSA_WITH_AES_256_GCM_SHA384 - strong | compressors: | NULL |_ least strength: strong Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds
配置中的ECDHE类密码套件未出现在扫描结果中,这是什么原因?
原因及解决方法
ECDHE_RSA系列的密码套件需要服务器支持椭圆曲线密钥交换流程,你的配置缺少了关键参数导致套件被自动排除:
核心原因
Go的TLS库在仅配置RSA证书且未指定CurvePreferences时,会自动过滤依赖EC密钥交换的ECDHE_RSA套件——因为服务器无法完成椭圆曲线密钥协商的必要步骤。修复方案
在tls.Config中添加CurvePreferences字段,指定服务器支持的椭圆曲线(比如常用的P256、P384),修改后的配置如下:
config := &tls.Config{ Certificates: certs, MinVersion: tls.VersionTLS12, CipherSuites: []uint16{ tls.TLS_RSA_WITH_AES_256_CBC_SHA, tls.TLS_RSA_WITH_AES_256_GCM_SHA384, tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, }, // 添加椭圆曲线偏好配置 CurvePreferences: []tls.CurveID{ tls.CurveP256, tls.CurveP384, }, }
- 验证方式
修改配置重启服务器后,可用openssl命令测试ECDHE套件是否生效:
如果能成功建立连接,说明套件已启用,此时再用Nmap扫描就能看到对应的ECDHE类套件了。openssl s_client -connect myserver.mydomain.com:443 -cipher ECDHE-RSA-AES256-GCM-SHA384
内容的提问来源于stack exchange,提问作者Shaul Behr
相关产品推荐
相关产品推荐

