配布用の秘密鍵を生成するための完全に安全な方法はありません。最も安全な方法は、各クライアントにキーペアを生成させ、公開キーのみを送信させることです。
ただし、それが単に機能しない状況にあり、キーペアを一元的に生成することに専念している場合は、いくつかのオプションがあります。
これを行うハードウェアセキュリティモジュール(HSM)があります。あなたがそれを買う余裕があれば、これは行くための最良の方法です。
それが失敗した場合:
- Webアプリまたはキージェネレータラッパーが独自のユーザーで実行されていることを確認します(この回答の残りの部分では、このユーザーを「kguser」と呼びます)。
- パーミッション0700(chmodで設定)を使用して、kguserが所有するWebアクセス不可能なディレクトリを作成します
- キージェネレータラッパーが「umask0177」を設定していることを確認してください。作成するファイルが0600であることを確認する必要があります(kguserのみが読み取りと書き込みを行うことができます)
- 推測しにくい(ランダムUUIDなど)ファイル名を指定してキーを生成する
- chmod 0600キーファイルを生成するとすぐに、umask設定が保持されないか、変更された場合に備えて
- SSL/TLS接続を介して秘密鍵を送信する
- 秘密鍵ファイルを安全に消去します(例:Linuxの「shred」)
- cronジョブを使用して、数分より古い秘密鍵ファイルを定期的に見つけて安全に消去します(アプリケーションエラー、クラッシュなどのために残っているファイルをクリーンアップするため)
本当に妄想的な場合は、Webアプリケーションで独自の対称鍵を使用して書き込み時に暗号化し、ユーザーに送信するときに復号化することで、ディスク上で鍵が暗号化されるようにすることもできます。ただし、これによりキー管理が失敗する可能性が高くなるため、お勧めしません。
キーにパスフレーズを設定すると、そのパスフレーズをディスクに保存しない場合にも役立ちます。誰かがパスフレーズで保護されたキーをなんとか回復した場合でも、キーが役立つようにパスフレーズを推測する必要があります。ただし、これは、ユーザーがキーを使用するときにパスフレーズを提供する必要があることも意味します。これは、受け入れられる場合と受け入れられない場合があります。