web-dev-qa-db-ja.com

SSLキーをサーバーに保存するにはどうすればよいですか?

次のようにインスタンス化されたNode.JS HTTPS Webサーバーがあります。

var privateKey = fs.readFileSync('./../ssl/localhost.key').toString();
var certificate = fs.readFileSync('./../ssl/localhost.crt').toString();

https.createServer({
    key: privateKey,
    cert: certificate
}, server).listen(80, 'localhost');

私の秘密鍵は、Node.JSがHTTPSウェブサーバーを作成するために読み取るサーバーにあります。ハッカーがサーバーファイルへの読み取りアクセス権を持っている場合、ハッカーは秘密鍵にアクセスしてWebサーバーになりすますことができます。

秘密鍵をサーバーに保存する必要がありますか? HTTPSサーバーがインスタンス化されたら、破棄する必要がありますか?

21
Randomblue

あなたはあなたの秘密鍵を破壊したくない:あなたがあなたがサーバーを再起動するならばあなたはそれを再び必要とするであろう。時々再起動が発生します...

これは一般的な観察です。サーバーを無人で再起動できるようにするには、サーバーをwantします。したがって、それは秘密鍵を含む必要がありますとその秘密鍵が必要ですサーバーソフトウェアで使用できます。

攻撃者が完全なマシンをハイジャックすると、彼はあなたのキーのコピーを取得します。それは人生の事実です。それと一緒に住んでください。ただし、緩和策があります。

  • SSLには「DHE」暗号スイートを使用できます。これらの暗号スイートでは、サーバー鍵は署名ではなく暗号化に使用されます。つまり、キーを盗んだ攻撃者は、その後偽装してサーバーを偽造できます(つまり、偽のサーバーを実行します)が、以前に記録したSSLセッションを復号化できません。これは Perfect Forward Secrecy と呼ばれる優れたプロパティです。

  • キーを ハードウェアセキュリティモジュール に保存すると、キーは盗まれません。攻撃者は、サーバーを効果的に制御できればキーを操作できますが、キーを抽出することはできません。これは彼の迷惑の力を減らします(しかし、HSMは高価です)。

実際には、秘密鍵を含むファイルが、サーバーを実行するシステムアカウント(UNIXのようなシステムではchownおよびchmod、NTFSアクセス権ではウィンドウズ)。

22
Thomas Pornin

おそらくあなたはnginxのようなリバースプロキシを探しています。これはベストプラクティスと見なされます。

本番環境で実行されているアプリケーションは、通常、ポート80(HTTP)、ポート443(HTTPS)、またはその両方で実行する必要があります。アプリケーションのいくつかのコンポーネントがユーザーと対話する場合、またはポート80でWebサーバーを使用して他のアセットを配信している場合、これは困難な場合があります。これにより、Socket.IOサーバーへのプロキシが必要になり、NGINXがそのための最良の方法です。 - Node.jsおよびSocket.IOでNGINXおよびNGINX Plusを使用する、WebSocket API-nginxブログ

または 本番パート3のためのNODE.JSの強化:NGINXによるゼロダウンタイムデプロイメント

基本的に、秘密鍵を安全に保管しようとしている間は、ロードバランシングやリクエスト制限などの安定したソリューションを探している可能性が高いです。

2
bessbd