キーストアのタイプ:どれを使用しますか?


115

java.securitymy のファイルJREを見ると、デフォルトで使用するキーストアタイプがに設定されていることがわかりますJKSここでは、使用できるキーストアのタイプのリストがあります。

推奨されるキーストアタイプはありますか?さまざまなタイプのキーストアの長所/短所は何ですか?


4
Java 9以降、PKCS12がデフォルトのキーストアタイプです。この変更は、JEP 229の目標に対するものです。「セキュリティの向上。PKCS12は、JKSよりも強力な暗号化アルゴリズムを提供します。」詳細については、「JEP 229:デフォルトでPKCS12キーストアを作成する」、openjdk.java.net / jeps / 229を参照してください。最終アクセス日:2018
。– buzz3791

回答:


142

リンクした標準の名前リストにリストされているタイプよりもいくつかのタイプがあります。詳細については、暗号プロバイダーのドキュメントをご覧ください。最も一般的なのは確かにJKS(デフォルト)とPKCS12(PKCS#12ファイルの場合、多くの場合、拡張子が付い.p12たり、場合によっては.pfx)です。

Javaの世界にいる場合、JKSが最も一般的です。PKCS#12はJava固有ではありません。ブラウザからバックアップされた、またはOpenSSLベースのツールから取得された証明書(プライベートキーを使用)を使用すると特に便利です(keytoolJava 6より前にキーストアを変換してそのプライベートキーをインポートできませんでした)なので、他のツールを使用する必要がありました)。

すでにPKCS#12ファイルがある場合、PKCS12タイプを直接使用する方が簡単なことがよくあります。フォーマットを変換することは可能ですが、キーストアのタイプを直接選択できる場合はほとんど必要ありません。

Java 7では、PKCS12主にキーストアとして役立ちましたが、プライベートキーなしでは証明書エントリを格納できなかったため、トラストストアキーストアとトラストストア違いを参照)にはあまり役立ちませんでした。対照的に、JKS各エントリが秘密鍵エントリである必要はないため、証明書のみを含むエントリを作成できます。これは、信頼できる証明書のリストを保存するトラストストアに役立ちます(ただし、それらの秘密鍵)。

これはJava 8で変更されたため、証明書のみのエントリをPKCS12ストアにも持つことができるようになりました。(これらの変更と詳細な計画の詳細については、JEP 229:Create PKCS12 Keystores by Defaultを参照してください。)

他にもいくつかのキーストアタイプがあり、おそらくあまり使用されません(コンテキストによって異なります)。

  • PKCS11、PKCS#11ライブラリの場合、通常はハードウェア暗号トークンにアクセスしますが、Sunプロバイダの実装は、これを介して(Mozillaからの)NSSストアもサポートします。
  • BKS、BouncyCastleプロバイダー(一般的にAndroidで使用されます)を使用します。
  • Windows-MY/ Windows-ROOT、Windows証明書ストアに直接アクセスする場合。
  • KeychainStore、OSXキーチェーンを直接使用する場合。

7
@ husayt、PEM証明書はキーストアタイプとして直接サポートされていません(KeyStoreそのための実装を記述できると思います)。ただし、CertificateFactoryこの回答に示すように)を使用して、メモリ内のキーストアインスタンス(通常はデフォルトのタイプであるJKS)にその場でロードできます。
Bruno

JKS変化したと思いますJCEKS
両生類2014

5
むしろ重要なこととして、JKSキーストアは秘密キーを保存できません。この使用例では、JCEKSが適切です。回答でこれについて言及する価値があるかもしれません。
Duncan Jones

1
OK。Java 8では、単一の証明書を使用してPKCS#12キーストアを問題なく作成できます。P12の証明書エントリは暗黙的に信頼されていることに注意してください。信頼できない証明書が必要な場合は、複数のキーストアを持つスキームに戻す必要がある場合があります。
Maarten Bodewes

2
少なくともJava 8 PKCS#12の場合、キーストアは秘密キーエントリを保存できません。このようなキーストアを格納すると、ヌルポインター例外が発生します(ugh)。これは、関連する証明書が見つからないためと考えられます。誰かがJoshuaのfail fast codeに関する教えをスキップしたようです。
Maarten Bodewes

22

これは、Javaのさまざまなタイプのキーストアと、さまざまなタイプのキーストアの違いを紹介する投稿です。http://www.pixelstech.net/article/1408345768-Different-types-of-keystore-in-Java----概要

以下は、投稿のさまざまなキーストアの説明です。

JKS、Javaキーストア。このファイルは、sun.security.provider.JavaKeyStoreにあります。このキーストアはJava固有であり、通常はjksの拡張子があります。このタイプの鍵ストアには、秘密鍵と証明書を含めることができますが、秘密鍵の保管には使用できません。これはJava固有のキーストアであるため、他のプログラミング言語では使用できません。

JCEKS、JCEキーストア。このファイルは、com.sun.crypto.provider.JceKeyStoreにあります。このキーストアにはjceksの拡張子があります。JCEKS鍵ストアに入れることができるエントリーは、秘密鍵、秘密鍵、および証明書です。

PKCS12、これはJavaおよびその他の言語で使用できる標準のキーストアタイプです。このキーストアの実装は、sun.security.pkcs12.PKCS12KeyStoreにあります。通常、p12またはpfxの拡張子があります。このタイプの秘密鍵、秘密鍵、および証明書を保管できます。

PKCS11、これはハードウェアキーストアタイプです。これは、JavaライブラリがLuna、nCipherなどのハードウェアキーストアデバイスに接続するためのインターフェースを提供します。この実装は、sun.security.pkcs11.P11KeyStoreにあります。キーストアをロードするときに、特定の構成で特定のプロバイダーを作成する必要はありません。このキーストアは、秘密鍵、秘密鍵、および証明書を格納できます。キーストアをロードすると、エントリはキーストアから取得され、ソフトウェアエントリに変換されます。


@ peci1これらのキーストアの使用方法に関するチュートリアルを書く予定です。これまでのところ、JKSの投稿を1つ作成しました。pixelstech.net
article /…

@PixelsTech私はこれを見つけて、残りはどこにあるのだろうと思っていました:)だから私は楽しみにしています;)ありがとう
Martin Pecka

1
@ peci1今日はJCEKSとPKCS12を取り上げました。PKCS11の場合、ハードウェアと追加の構成が含まれるため、構成するのにさらに時間がかかります。pixelstech.net/article/...pixelstech.net/article/...
PixelsTech

うわー、それは超高速です!どうもありがとう。
Martin Pecka

5

Java 8以降を使用している場合はPKCS12、Java 9以降のデフォルト(JEP 229)を必ず選択してください。

比べて利点JKSとはJCEKS、次のとおりです。

  • 秘密鍵、秘密鍵、証明書を保存できます
  • PKCS12標準形式です。他のプログラムやライブラリで読み取ることができます1
  • セキュリティの向上:かなり安全JKSJCEKSはありません。これは、特にAndroid開発者の間で人気のある、これらのタイプのキーストアのパスワードをブルートフォースで強制するための多数のツールで見ることができます。2、3

1 Java 11で修正されたJDK-8202837があります。

2すべてのキーストアタイプ(PKCS12を含む)で使用されるPBEの反復回数は以前は週(CVE-2017-10356でしたが、これは9.0.1、8u151、7u161、および6u171で修正されています

3さらに読むために:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.