为什么Node.js的TLS支持的加密算法与openssl支持的加密算法不一致?

3
根据openssl的说明,以下是它支持的密码套件:
 DHE-RSA-AES256-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA1
 DHE-DSS-AES256-SHA      SSLv3 Kx=DH       Au=DSS  Enc=AES(256)  Mac=SHA1
 AES256-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA1
 EDH-RSA-DES-CBC3-SHA    SSLv3 Kx=DH       Au=RSA  Enc=3DES(168) Mac=SHA1
 EDH-DSS-DES-CBC3-SHA    SSLv3 Kx=DH       Au=DSS  Enc=3DES(168) Mac=SHA1
 DES-CBC3-SHA            SSLv3 Kx=RSA      Au=RSA  Enc=3DES(168) Mac=SHA1
 DES-CBC3-MD5            SSLv2 Kx=RSA      Au=RSA  Enc=3DES(168) Mac=MD5 
 DHE-RSA-AES128-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA1
 DHE-DSS-AES128-SHA      SSLv3 Kx=DH       Au=DSS  Enc=AES(128)  Mac=SHA1
 AES128-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(128)  Mac=SHA1
 RC2-CBC-MD5             SSLv2 Kx=RSA      Au=RSA  Enc=RC2(128)  Mac=MD5 
 RC4-SHA                 SSLv3 Kx=RSA      Au=RSA  Enc=RC4(128)  Mac=SHA1
 RC4-MD5                 SSLv3 Kx=RSA      Au=RSA  Enc=RC4(128)  Mac=MD5 
 RC4-MD5                 SSLv2 Kx=RSA      Au=RSA  Enc=RC4(128)  Mac=MD5 
 EDH-RSA-DES-CBC-SHA     SSLv3 Kx=DH       Au=RSA  Enc=DES(56)   Mac=SHA1
 EDH-DSS-DES-CBC-SHA     SSLv3 Kx=DH       Au=DSS  Enc=DES(56)   Mac=SHA1
 DES-CBC-SHA             SSLv3 Kx=RSA      Au=RSA  Enc=DES(56)   Mac=SHA1
 DES-CBC-MD5             SSLv2 Kx=RSA      Au=RSA  Enc=DES(56)   Mac=MD5 
 EXP-EDH-RSA-DES-CBC-SHA SSLv3 Kx=DH(512)  Au=RSA  Enc=DES(40)   Mac=SHA1 export
 EXP-EDH-DSS-DES-CBC-SHA SSLv3 Kx=DH(512)  Au=DSS  Enc=DES(40)   Mac=SHA1 export
 EXP-DES-CBC-SHA         SSLv3 Kx=RSA(512) Au=RSA  Enc=DES(40)   Mac=SHA1 export
 EXP-RC2-CBC-MD5         SSLv3 Kx=RSA(512) Au=RSA  Enc=RC2(40)   Mac=MD5  export
 EXP-RC2-CBC-MD5         SSLv2 Kx=RSA(512) Au=RSA  Enc=RC2(40)   Mac=MD5  export
 EXP-RC4-MD5             SSLv3 Kx=RSA(512) Au=RSA  Enc=RC4(40)   Mac=MD5  export
 EXP-RC4-MD5             SSLv2 Kx=RSA(512) Au=RSA  Enc=RC4(40)   Mac=MD5  export

我正在端口443上运行一个简单的node.js https服务器。当我运行sslscan时,以下是Accepted密码:

 Accepted  SSLv3  256 bits  AES256-SHA
 Accepted  SSLv3  128 bits  AES128-SHA
 Accepted  SSLv3  168 bits  DES-CBC3-SHA
 Accepted  SSLv3  128 bits  RC4-SHA
 Accepted  TLSv1  256 bits  AES256-SHA
 Accepted  TLSv1  128 bits  AES128-SHA
 Accepted  TLSv1  168 bits  DES-CBC3-SHA
 Accepted  TLSv1  128 bits  RC4-SHA

我不理解的是,为什么实际支持的密码列表要短得多?

更加令人困惑的是,当我在node中获取支持的密码列表tls.getCiphers()时,我发现有一个很长的列表:

