使用 ssllabs.com 的扫描显示我正在使用 RC4。我读到 Windows 2012 R2 中应该默认禁用 RC4。我正在使用 https.createServer 运行 node.js 服务器,并且没有指定密码(将其设置为默认)
ssllabs.com 说:
This server accepts the RC4 cipher, which is weak
TLS_RSA_WITH_RC4_128_SHA (0x5) WEAK
TLS_ECDHE_RSA_WITH_RC4_128_SHA (0xc011) WEAK
我已根据以下说明在注册表中禁用 RC4:http://windowsitpro.com/windows/disabling-rc4-cipher
我还尝试在节点 createHttpsServer 中指定密码,如下所示:
ciphers:
[ "ECDHE-RSA-AES128-GCM-SHA256",
"ECDHE-ECDSA-AES128-GCM-SHA256",
"ECDHE-RSA-AES256-GCM-SHA384",
"ECDHE-ECDSA-AES256-GCM-SHA384",
"DHE-RSA-AES128-GCM-SHA256",
"ECDHE-RSA-AES128-SHA256",
"DHE-RSA-AES128-SHA256",
"ECDHE-RSA-AES256-SHA384",
"DHE-RSA-AES256-SHA384",
"ECDHE-RSA-AES256-SHA256",
"DHE-RSA-AES256-SHA256",
"HIGH",
"!aNULL",
"!eNULL",
"!EXPORT",
"!DES",
"!RC4",
"!MD5",
"!PSK",
"!SRP",
"!CAMELLIA"
].join(':'),
honorCipherOrder: true
仍然收到相同的消息,说 RC4 正在使用中,我的成绩从 B 下降到 C,所以设置 node.js 密码列表确实有影响。
单击最佳实践选项后,使用 IIS Crypto 禁用 RC4 密码不会导致我的 ssllabs 扫描结果发生变化。
我怀疑这与节点配置有关,但即使指定如上所述的密码列表,仍然会导致扫描显示正在使用 RC4。
我该如何诊断这个问题以禁用 RC4 或找出它在哪里使用以便我可以禁用它?
答案1
禁用注册表中的任何内容只会影响使用 RC4 (IIS/IE) 的 Windows 组件的内容。IIS Crypto 也不相关 - 因为您没有使用 IIS。
但是你正在使用内置的node.js。https.createServer
所有与RC4相关的设置都将在node.js中进行(因为node.js不关心注册表)。
更新更好的密码已添加到 node.js 中,它将在下一个版本中自动发布节点.js
如果你正在使用 node.js 0.12,那么更新你的密码列表来自当前来源。
看起来您已经正确指定了密码。但您确定这是您正在执行的代码吗?如果您使用的是 node.js 0.12 或更高版本,则默认情况下禁用 RC4!确保所有内容都已正确更新并且库已准备就绪。
当您创建内置服务器实例时它看起来像这样:
var server = https.createServer({
key: privateKey,
cert: certificate,
ca: certificateAuthority,
// default node 0.12 ciphers with RC4 disabled!!!
ciphers: [
"ECDHE-RSA-AES256-SHA384",
"DHE-RSA-AES256-SHA384",
"ECDHE-RSA-AES256-SHA256",
"DHE-RSA-AES256-SHA256",
"ECDHE-RSA-AES128-SHA256",
"DHE-RSA-AES128-SHA256",
"HIGH",
"!aNULL",
"!eNULL",
"!EXPORT",
"!DES",
"!RC4",
"!MD5",
"!PSK",
"!SRP",
"!CAMELLIA"
].join(':'),
honorCipherOrder: true
}, app);
如果您使用的是较新的 node.js,则不应指定密码,而应使用默认值。不过,出于调试目的,列出它们可能很实用。
对于简单的调试,只需继续使用 SSL Labs。如果 SSL Labs 仍然显示已启用 RC4 - 然后尝试禁用其他密码套件之一,以验证您是否确实更改了正在使用的实际代码。如果您没有看到任何变化 - 然后切换到 Fiddler 以确保我们正在与正确的服务器通信。
所谓var agent = new https.Agent
的“配置”不相关。该代码片段正在创建一个 https.Agent(客户端)并指定您想要连接的密码。然后,如果服务器提供这些密码之一,您将使用它们进行连接。有趣的部分是https.createServer
了解当您浏览服务器并使用 Fiddler 设置标头时 - 那么您所做的与 相同var agent = new https.Agent
。您请求要使用的密码套件。尝试仅使用 Fiddler 请求 RC4,看看是否被接受。然后您应该查看从服务器返回的内容,以验证您是否确实在与您认为的 node.js 实例“交谈”!
上面的代码片段和分步说明A+可以在这里找到证书简单
故障排除步骤:
验证 node.js 版本
验证 node/lib/tls.js 版本
验证您是否连接到正确的 node.js 实例(启动/连接/停止/连接)
将 Fiddler 设置为仅接受 RC4
如果 Fiddler 使用 RC4 连接 - 那么您需要修改一些代码。如果 Fiddler 无法使用 RC4 连接 - 而 SSL Labs 仍然可以 - 那么您的 node.js 和 SSL Labs 之间就有一个代理(或其他东西!)。
更新: 如果 Fiddler 难以配置,那么可以在以下位置找到一些实用工具来验证服务器接受的密码超级用户
答案2
我认为注册表配置只会影响浏览器,因此您需要在中设置密码node.js
。这对我有用:
var agent = new https.Agent({
"key": key,
"cert": cert,
"ciphers": 'EECDH+AES128:EECDH+3DES:EDH+3DES:!SSLv2:!MD5:!DSS:!aNULL',
"honorCipherOrder": true
});
答案3
我找到答案了。
TLS 的默认密码是:
ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL
我通过检查 tls.DEFAULT_CIPHERS 属性发现了这一点。
注意包含 RC4。
因此 https 的默认密码很好,但是 tls 有其自己的密码默认值。