JKS ファイル形式とは?
.jks ファイルは Java KeyStore です。これは、Java アプリケーションで使用される暗号化秘密鍵と X.509 証明書 を保存する独自のバイナリコンテナです。この形式は、1990年代後半に Java Cryptography Architecture (JCA) の一部として Sun Microsystems によって導入され、現在は Oracle によって保守されています。
すべての .jks ファイルは 4 バイトのマジックナンバー 0xFEEDFEED で始まり、その後にバージョンフィールド (通常は 0x00000002) が続きます。ファイルはビッグエンディアンで、2 つのエントリタイプを保持します。暗号化された秘密鍵とその証明書チェーンを含む KeyEntry レコードと、暗号化なしで証明書を保存する TrustedCertEntry レコードです。末尾にあるキー付き SHA-1 ダイジェストが整合性を保護します。パスワードが間違っていたり、改ざんがあったりすると、おなじみの «keystore was tampered with, or password was incorrect» (キーストアが改ざんされたか、パスワードが正しくありません) というエラーが発生します。
秘密鍵は、SHA-1 に基づく独自のパスワードベース暗号化 (PBE) スキームによって保護されていますが、これは現代の基準では脆弱であると見なされています。.jks 形式は Java 専用であり、PKCS#12 または PEM を想定している OpenSSL などのツールでは読み取ることができません。
JDK 9 (2017年) 以降、Oracle は .jks を非推奨とし、新しいデフォルトのキーストアタイプとなった .p12 / .pfx を推奨しています。現在、keytool は JKS ストアを開くたびに移行の警告を表示します。JDK のシステム信頼ストアである cacerts は、歴史的に .jks ファイルとして提供されてきました。関連する .jceks バリアント (マジックナンバー 0xCECECECE) は、より強力な Triple-DES による鍵保護を提供しますが、同様に Java 固有の形式です。
セキュリティと安全性
リスク: MEDIUMJKS ファイルは不活性なデータ (実行可能コードなし) ですが、「秘密」の保管庫です。通常、サーバーの ID やアプリの署名鍵を危険にさらす秘密鍵が含まれています。パスワードファイルのように扱い、公開リポジトリにコミットせず、ファイル権限を制限し、強力なストアパスワードを使用してください。この形式の暗号化は現代の基準では弱いため、パスワードが不十分な状態で .jks が流出するとブルートフォース攻撃を受ける可能性があります。これが PKCS#12 への移行を推奨し、キーストアが公開された場合に鍵を更新すべき理由です。信頼できないソースからのキーストアを信頼ストアとして使用しないでください。
形式の詳細
概要- Star Wars Jedi Knight ゲームのセーブデータ - 一部の LucasArts/Raven の Star Wars Jedi Knight タイトルでは、ゲームの保存に .jks が使用されていました。これらはゲーム内で読み込まれ、Java キーストアとは無関係です。
0xFEEDFEED (FE ED FE ED) で始まり、その後に 4 バイトのバージョンフィールド (通常は 0x00000002) が続きます。関連する JCEKS バリアントはマジックナンバー 0xCECECECE を使用します。一方、PKCS#12 キーストア (.p12/.pfx) は ASN.1 SEQUENCE バイトの 0x30 (多くの場合 30 82) で始まります。これにより、ツールは本物の JKS と、たまたま .jks という名前が付いた PKCS#12 ファイルを区別します。
JKS ファイルを開くプログラム
keytool -list -v -keystore file.jks を実行します (ストアパスワードの入力を求められます)。変更するには -importcert / -genkeypair を使用します。 keytool ではなくゲーム内で読み込まれます。 keytool -list -v -keystore file.jks を実行します (ストアパスワードの入力を求められます)。変更するには -importcert / -genkeypair を使用します。 keytool -list -v -keystore file.jks を実行します (ストアパスワードの入力を求められます)。変更するには -importcert / -genkeypair を使用します。 技術的詳細
詳細仕様| マジックバイト | ファイルオフセット 0 に `0xFEEDFEED` (FE ED FE ED)。ツールやバリデータに対してファイルを JKS として識別します |
| 形式バージョンフィールド | オフセット 4 にある 4 バイトのビッグエンディアン整数。値は 1 または 2 (バージョン 2 が現在の標準) |
| バイト順序 | バイナリ構造全体を通してビッグエンディアン |
| 秘密鍵の暗号化 | SHA-1 を鍵導出プリミティブとして使用する独自の PBE スキーム。現代の暗号基準では脆弱と見なされます |
| 証明書の保存 | TrustedCertEntry レコードは、X.509 DER エンコードされた証明書をプレーンテキストで保持します。証明書ごとの暗号化はありません |
| 整合性保護 | ストアパスワードから派生した、ストアコンテンツ全体に対するキー付き SHA-1 ダイジェスト。改ざんと誤ったパスワードの両方を検出します |
| エントリタイプ | 2 つのタイプ: KeyEntry (暗号化された秘密鍵 + 証明書チェーン) と TrustedCertEntry (証明書のみ) |
| エントリのアドレス指定 | 各エントリは一意の文字列エイリアスによって識別されます。エイリアスはストア内で大文字と小文字を区別しません |
| MIME タイプ | application/x-java-keystore (Java 固有)。一般的な処理では application/octet-stream にフォールバックします |
| 典型的なファイルサイズ | 数個の鍵と証明書で 1 KB ~ 50 KB。cacerts などの大規模な信頼ストアでは数 MB に達することもあります |
| 主な管理ツール | JDK の `keytool` コマンドラインユーティリティ。グラフィカルな代替手段は KeyStore Explorer です |
| プラットフォームの範囲 | JRE または JDK を備えたあらゆる OS でポータブルですが、形式は Java 固有であり、OpenSSL やその他の非 Java PKI ツールとの相互運用性はありません |
| 非推奨ステータス | JDK 9 (2017年) 以降、Oracle により非推奨。現在は PKCS#12 がデフォルトのキーストアタイプであり、`keytool` は JKS ストアが開かれるたびに警告を表示します |
| より強力な Sun バリアント | JCEKS (マジックナンバー 0xCECECECE) - Triple-DES による鍵ラッピングを備えた Sun の拡張形式。依然として Java 専用です |
| システム信頼ストア | すべての JRE に同梱されている JDK の `cacerts` ファイルは、歴史的に数百のルート CA 証明書を保持する JKS キーストアでした |
| リリース日 | 1990s, with the Java security architecture (Java Cryptography Architecture) |
| 最新バージョン | JKS format unchanged; deprecated in favor of PKCS#12 (default keystore type since JDK 9, 2017) |
| 仕様書 | docs.oracle.com |
JKS の変換
コミュニティ Q&A
ユーザーからの質問まだ質問はありません。JKS ファイルについて最初の質問をしてみましょう。
よくある質問
.jks ファイルとは何ですか?
keytool で管理します。JKS ファイルを開くにはどうすればよいですか?
keytool (keytool -list -v -keystore file.jks) を使用するか、KeyStore Explorer のような無料の GUI を使用します。キーストアのパスワードを知っている必要があり、パスワードなしで鍵を読み取る方法はありません。JKS を PKCS12 (.p12/.pfx) に変換するにはどうすればよいですか?
keytool -importkeystore -srckeystore in.jks -srcstoretype JKS -destkeystore out.p12 -deststoretype PKCS12。PKCS#12 は現代的でツール間互換性のある標準であり、Java 9 以降の JDK デフォルトです。なぜ keytool は «keystore was tampered with, or password was incorrect» と言うのですか?
JKS は非推奨ですか?
keytool はデフォルトで PKCS#12 を使用し、JKS が独自の脆弱な形式を使用しているという警告を出します。既存の JKS ファイルは引き続き動作しますが、新しいキーストアや移行には PKCS#12 を使用すべきです。