Security

如何從執行在 Windows 2012 R2 上的 node.js https 伺服器中刪除 RC4 密碼

  • September 21, 2017

使用 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.createServernode.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找到

故障排除步驟:

  1. 驗證 node.js 版本
  2. 驗證 node/lib/tls.js 版本
  3. 驗證您正在連接到正確的 node.js 實例(開始/連接/停止/連接)
  4. 將 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
});

引用自:https://serverfault.com/questions/709762