如何從執行在 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
我已經按照這些說明在系統資料庫中禁用了 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 或找出它在哪裡使用以便我可以禁用它?
禁用系統資料庫中的任何內容只會影響使用 RC4 (IIS/IE) 的 Windows 組件的內容。IIS Crypto 也不相關 - 因為您沒有使用 IIS。
但是您使用的是內置的
https.createServer
node.js。所有與 RC4 相關的設置都將在 node.js 中進行(因為 node.js 不關心系統資料庫)。更新更好的密碼已添加到 node.js 中,它將在node.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+*的分步說明可以在CertSimple找到
故障排除步驟:
- 驗證 node.js 版本
- 驗證 node/lib/tls.js 版本
- 驗證您正在連接到正確的 node.js 實例(開始/連接/停止/連接)
- 將 Fiddler 設置為僅接受 RC4
如果 Fiddler 與 RC4 連接 - 那麼您需要修改一些程式碼。如果 Fiddler 無法與 RC4 連接 - SSL Labs 仍然如此 - 那麼您的 node.js 和 SSL Labs 之間有一個代理(或其他東西!)。
更新: 如果 Fiddler 太難配置 - 那麼可以在Superuser上找到一些實用工具來驗證伺服器接受的密碼
我認為系統資料庫配置只影響瀏覽器,因此您需要將密碼設置為
node.js
. 這對我有用:var agent = new https.Agent({ "key": key, "cert": cert, "ciphers": 'EECDH+AES128:EECDH+3DES:EDH+3DES:!SSLv2:!MD5:!DSS:!aNULL', "honorCipherOrder": true });