😸

鍵(秘密鍵、公開鍵)と証明書の関係について整理し、実際に作ってみた

2024/05/27に公開

概要

鍵と証明書の関係について説明しながら実際に鍵と証明書を作成します。(オレオレ証明書)
Opensslを利用します。

秘密鍵

公開鍵暗号方式では、公開鍵で暗号化された文書を複合するために利用する。
デジタル署名では、秘密鍵でハッシュ化された文書を公開鍵で複合するために利用する。(文書をハッシュ化したものと、複合したハッシュ値を突合して、改ざんがないか確認する)
公開鍵は秘密鍵から作成可能

証明書

公開鍵にCAが署名をしたものがデジタル証明書。(誰が署名しても良い(自分で署名もOK)が、ブラウザ側で信用はされない)

OpenSSlコマンド

暗号、ハッシュ、署名関係の機能を持つパッケージ
[書式]
openssl コマンド オプション
[例]
openssl rsa -text -in /tmp/id_rsa
[コマンド]
rsa RSA秘密鍵関連の処理を行う。
genrsa RSA秘密鍵を作成する。
req 証明書署名要求関連の処理を行う。
x509 証明書関連の処理を行う。
[オプション]
(共通)
-text テキスト形式で表示する
-in 読み込むファイルを指定
-noout catで確認できる情報は出力しない(Base64形式)
(秘密鍵関連)
-pubout 秘密鍵から公開鍵を生成
-pubin 公開鍵をインプットにして、中身を確認する
(証明書署名要求関連)
-key 秘密鍵を指定する。
-days 証明書の有効期限

作成するときに指定する拡張子(論理拡張子のため、実際は違う)

.pem PEM形式(-----BEGIN ...)。中身は秘密鍵だったり公開鍵だったり証明書だったり
.key 鍵ファイル。秘密鍵や公開鍵。中身はpemだったりするが、わかりやすく自分はこれを採用する
.pub 公開鍵(あまり使いたくない)
.csr 証明書署名要求(Certificate Signing Request)
.crt 証明書(Certificate)

検証してみる

SSH鍵作成

(cmd→wslから起動)
docker run -it --rm -p 8080:8080 -v /mnt/c/dev/mount:/tmp --name test centos:centos7 /bin/bash
yum -y install openssh-server

(秘密鍵を生成し、作成されたファイルを確認)
[root@e4e48095cbe2 tmp]# openssl genrsa 2048 > private.key //秘密鍵を生成
[root@e4e48095cbe2 tmp]# file private.key //中身の形式を確認してみる
private.key: PEM RSA private key
id_rsa(秘密鍵の中身)
[root@e4e48095cbe2 tmp]# openssl rsa -text -in /tmp/private.key
Private-Key: (2048 bit)
modulus:
    00:a9:6c:8d:74:cd:03:98:08:94:21:a8:0b:6d:41:
    ~略~
    a0:fd
publicExponent: 65537 (0x10001)
privateExponent:
    00:88:8e:65:29:aa:80:e6:0e:ac:0e:c0:9a:8d:32:
    ~略~
    b7:85
prime1:
    00:df:73:62:e8:34:f2:0e:92:d6:4d:22:e6:24:a0:
    ~略~
    88:55:74:cb:26:24:17:cb:9b
prime2:
    00:c2:1a:7a:56:d6:b5:84:c9:cd:ac:fd:eb:d8:7f:
    ~略~
    77:13:8e:4d:16:57:f6:8b:47
exponent1:
    13:e4:27:a7:d8:1e:bc:21:62:26:57:b6:f9:07:bc:
    ~略~
    87:2b:f0:71:a2:c0:e3:85
exponent2:
    2f:1e:48:56:6e:36:90:2e:80:cc:1e:b3:b2:d1:7c:
    ~略~
    13:f2:36:4a:57:3e:15:1f
coefficient:
    00:91:b0:96:ea:2e:f0:60:18:de:37:52:cb:be:0b:
    ~略~
    2d:dc:1b:cd:2e:cc:08:e4:f6
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAqWyNdM0DmAiUIagLbUFuoGYueyTHsyX2u9zCfeqpTS5UEeo2
    ~略~
