如何从Windows 2012 R2上运行的node.js https服务器上删除RC4密码

使用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 

我按照这些说明禁用了registry中的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扫描结果没有差异。

我怀疑它与节点configuration有关,但是即使指定如上所述的密码列表仍然导致扫描说RC4正在使用。

我如何诊断这个禁用RC4或找出它在哪里使用,所以我可以禁用它?

禁用registry中的任何内容只会影响使用Windows组件RC4(IIS / IE)的内容。 IISencryption也不相关 – 因为您不使用IIS。

但是您正在使用https.createServer构build的https.createServer 所有与RC4相关的设置都将在node.js中发生(因为node.js不关心registry)。

更新的更好的密码已经被添加到node.js中,它将随着下一个版本的node.js自动发布

如果您正在使用node.js 0.12,则从当前源更新您的密码列表 。

看起来您已经正确指定了密码。 但是你确定这是你正在执行的代码吗? 如果您使用node.js 0.12或更高版本,那么默认情况下禁用RC4! 确保一切正常更新和库的顺序。

当你创build内置的服务器实例时,它看起来像这样:

 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,则不应指定密码,而只需使用默认值即可。 但是为了debugging目的,列出它们可能是实际的。

对于简单的debugging,然后简单地继续使用SSL实验室。 如果SSL实验室仍然说RC4已启用 – 然后尝试禁用其他密码套件之一,以确认您实际上正在更改正在使用的实际代码。 如果你看不到改变 – 那么切换到提琴手,以确保我们正在与正确的服务器交谈。

var agent = new https.Agent所谓的“config”是不相关的。 该片段创build一个https.Agent(客户端),并指定您想要连接的密码。 然后,如果从服务器提供这些密码,则会连接其中一个密码。 有趣的部分是https.createServer

了解,当你浏览服务器,并使用Fiddler设置标题 – 那么你做同样的var agent = new https.Agent 。 你要求什么密码套件你想使用。 尝试只使用Fiddler请求RC4,看看是否被接受。 然后,您应该查看服务器返回的内容,以确认您确实在与您认为自己的node.js实例“交谈”!

上面的代码片段和A +的一步一步的说明可以在CertSimplefind

故障排除步骤

  1. validationnode.js版本

  2. validation节点/ lib / tls.js版本

  3. 确认您正在连接到正确的node.js实例(启动/连接/停止/连接)

  4. 设置提琴手只接受RC4

如果提琴手连接RC4 – 那么你需要修改一些代码。 如果Fiddler无法与RC4连接,并且SSL Labs仍然存在,那么您的Node.js和SSL实验室之间就有一个代理(或者其他的东西)。

更新:如果Fiddler太难configuration – 那么可以在超级用户上find一些用于validation服务器接受的密码的实用工具

我认为registryconfiguration只影响浏览器,所以你需要在node.js设置你的密码。 这对我来说是有效的:

 var agent = new https.Agent({ "key": key, "cert": cert, "ciphers": 'EECDH+AES128:EECDH+3DES:EDH+3DES:!SSLv2:!MD5:!DSS:!aNULL', "honorCipherOrder": true }); 

我想出了答案。

TLS的默认密码是:

ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:A零位

我通过检查tls.DEFAULT_CIPHERS属性find了这个。

包括通知RC4。

所以https的默认密码是好的,但是tls有它自己的密码默认值。