モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)

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

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2017/05/12
最終更新最終更新
2021/10/07
記事区分記事区分
一般公開

目次

    アカウント プロフィール画像 (サイドバー)

    わかりやすい解説を心がけています。

    0
    ステッカーを贈るとは?

    JDK でインストールされる keytool コマンドの利用方法を、openssl コマンドと対比してまとめます。keytool コマンドは、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) エントリの追加

    Java KeyStore (JKS) に外部の「公開鍵証明書」や「秘密鍵と公開鍵証明書の組」を取り込むことができます。keystore のうち、公開鍵証明書だけを格納したものを特に TrustStore とよびます。「公開鍵証明書を格納した TrustStore」と「秘密鍵と公開鍵証明書の組を格納した KeyStore」はそれぞれ「ルート CA 証明書の束」と「クライアント証明書の束」に相当します。

    JVM の起動オプションに指定することで、サーバ証明書を JVM が信頼できるようにしたり、クライアント認証を JVM で行うことができるようになります。

    -Djavax.net.ssl.trustStore=
    -Djavax.net.ssl.trustStorePassword=
    -Djavax.net.ssl.keyStore=
    -Djavax.net.ssl.keyStorePassword=
    

    TrustStore に関しては、JDK が標準で使用する JKS ファイルが存在します。オプションで指定せずに既定値として参照する JKS ファイルですので、直接後述のコマンドで独自ルート CA 証明書などを取り込むのも簡単でよさそうです。例えば以下のようなファイルです。パスワードは changeit です。

    keytool -list -v -keystore /usr/lib/jvm/java-1.8.0/jre/lib/security/cacerts
    

    証明書の取り込み (主にルート CA 証明書を取り込む用途で利用)

    PEM 形式または DER 形式の証明書を同じ引数で取り込めます。importcert の旧称は import です

    keytool -importcert -keystore mytruststore.jks -alias mykeypair -file mykeypair.pem
    keytool -importcert -keystore mytruststore.jks -alias mykeypair -file mykeypair.der
    

    クライアント証明書の取り込み

    keytool -importkeystore -srcstoretype pkcs12 -srckeystore mykeystore.p12 -deststoretype jks -destkeystore mykeystore.jks
    

    Java KeyStore (JKS) エントリの削除

    以下のコマンドでエントリを削除できます。

    keytool -delete -keystore mykeystore.jks -alias mykeypair
    
    0
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    わかりやすい解説を心がけています。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    さらに詳しく →
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      関連記事

      • Spring Security フォームログインのサンプルコード
        Spring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
        えびちゃんえびちゃん12/4/2019に更新
        いいねアイコン画像0
      • Java配列の宣言方法 (C/C++との違い)
        Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
        てんとうむしてんとうむし5/13/2018に更新
        いいねアイコン画像0
      • PlantUML による UML 図の描き方
        サムネイル画像-c788fffde5
        PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
        kentakenta1/21/2020に更新
        いいねアイコン画像0
      • Akka HTTP サンプルコード (Scala)
        サムネイル画像-a98142497c
        Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
        雄太雄太10/7/2021に更新
        いいねアイコン画像0
      • Kestrel の使用例
        Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...
        したくんしたくん10/12/2017に更新
        いいねアイコン画像0