+DLzpAW0IFCBZ8STQSJ+R6K5mSnjEdHwfWmDj3B13S3cG80uzAjk9g==
-----END RSA PRIVATE KEY-----
id_rsa(秘密鍵から公開鍵を生成)
[root@e4e48095cbe2 tmp]# openssl rsa -pubout -in /tmp/private.key > public.key  // 秘密鍵から公開鍵を生成
[root@e4e48095cbe2 tmp]# file public.key // ファイルの形式を確認
public.key: ASCII text // 公開鍵なのか?
[root@e4e48095cbe2 tmp]# openssl rsa -pubin -in /tmp/public.key // 公開鍵の中身を確認→ちなみにcatでみても中身変わらないので、公開鍵はほんとにただの文字列かもしれない
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqWyNdM0DmAiUIagLbUFu
    ~略~
/QIDAQAB
-----END PUBLIC KEY-----

オレオレ証明書作成

(そもそもOpensslが入っていない場合)
[root@e4e48095cbe2 tmp]# yum search openssl
[root@e4e48095cbe2 tmp]# yum install -y openssl.x86_64
(秘密鍵を作成し、作成されたファイルを確認)
[root@e4e48095cbe2 tmp]# openssl genrsa 2048 > private.key //秘密鍵を生成
[root@e4e48095cbe2 tmp]# file private.key //中身の形式を確認してみる
private.key: PEM RSA private key
(証明書要求を作成)
[root@e4e48095cbe2 tmp]# openssl req -new -key private.key > server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JA
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:chiyoda
Organization Name (eg, company) [Default Company Ltd]:kokyo
Organizational Unit Name (eg, section) []:kokyo
Common Name (eg, your name or your server's hostname) []:kokyo.jp
Email Address []:testtest@test.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

[root@e4e48095cbe2 tmp]# file server.csr    // 証明書要求であることを確認
server.csr: PEM certificate request

[root@e4e48095cbe2 tmp]# openssl req -text -noout < server.csr    // 中身をであることを確認
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=JA, ST=Tokyo, L=chiyoda, O=kokyo, OU=kokyo, CN=kokyo.jp/emailAddress=testtest@test.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:a9:6c:8d:74:cd:03:98:08:94:21:a8:0b:6d:41:
                    ~略~
                    a0:fd
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         44:ce:79:38:a6:3a:f2:56:25:af:08:ec:29:3c:63:ae:1a:10:
         ~略~
         0c:dd:99:83
(署名する)
[root@e4e48095cbe2 tmp]# openssl x509 -days 397 -req -sha256 -signkey private.key < server.csr > server.crt //署名し、デジタル証明書を生成
[root@e4e48095cbe2 tmp]# file server.crt //中身の形式を確認してみる
server.crt: PEM certificate     // あくまで鍵形式7日
[root@e4e48095cbe2 tmp]# openssl x509 -text -noout < server.crt
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            99:f6:2b:84:ef:ad:77:3a
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=JA, ST=Tokyo, L=chiyoda, O=kokyo, OU=kokyo, CN=kokyo.jp/emailAddress=testtest@test.com
        Validity
            Not Before: Oct 24 16:14:13 2023 GMT
            Not After : Nov 24 16:14:13 2024 GMT
        Subject: C=JA, ST=Tokyo, L=chiyoda, O=kokyo, OU=kokyo, CN=kokyo.jp/emailAddress=testtest@test.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:a9:6c:8d:74:cd:03:98:08:94:21:a8:0b:6d:41:
                    ~略~
                    a0:fd
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
         9c:0c:c9:82:d8:25:71:f6:1d:57:04:43:0a:25:6a:8f:90:c8:
         ~略~
         dd:6a:46:b4

※証明書の有効期限について
2020年9月以降、有効期限は最大397日(13ヶ月)に短縮(398日はアウト)
しかし、2023/10/25現在、googleが90日を推奨しているので、短くなる可能性あり
有効期限が切れた場合、リクエスト時ブラウザに警告が表示される。

(証明書で証明書要求から追加された部分)
            Not Before: Oct 24 16:14:13 2023 GMT    // 作成日時
            Not After : Nov 24 16:14:13 2024 GMT    // 有効期限(今日+397日になっている)

Discussion