シナプス技術者ブログ

シナプスの技術者公式ブログ。インターネットで、鹿児島の毎日を笑顔にします。

CSR を少しだけ深掘りしてみた

技術部ネットワーク課の二之宮です。

はじめに

コマンドを 1つ実行するだけで生成可能な CSR(certificate signing request:証明書署名要求)ですが、その中身を理解するために、少しだけ深掘りしてみました。

CSR とは

サーバー証明書の発行を認証局に依頼する申請書のようなものです。

CSR には「証明書の適用対象となる情報」と「公開鍵」が含まれており、秘密鍵で署名されています。

認証局は、CSR の情報を審査し、その正当性を確認したうえで、CSR を基にサーバー証明書を生成して、認証局の秘密鍵で署名を行います。

CSR 作成の実際

今回は、*.synapse.kagoshima.jp というワイルドカード証明書の CSR を生成することを例に説明します。

実際に CSR を作成する openssl コマンドを実行すると、このようになります。

# openssl req -new -sha256 -subj "/C=JP/ST=Kagoshima/L=Kagoshima/O=SYNAPSE Co.,Ltd./OU=Operation Team/CN=*.synapse.kagoshima.jp" -out synapse.kagoshima.jp.csr -newkey rsa:2048 -nodes -keyout synapse.kagoshima.jp.key
............+......+.......+..+...+....+++++++++++++++++++++++++++++++++++++++*..+++++++++++++++++++++++++++++++++++++++*...........+...+.......+......+.....+...............+.........+...+...+.+...+............+......+...+..+..........+..+.+......+...+............+...+.....+...+.............+.....+......+.+..+.+.....+................+.....+.............+.....+...+.........+...+.......+......+..+...+...+..........+.....+......+.+..+............+.+...............+...+..+...+....+...............+........+...+.......+...++++++..+...........+...+....+.....+.+..............+...+..................+.+.....+...+............+.+.........+......+++++++++++++++++++++++++++++++++++++++*....+...+..+++++++++++++++++++++++++++++++++++++++*...+...+....+..+....+......+......+..+..........+...........+.+...+.................+.+..+...+.......+......+......+.........+...........+.+..+......+......+.+.........+...+.....+...+.......+...........+.....................+.........+.......+...+......+......+..+......+.........+...+............+...+...+......+....++++++-----

そして、CSR ファイルが生成されます。

# ls synapse.kagoshima.jp.csr
synapse.kagoshima.jp.csr

同時に、秘密鍵ファイルも作成されます。

# ls synapse.kagoshima.jp.key
synapse.kagoshima.jp.key

生成された CSR

cat コマンドで、PEM ( Privacy-Enhanced Mail ) 形式で Base64 エンコードされた CSR を見ることができます。

# cat synapse.kagoshima.jp.csr
-----BEGIN CERTIFICATE REQUEST-----
MIIC0DCCAbgCAQAwgYoxCzAJBgNVBAYTAkpQMRIwEAYDVQQIDAlLYWdvc2hpbWEx
EjAQBgNVBAcMCUthZ29zaGltYTEZMBcGA1UECgwQU1lOQVBTRSBDby4sTHRkLjEX
MBUGA1UECwwOT3BlcmF0aW9uIFRlYW0xHzAdBgNVBAMMFiouc3luYXBzZS5rYWdv
 ~途中省略~
TmVpTWapDt47mRhZI0C9b3We0qaOaIR75fqjA+9SshYOF1acau60fa264s95gtBU
Pc/Bu8hCEMw2vrJIsmBmD37dD9W/42bbNwbT6xLNx/0TSdN88OvB+6meNNATlccu
dUyQHg==
-----END CERTIFICATE REQUEST-----

CSR 生成コマンドとオプション

CSR の生成には以下の長~いコマンドを使用しました。
(「CSR 作成の実際」で示したコマンドと同じものです。)

# openssl req -new -sha256 -subj "/C=JP/ST=Kagoshima/L=Kagoshima/O=SYNAPSE Co.,Ltd./OU=Operation Team/CN=*.synapse.kagoshima.jp" -out synapse.kagoshima.jp.csr -newkey rsa:2048 -nodes -keyout synapse.kagoshima.jp.key

