PKCS12ファイルがWebブラウザまたはWindowsストアにインポートされると、ユーザーは秘密鍵のパスワードの入力を求められます。ブラウザまたはオペレーティングシステムはこのパスワードをどのように管理しますか?安全ですか?
プロンプトが表示されたパスワードは、PKCS#12ファイル自体をロックするために使用されるパスワードです。 PKCS#12 ファイルは実際にはかなり一般的なアーカイブであり、多くの方法で拡張可能ですが、実際には、秘密鍵と証明書のパスワードで保護されたコンテナーです。 「パスワード保護」は実際にはパスワードベースの暗号化です:パスワードは 鍵導出関数 を使用して暗号化キーに変換されます-その場合は PBKDF2 です。
PBKDF2は、本質的に低速であるため、ブルートフォース攻撃からパスワードを保護しようとします。反復回数は構成可能であり、PKCS#12ファイルを生成したシステムによって選択されました。反復回数が多いほど、セキュリティが高くなり(各パスワードの試行コストが高くなるため)、使用コストも高くなります(各パスワードの試行回数が高くなるため)。
いずれにせよ、パスワードがユーザーから要求され、PBKDF2で暗号化キーに変換されると、PKCS#12ファイルの内容が復号化されます(コンピューターのRAM)で)。その後に発生するのは、PKCS#12ファイルとはまったく関係ありません。このファイルは単なる転送容器です。コンピューターのRAMに秘密鍵が含まれると、PKCS#12ファイル(およびそのパスワード)は使用できなくなります。 importを実行している場合、ブラウザまたはオペレーティングシステムが秘密鍵の保存と保護を担当しており、 PKCS#12ファイルまたはそのパスワードの影響を受けます。Windows(したがってInternet Explorer)は、セッションパスワードで暗号化された秘密鍵を保存しようとしますが、パスワードを追加することもできます。
高レベルの観点から、マシンに秘密鍵をインポートしている場合、これは次のことを意味します。
一般に、この種のことは最適ではないと見なされます。キーがあなたのものである場合、それはあなた自身のコンピュータで生成されるべきであり、秘密キーは決してそれを離れてはなりません。推奨されるPKIの使用シナリオは、コンピューターでキーペアを生成し、publicキーをCAに(証明書要求の一部として)送信することです。新しく発行された証明書を受け取ります。そのシナリオでは、公開情報のみが移動し、PKCS#12ファイルはまったくありません。
Thomasm Porninの回答に追加するには、OpenSSLによって作成されたPKCS#12を検討して、1つ以上の証明書と秘密鍵を保持します。
証明書はセットとして暗号化されますデフォルトでは RC2と40ビットキー(_"rc2-40-cbc"
_)。キーは、パスワード、8バイトのランダムソルト、およびPKCS#5 v1.5(_"PBE-SHA1-RC2-40"
_)を使用したSHA1の2048回の反復から取得されます。
これは、パスワードバイトとソルトバイトを単純に組み合わせて、SHA1ハッシュを再帰的に計算します。最終ハッシュの最初の5バイトはRC2キーで、次の8バイトはIVです。
秘密鍵は暗号化されますデフォルトでは 3DES(_"des-ede3-cbc"
_)を使用します。キーは、パスワード、8バイトのランダムソルト(証明書に使用されたソルトとは異なる)、およびPKCS#12 PBE(_"PBE-SHA1-3DES"
_を使用したSHA1の2048回の反復)から取得されます。 )。これはもう少し複雑です。
キーとIVは、既知のさまざまな開始点から個別に導出されます。また、パスワードをビッグエンディアンのUnicodeに変換します。しかし、多かれ少なかれ、それは再帰的に計算されたSHA1ハッシュであり、最後のハッシュの最初のバイトがキーまたはIVを与えます。
OpenSSLにPKCS#5 v2.0、別名 PBKDF2 を使用するように特に依頼する必要があります。たとえば、 コマンドライン で_keypbe alg
_、および/または_certpbe alg
_:
これらのオプションを使用すると、秘密鍵と証明書の暗号化に使用するアルゴリズムを選択できます。任意のPKCS#5 v1.5またはPKCS#12 PBEアルゴリズム名を使用できます(詳細については、「注」セクションを参照してください)。暗号名(list-cipher-algorithmsコマンドによって出力されるものが指定されている場合は、PKCS#5 v2.0で使用されます。相互運用性の理由から、PKCS#12アルゴリズムのみを使用することをお勧めします。
PKCS#12ファイル自体は暗号化されていません。それを読んで、両方の場合に使用されているPBEと暗号を見つけることができます(証明書と秘密鍵の場合)。ソルトと反復回数の両方を読み取ることもできます。したがって、秘密鍵は、PBE、ソルト、反復、暗号、および暗号文を知っているブルートフォース攻撃と同じくらい安全です 。それでも、それは乗り越えるにはかなり大きなハードルです。
注:PBE-SHA1-RC2-40が気に入らないため、FIPS-140準拠のソフトウェアからデフォルトのPKCS#12をインポートできない場合があります。 OpenSSLには、証明書の暗号化のためにPBE-SHA1-3DESを要求するコマンドラインスイッチdescert
があります( 上記のリンク を参照)。