JDK keytool の基本的な使い方 (openssl との対比)
[最終更新] (2019/06/03 00:37:25)
最近の投稿
注目の記事

概要

JDK でインストールされる keytool コマンドの利用方法を、『オレオレ (サーバ/クライアント) 証明書の発行』で利用する openssl コマンドと対比してまとめます。keytool コマンドは、こちらのページで hello world チュートリアルを記載した Android Studio のドキュメントでも使用される、Java における一般的なツールです。

秘密鍵、公開鍵 (、自己署名証明書) の生成

keytool は openssl と異なり、秘密鍵と公開鍵の片方のみを生成することはできず、必ずペアで生成します。例えば、RSA 暗号の秘密鍵だけを生成できないということです。AES 暗号などの共通鍵は生成できます。その際、公開鍵は秘密鍵で署名された自己署名証明書に内包された形式になります。よって、openssl における CSR 相当のものを生成するために必要なコモンネーム CN などの情報が必要になります。情報としては、「秘密鍵、公開鍵 (、自己署名証明書)」が生成されたことになり、独自認証局 CA が構築されたような状況となります。これらは Java KeyStore (JKS) というパスワードが掛けられた入れ物に格納されます。

keytool -genkeypair -keystore mykeystore.jks -alias mykeypair -v -keyalg RSA -keysize 2048 -validity 36500

引数については以下のとおりです。

  • -genkeypair 旧称 genkey です。秘密鍵、公開鍵 (、自己署名証明書) を生成するオプションです。
  • -keystore 出力される Java KeyStore (JKS) ファイル名です。
  • -alias keystore 内部における keypair の名称です。keystore には複数の keypair を格納できます。
  • -v verbose 出力を行います。
  • -keyalg 公開鍵暗号のアルゴリズムを指定します。
  • -keysize 鍵長を指定します。
  • -validity 証明書の有効日数を指定します。36500 は 100 年です。

実行例

キーストアのパスワードを入力してください: my_key_store_pass
新規パスワードを再入力してください: my_key_store_pass
姓名は何ですか。
  [Unknown]:  localhost

組織単位名は何ですか。
  [Unknown]:

組織名は何ですか。
  [Unknown]:

都市名または地域名は何ですか。
  [Unknown]:

都道府県名または州名は何ですか。
  [Unknown]:

この単位に該当する2文字の国コードは何ですか。
  [Unknown]:

CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknownでよろしいですか。
  [いいえ]:  はい

36,500日間有効な2,048ビットのRSAの鍵ペアと自己署名型証明書(SHA256withRSA)を生成しています  ←三つ生成
    ディレクトリ名: CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
<mykeypair>の鍵パスワードを入力してください
    (キーストアのパスワードと同じ場合はRETURNを押してください): ←エンター

[mykeystore.jksを格納中]  ←三つの情報を格納

内容の確認

keystore ファイル内に格納された情報は list 引数を指定して確認できます。後述のとおり、公開鍵 (、自己署名証明書) は exportcert で取り出せますが、秘密鍵は特殊なツールを使用しないと取り出せません。

$ keytool -list -v -keystore mykeystore.jks
キーストアのパスワードを入力してください:  my_key_store_pass

キーストアのタイプ: JKS
キーストア・プロバイダ: SUN

キーストアには1エントリが含まれます  ←keystore には複数の keypair を格納できます。

別名: mykeypair
作成日: 2017/05/11
エントリ・タイプ: PrivateKeyEntry
証明書チェーンの長さ: 1
証明書[1]:
所有者: CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
発行者: CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
シリアル番号: 2cdfad1d
有効期間の開始日: Thu May 11 23:43:01 JST 2017終了日: Sat Apr 17 23:43:01 JST 2117
証明書のフィンガプリント:
     MD5:  CC:C4:3F:55:69:A6:43:89:E5:A5:35:95:0B:CA:3F:97
     SHA1: 42:CF:F3:9C:1A:10:4D:68:18:C1:FD:17:1D:3E:8F:23:40:2E:03:58
     SHA256: 12:94:F5:10:26:44:DC:03:49:FB:01:12:B7:21:6B:5E:88:3F:15:36:6A:F9:0C:6F:C6:0C:48:95:82:C9:6B:74
     署名アルゴリズム名: SHA256withRSA
     バージョン: 3

