web-dev-qa-db-ja.com

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がどこで使用されているかを調べて無効にしたりできますか?

6
ciso

私は答えを見つけました。

TLSのデフォルトの暗号は次のとおりです。

ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL

これは、tls.DEFAULT_CIPHERSプロパティを確認することでわかりました。

RC4が含まれていることに注意してください。

したがって、httpsのデフォルトの暗号は問題ありませんでしたが、tlsには独自の暗号のデフォルトがあります。

2
ciso

レジストリのすべてを無効にしても、RC4(IIS/IE)のWindowsコンポーネントの使用に影響するだけです。 IIS暗号も関連していません-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が有効になっていると表示される場合は、他の暗号スイートの1つを無効にして、実際に使用されているコードを実際に変更していることを確認してください。変更がない場合は、Fiddlerに切り替えて、正しいサーバーと通信していることを確認します。

var agent = new https.Agentと呼ばれる "config"は関係ありません。そのスニペットはhttps.Agent(クライアント)を作成し、接続する暗号を指定します。その後、サーバーから提供された場合は、これらの暗号の1つに接続します。興味深い部分は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. RC4のみを受け入れるようにFiddlerを設定する

FiddlerがRC4に接続する場合、いくつかのコードを変更する必要があります。 FiddlerがRC4に接続できず、SSL Labsも接続できる場合は、node.jsとSSL Labsの間にプロキシー(または何か他のもの!)があります。

更新:Fiddlerの設定が難しい場合-サーバーが受け入れる暗号を確認するための実用的なツールが Superuser にあります=

5
Claus Andersen

レジストリの設定はブラウザにのみ影響するので、node.jsで暗号を設定する必要があります。これは私のために働いたものです:

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