私はJava-NSSライブラリに興味があり、 SunのP11ガイド を読んでいます。私は次の点で混乱しています:
PKCS12キーストアとPKCS11キーストアの使用の違いは何ですか?
キーストアは単なるキーストアですよね?違いはありますか?あらゆる面で同じように使用できますか?
PKCS#12は、プライベートキーと証明書を保存できるファイル形式(多くの場合、.p12または.pfxと呼ばれます)です。主にキーと証明書の変換/転送に使用されます。ブラウザから秘密鍵と証明書をエクスポートする場合、おそらくその形式になります。
PKCS#11は、通常、ハードウェア暗号化トークン(多くの場合、スマートカードまたはUSBトークンで、事実上リーダーに埋め込まれたスマートカード)と通信するために使用されるインターフェイスです。このインターフェイスには、キーと証明書を使用するための多くの操作があります。一部のトークンは、キーがデバイスから離れることなく、含まれている秘密キーを使用して署名できます。このインターフェイスのポイントは、PKCS#11が提供する暗号化操作(より具体的には、秘密キーに関連する操作)を実行する必要なく、キーと証明書を処理するものを別個のエンティティとして扱うことです。
NSSでPKCS#11を使用すると、PKCS#11レイヤーの背後にラップされたブラックボックスとしてNSSを効果的に使用します(PKCS#11ハードウェアトークンのソフトウェアプロバイダーになります)。 Javaは他のPKCS#11ライブラリと比較してPKCS#11共有ライブラリを必要としないという点で、PKCS#11を介してNSSを使用する方法にわずかな違いがあります。 、厳密に言えばPKCS#11ではありませんが、非常によく似ています。
Javaでは、PKCS#11ストアからRSAPrivateKey
インスタンスを取得し、それを使用して、モジュラスから何も取得することなく、署名と解読を行うことができます。それを処理するセキュリティプロバイダーは、ライブラリを介して(したがって、ライブラリがハードウェアトークンでサポートされている場合はトークンを介して)署名/解読を行います。
JavaのKeyStore
に戻ると、ファイルからキーと証明書をロードして使用できるAPIです(セキュリティプロバイダーに応じて、JKS、PKCS#12、PEMなどのさまざまなファイル形式を取得できます) )または他の基盤となるAPI(PKCS#11、SunプロバイダーのNSSと多少なりともマージ、またはOSXでKeyChainをKeyStoreとして使用する場合はKeychainStoreなど)から。
Java-Overview の異なるタイプのキーストア)から、PKCS12とPKCS11の違いは次のように説明できます。
PKCS12、これはJavaおよび他の言語で使用できる標準のキーストアタイプです。このキーストアを見つけることができます。 Sun.security.pkcs12.PKCS12KeyStoreでの実装通常はp12またはpfxの拡張子がありますこのタイプで秘密鍵、秘密鍵、証明書を保存できますJKSとは異なり、PKCS12鍵ストアの秘密鍵はJavaで抽出できます。 typeは移植性があり、C、C++、C#などの他の言語で記述された他のライブラリで操作できます。
現在、JavaのデフォルトのキーストアタイプはJKSです。つまり、keytoolでキーストアを作成するときに-storetypeを指定しない場合、キーストア形式はJKSになります。ただし、デフォルトのキーストアタイプは変更されますJKSと比較して互換性が向上しているため、Java 9のPKCS12に。デフォルトのキーストアのタイプは、$ JRE/lib/security/Java.securityファイルで確認できます。
PKCS11、これはハードウェアキーストアタイプです。 SafeNetのLuna、nCipher、スマートカードなどのハードウェアキーストアデバイスと接続するためのJavaライブラリのインターフェイスを提供します。この実装は、Sun.security.pkcs11.P11KeyStoreで見つけることができます。キーストアでは、特定の構成で特定のプロバイダーを作成する必要はありません。このキーストアは秘密鍵、秘密鍵、および証明書を格納できます。キーストアをロードすると、エントリがキーストアから取得され、ソフトウェアエントリに変換されます。