[ 'aes128-gcm-sha256', 'aes128-sha', 'aes128-sha256', 'aes256-gcm-sha384', 'aes256-sha', 'aes256-sha256', 'camellia128-sha', 'camellia256-sha', 'des-cbc-sha', 'des-cbc3-sha', 'dhe-dss-aes128-gcm-sha256', 'dhe-dss-aes128-sha', 'dhe-dss-aes128-sha256', 'dhe-dss-aes256-gcm-sha384', 'dhe-dss-aes256-sha', 'dhe-dss-aes256-sha256', 'dhe-dss-camellia128-sha', 'dhe-dss-camellia256-sha', 'dhe-dss-seed-sha', 'dhe-rsa-aes128-gcm-sha256', 'dhe-rsa-aes128-sha', 'dhe-rsa-aes128-sha256', 'dhe-rsa-aes256-gcm-sha384', 'dhe-rsa-aes256-sha', 'dhe-rsa-aes256-sha256', 'dhe-rsa-camellia128-sha', 'dhe-rsa-camellia256-sha', 'dhe-rsa-seed-sha', 'ecdh-ecdsa-aes128-gcm-sha256', 'ecdh-ecdsa-aes128-sha', 'ecdh-ecdsa-aes128-sha256', 'ecdh-ecdsa-aes256-gcm-sha384', 'ecdh-ecdsa-aes256-sha', 'ecdh-ecdsa-aes256-sha384', 'ecdh-ecdsa-des-cbc3-sha', 'ecdh-ecdsa-rc4-sha', 'ecdh-rsa-aes128-gcm-sha256', 'ecdh-rsa-aes128-sha', 'ecdh-rsa-aes128-sha256', 'ecdh-rsa-aes256-gcm-sha384', 'ecdh-rsa-aes256-sha', 'ecdh-rsa-aes256-sha384', 'ecdh-rsa-des-cbc3-sha', 'ecdh-rsa-rc4-sha', 'ecdhe-ecdsa-aes128-gcm-sha256', 'ecdhe-ecdsa-aes128-sha', 'ecdhe-ecdsa-aes128-sha256', 'ecdhe-ecdsa-aes256-gcm-sha384', 'ecdhe-ecdsa-aes256-sha', 'ecdhe-ecdsa-aes256-sha384', 'ecdhe-ecdsa-des-cbc3-sha', 'ecdhe-ecdsa-rc4-sha', 'ecdhe-rsa-aes128-gcm-sha256', 'ecdhe-rsa-aes128-sha', 'ecdhe-rsa-aes128-sha256', 'ecdhe-rsa-aes256-gcm-sha384', 'ecdhe-rsa-aes256-sha', 'ecdhe-rsa-aes256-sha384', 'ecdhe-rsa-des-cbc3-sha', 'ecdhe-rsa-rc4-sha', 'edh-dss-des-cbc-sha', 'edh-dss-des-cbc3-sha', 'edh-rsa-des-cbc-sha', 'edh-rsa-des-cbc3-sha', 'exp-des-cbc-sha', 'exp-edh-dss-des-cbc-sha', 'exp-edh-rsa-des-cbc-sha', 'exp-rc2-cbc-md5', 'exp-rc4-md5', 'idea-cbc-sha', 'psk-3des-ede-cbc-sha', 'psk-aes128-cbc-sha', 'psk-aes256-cbc-sha', 'psk-rc4-sha', 'rc4-md5', 'rc4-sha', 'seed-sha', 'srp-dss-3des-ede-cbc-sha', 'srp-dss-aes-128-cbc-sha', 'srp-dss-aes-256-cbc-sha', 'srp-rsa-3des-ede-cbc-sh

sslscan 只测试 SSLv2、SSLv3 和 TLS 1.0。因此,您将会错过所有的 TLS 1.2 密码套件,例如 GCM 套件(TLS 1.1 没有添加任何密码套件)。可用列表将进一步修剪,例如 SSL_CTX_set_cipher_list("HIGH:!ADH"); - jww
2个回答

3
第一个列表是 SSLv3 的所有密码集。目前已经定义了 TLS 1.0、TLS 1.1 和 TLS 1.2,因此这些是较旧的密码集。
第二个列表是在握手时客户端(sslscan)和服务器都可用的密码集列表。
最后,最后一个列表似乎是 NodeJS 中存在的(但可能没有配置?)所有密码集的完整列表。
请注意,OpenSSL 文档非常简略且经常过时,并且 NodeJS 的文档稍微好一点。

谢谢。我不明白的是,为什么像“SSLv3 DHE-RSA-AES256-SHA”这样的密码套件在sslscan尝试连接时被拒绝?我的意思是它和node.js一样是基于OpenSSL构建的。 - Ming K
我认为这主要是由于当前的配置和可能匹配密钥的可用性所致(例如,对于DHE,您需要适合签名的密钥)。我不确定OpenSSL在这方面有多聪明。 - Maarten Bodewes
迟了很多但是在nodejs/OpenSSL上使用DHE需要一个签名证书和dhparam值;请查看https://nodejs.org/docs/latest-v14.x/api/tls.html#tls_perfect_forward_secrecy;而ECDHE只需要一个签名证书,这使得它的省略对我来说更加令人惊讶。 - dave_thompson_085

1
Node默认禁用了许多旧的、不安全的密码。您可以在Node文档中查看默认启用的密码(请注意,这可能因使用的Node版本而异)。
正如jww所指出的,您似乎正在使用的sslscan的旧版本不支持TLSv1.1/1.2,因此无法检测到一些较新的密码(例如GCM套件)。更新版本可以解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接