このコマンドは、分解すると、以下のようなコマンドとオプション(パラメータ)で構成されています。

  • openssl
    OpenSSL コマンド。

  • req
    CSR を生成するためのサブコマンド。

  • -new
    CSR を生成するためのオプション。

  • -sha256
    CSR の署名に使用するハッシュ関数を指定するオプション。 後ほど詳述します。

  • -subj "/C=JP/‥/CN=*.synapse.kagoshima.jp“
    CSR の識別情報を指定するオプション。

  • -out synapse.kagoshima.jp.csr
    CSR のファイル名を指定するオプション。

  • -newkey rsa:2048
    暗号アルゴリズムと秘密鍵のサイズを指定するオプション。 後ほど詳述します。

  • -noenc
    秘密鍵の暗号化とパスフレーズの保護を行わないようにするオプション。

  • -keyout synapse.kagoshima.jp.key
    秘密鍵のファイル名を指定するオプション。

「-sha256」オプション

CSR の署名に使用するハッシュ関数に SHA-256 を使用することを指定するオプションです。
CSR には公開鍵と識別情報、署名が含まれますが、この署名の処理に使用されるハッシュ関数を指定します。
CSR は、SHA-256 関数で算出されたハッシュ値を、秘密鍵を使用して暗号アルゴリズムで処理することで署名が行われます。

ハッシュ関数と署名

「-newkey rsa:2048」オプション

秘密鍵の生成に使用する暗号アルゴリズムとサイズを指定するオプションです。
「-newkey rsa:2048」の場合は「RSA 暗号アルゴリズム」を使用して「2,048 ビット」の秘密鍵(とペアとなる公開鍵)を生成します。

証明書署名要求の中身‥所有者識別情報

# openssl req -in synapse.kagoshima.jp.csr -text -noout
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C=JP, ST=Kagoshima, L=Kagoshima, 
                 O=SYNAPSE Co.,Ltd., OU=Operation Team, 
                 CN=*.synapse.kagoshima.jp
  • Version: 1 (0x0)
    X.509 証明書の書式のバージョン。

  • Subject: ‥
    所有者識別情報。

証明書署名要求の中身‥公開鍵

 Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:9f:d5:b9:8a:29:7d:d3:59:bf:0b:8f:dd:0e:91:
                    e9:ea:6b:78:b7:1b:05:f3:6c:66:48:99:67:e6:89:
                    1f:a1:59:d0:2e:62:87:4a:d2:16:11:e8:4a:d0:54:
                     ~途中省略~
                    2c:f7:f7:4a:70:08:af:1f:87:45:8e:38:88:ec:cc:
                    c1:8c:13:eb:62:c9:9b:95:a8:4d:b9:e3:81:67:d4:
                    cb:db
                Exponent: 65537 (0x10001)
  • Public Key Algorithm: rsaEncryption
    公開鍵の暗号化方式。RSA 暗号アルゴリズム。

  • Public-Key: (2048 bit)
    公開鍵のサイズ。

  • Modulus:~
    公開鍵。

  • Exponent: 65537 (0x10001)
    公開指数。鍵の演算で使用される。

証明書署名要求の中身‥追加の情報

 Attributes:
            (none)
            Requested Extensions:

この項目は使用されていません。

証明書署名要求の中身‥署名

Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        47:a7:42:ac:bb:d9:cf:68:27:bc:90:0a:38:39:c4:67:5d:fe:
        76:12:47:5c:c2:47:98:cc:2a:85:a5:30:d5:78:b4:c0:ad:e2:
        84:26:65:d8:cd:48:d6:1e:5d:53:ad:b5:fc:b3:08:46:67:48:
         ~途中省略~
        b2:60:66:0f:7e:dd:0f:d5:bf:e3:66:db:37:06:d3:eb:12:cd:
        c7:fd:13:49:d3:7c:f0:eb:c1:fb:a9:9e:34:d0:13:95:c7:2e:
        75:4c:90:1e
  • Signature Algorithm: sha256WithRSAEncryption
    秘密鍵の作成に使用された暗号アルゴリズム ( RSA ) と、ハッシュ関数 (sha256) 。
    先述のとおり、署名は、所有者識別情報と公開鍵をハッシュ関数で処理して得られたハッシュ値を、秘密鍵を使用して RSA 暗号アルゴリズムで処理することで行われます。

おわりに

今回は、CSR のみを少しだけ深掘りしただけで終わってしまいましたので、次は、またの機会に、サーバー証明書を少しだけ、深掘りしてみたいと思います。

参考文献