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