拡張: 

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 7A CB 75 F0 B6 D9 98 35   5D 16 CC 6F DF 81 4A 58  z.u....5]..o..JX
0010: 06 2F 81 9D                                        ./..
]
]

証明書の生成

認証局の秘密鍵で署名された証明書の生成

生成した keystore 内部の秘密鍵を利用して、keystore 内部の自己署名証明書と同じ情報の CSR を生成できます。

keytool -certreq -keystore mykeystore.jks -alias mykeypair -keyalg RSA -file mykeypair.csr

openssl で生成した CSR と同じ形式です。こちらのページでも記載したとおり、内容の確認は以下のように openssl コマンドで行えます。

$ openssl req -text -in mykeypair.csr
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=Unknown, ST=Unknown, L=Unknown, O=Unknown, OU=Unknown, CN=localhost
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
                    00:86:88:46:c1:51:b9:41:0c:9c:d3:14:0b:ae:b8:
                    c4:b4:dd:b2:69:54:01:ae:75:63:f3:6c:4b:a7:2e:
                    0c:02:40:7f:d6:91:82:45:5e:d0:8b:c0:25:a8:c7:
                    47:0d:df:99:00:cf:42:eb:e0:9b:b8:58:f6:98:96:
                    49:19:9e:e9:4a:d7:6e:7a:80:bb:4b:86:39:ed:51:
                    3a:a8:56:5c:35:b0:9e:5c:0e:de:fc:4f:4b:aa:9c:
                    c5:82:99:42:7d:2f:c2:be:ce:05:1b:46:b8:43:86:
                    1e:e4:21:d9:80:8a:44:cd:c9:b7:9e:65:ef:91:ff:
                    d8:06:bd:97:b4:14:f4:d3:2a:1a:ea:ad:81:3d:e1:
                    6e:b7:da:35:66:66:ef:22:fb:13:a9:96:24:42:86:
                    ad:42:2a:73:ac:42:a7:32:76:58:7a:42:5e:c4:59:
                    ba:5e:9b:13:5b:cb:65:75:30:c4:84:2f:4c:42:45:
                    a6:a0:c1:89:21:86:1c:88:1f:73:39:7b:5c:43:28:
                    14:18:ab:83:30:c9:9a:85:d1:0a:23:5c:42:e5:e8:
                    64:c8:27:dc:67:09:72:9d:02:c3:e1:c9:1d:d5:a2:
                    3f:a4:85:fa:ba:aa:73:ab:41:51:b6:f8:9e:5d:be:
                    dd:fe:ff:2a:a5:25:00:fd:32:b2:b2:cd:ae:d5:a3:
                    4c:fd
                Exponent: 65537 (0x10001)
        Attributes:
        Requested Extensions:
            X509v3 Subject Key Identifier: 
                60:9D:66:E7:F4:43:06:49:48:8A:92:28:7C:16:6B:81:5E:9D:3B:60
    Signature Algorithm: sha256WithRSAEncryption
        60:6e:ba:48:57:cd:49:80:c7:0a:b9:b9:24:9c:44:10:7b:1d:
        16:7e:cb:eb:d5:b6:6e:b5:7e:02:7f:fa:d0:df:64:a4:61:99:
        07:a2:01:2b:10:1c:57:6f:f0:91:89:12:44:3a:5b:47:4b:e4:
        42:83:ab:82:83:ec:13:44:cc:a8:a4:c6:4e:c5:12:a5:c8:df:
        b8:4f:5f:c8:56:06:38:59:36:09:0b:5c:f8:74:0c:48:75:f7:
        3b:c8:1e:44:f5:2c:c4:3c:49:c4:31:79:10:e0:52:83:b4:eb:
        c3:be:6c:10:61:ca:65:89:da:35:7a:9d:a6:e7:35:ff:07:a3:
        f5:6b:7f:8b:38:d7:62:42:48:1b:af:55:bd:88:a6:e9:28:85:
        e4:d1:b0:69:8c:6d:24:ea:25:90:81:91:e6:05:40:49:b2:9d:
        86:34:44:87:61:fc:1e:b4:5f:89:35:89:a2:5a:ff:86:ef:8f:
        6d:ad:78:35:d8:9d:8b:c1:7f:4f:4b:ab:4f:69:fb:39:77:7c:
        84:ff:e7:39:93:8e:77:ca:21:dc:c4:47:ab:6b:11:a4:82:6f:
        dc:06:06:37:7a:54:0e:ec:58:9b:83:bc:88:89:77:af:ba:62:
        4e:a9:9d:8d:08:77:e2:2f:56:c2:54:78:00:8e:ed:a8:92:e3:
        e6:a9:9d:5d
