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がどこで使用されているかを調べて無効にしたりできますか?
私は答えを見つけました。
TLSのデフォルトの暗号は次のとおりです。
ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL
これは、tls.DEFAULT_CIPHERSプロパティを確認することでわかりました。
RC4が含まれていることに注意してください。
したがって、httpsのデフォルトの暗号は問題ありませんでしたが、tlsには独自の暗号のデフォルトがあります。
レジストリのすべてを無効にしても、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 にあります
トラブルシューティングの手順:
Node.jsのバージョンを確認する
Node/lib/tls.jsのバージョンを確認する
正しいnode.jsインスタンスに接続していることを確認します(開始/接続/停止/接続)
RC4のみを受け入れるようにFiddlerを設定する
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
});