-----BEGIN CERTIFICATE REQUEST-----
MIIC4zCCAcsCAQAwbjEQMA4GA1UEBhMHVW5rbm93bjEQMA4GA1UECBMHVW5rbm93
bjEQMA4GA1UEBxMHVW5rbm93bjEQMA4GA1UEChMHVW5rbm93bjEQMA4GA1UECxMH
VW5rbm93bjESMBAGA1UEAxMJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAhohGwVG5QQyc0xQLrrjEtN2yaVQBrnVj82xLpy4MAkB/1pGC
RV7Qi8AlqMdHDd+ZAM9C6+CbuFj2mJZJGZ7pStdueoC7S4Y57VE6qFZcNbCeXA7e
/E9LqpzFgplCfS/Cvs4FG0a4Q4Ye5CHZgIpEzcm3nmXvkf/YBr2XtBT00yoa6q2B
PeFut9o1ZmbvIvsTqZYkQoatQipzrEKnMnZYekJexFm6XpsTW8tldTDEhC9MQkWm
oMGJIYYciB9zOXtcQygUGKuDMMmahdEKI1xC5ehkyCfcZwlynQLD4ckd1aI/pIX6
uqpzq0FRtvieXb7d/v8qpSUA/TKyss2u1aNM/QIDAQABoDAwLgYJKoZIhvcNAQkO
MSEwHzAdBgNVHQ4EFgQUYJ1m5/RDBklIipIofBZrgV6dO2AwDQYJKoZIhvcNAQEL
BQADggEBAGBuukhXzUmAxwq5uSScRBB7HRZ+y+vVtm61fgJ/+tDfZKRhmQeiASsQ
HFdv8JGJEkQ6W0dL5EKDq4KD7BNEzKikxk7FEqXI37hPX8hWBjhZNgkLXPh0DEh1
9zvIHkT1LMQ8ScQxeRDgUoO068O+bBBhymWJ2jV6nabnNf8Ho/Vrf4s412JCSBuv
Vb2IpukoheTRsGmMbSTqJZCBkeYFQEmynYY0RIdh/B60X4k1iaJa/4bvj22teDXY
nYvBf09Lq09p+zl3fIT/5zmTjnfKIdzER6trEaSCb9wGBjd6VA7sWJuDvIiJd6+6
Yk6pnY0Id+IvVsJUeACO7aiS4+apnV0=
-----END CERTIFICATE REQUEST-----

上記 CSR ファイルをもとに、有償の SSL サービスや openssl で構築した独自 CA の秘密鍵で署名して証明書を作成します。

自己署名証明書の生成

genkeypair で作成した keystore ファイルには、公開鍵を内包した自己署名証明書が格納されています。そのため、自己署名証明書は既に生成されており、これを取り出すための引数 exportcert が keytool に用意されています。旧称は export です

keytool -exportcert -keystore mykeystore.jks -alias mykeypair -file mykeypair.der

バイナリ形式の mykeypair.der は openssl コマンドでテキスト形式に変換できます。

openssl x509 -inform DER -outform PEM -in mykeypair.der -out mykeypair.pem

こちらのページでも記載したとおり、内容の確認は以下のように openssl コマンドで行えます。

openssl x509 -text -in mykeypair.pem

Java KeyStore (JKS) エントリの追加

この続きが気になる方は

JDK keytool の基本的な使い方 (openssl との対比)

残り文字数は全体の約 16 %
tybot
100 円
関連ページ