🔐

CSRを作成する手順 - Ubuntu 22.04で作った

に公開

1. 背景

サーバ証明書を作成する依頼があり、まずCSR(Certificate Signing Request:証明書署名要求)を作成しました。

この記事はその備忘録です。

2. CSRとサーバ証明書の基礎知識

2.1. CSRとは

CSR(Certificate Signing Request:証明書署名要求)は、SSL/TLS証明書を発行してもらうために認証局(CA)に提出するファイルです。

2.2. サーバ証明書取得の流れ

  1. 秘密鍵の作成:サーバ側で秘密鍵を生成
  2. CSRの作成:秘密鍵を使ってCSRを生成
  3. CSRの提出:認証局(CA)にCSRを提出
  4. 証明書の受領:CAから署名されたサーバ証明書を受領
  5. 証明書の適用:Webサーバに秘密鍵と証明書を設定

2.3. 重要なポイント

  • 秘密鍵はサーバ内に保管:外部に送信しない
  • CSRは認証局に提出:公開情報なので送信しても問題ない
  • 作成場所は自由:秘密鍵とCSRはどこで作成してもOK(自宅PC、本番サーバ、どこでも可)

とくに最後のはあまり知られてないと思います。CSRをもとに発行する証明書を適用するノードでCSRを作る必要はないです。適当なパソコンでCSRを作成しても技術的には問題ありません。

3. 前提条件

実施したのは以下の環境です。

  • OS: Ubuntu 22.04(他のLinuxディストリビューションでもほぼ同じ)
  • ツール: OpenSSL(通常はプリインストール済み)

4. サーバ秘密鍵の作成

4.1. 基本的な作成方法(パスフレーズあり)

以下のコマンドで、AES-256暗号化された2048ビットのRSA秘密鍵を作成します。

openssl genrsa -aes256 2048 > company.co.jp.key

パラメータの説明:

  • genrsa:RSA秘密鍵を生成するコマンド
  • -aes256:AES-256方式で秘密鍵を暗号化(パスフレーズが必要)
  • 2048:鍵長2048ビット(現在の標準的な強度)
  • > company.co.jp.key:出力ファイル名

実行すると、パスフレーズの入力を求められます。

Generating RSA private key, 2048 bit long modulus
.....+++
.................................+++
e is 65537 (0x10001)
Enter pass phrase for company.co.jp.key: (パスフレーズ入力)
Verifying - Enter pass phrase for company.co.jp.key: (再入力)

4.2. パスフレーズなしの秘密鍵作成

自動起動するWebサーバで使用する場合、パスフレーズなしの秘密鍵が必要です。

セキュリティ上の注意:

  • パスフレーズなしの秘密鍵は、ファイルが漏洩すると即座に悪用される
  • ファイルのアクセス権限を適切に設定する必要がある(後述)

4.3. パスフレーズの後からの削除

パスフレーズありで作成した秘密鍵から、パスフレーズを削除するのは以下コマンドを実行します。

openssl rsa -in company.co.jp.key -out company.co.jp_nopass.key

パスフレーズを入力すると、パスフレーズなしの秘密鍵が作成されます。

4.4. 秘密鍵のアクセス権限設定

秘密鍵は厳重に管理する必要があります。

# 所有者のみ読み取り可能に設定
chmod 600 company.co.jp.key

# 確認
ls -l company.co.jp.key
# -rw------- 1 user user 1675 Feb  9 10:00 company.co.jp.key

4.5. 鍵長の選択について

鍵長 セキュリティ強度 用途
2048ビット 標準 一般的なWebサーバ(2030年まで推奨)
4096ビット 高いセキュリティが必要な場合
ECDSA P-256 高(効率的) モダンな環境向け

4096ビットRSA秘密鍵の作成例:

openssl genrsa 4096 > company.co.jp.key

5. CSRの作成

作成した秘密鍵を使用して、CSRを作成します。

openssl req -new -key company.co.jp.key -out company.co.jp.csr -sha256

パラメータの説明:

  • req:証明書要求を扱うコマンド
  • -new:新しいCSRを作成
  • -key company.co.jp.key:使用する秘密鍵ファイル
  • -out company.co.jp.csr:出力するCSRファイル名
  • -sha256:署名アルゴリズムにSHA-256を使用(現在の標準)

5.1. CSR作成時の入力内容

コマンド実行後、以下の情報を入力します。入力している会社名などは適当です。

Enter pass phrase for company.co.jp.key: (パスフレーズ入力、設定している場合)
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) [AU]:JP
State or Province Name (full name) [Some-State]:Osaka
Locality Name (eg, city) []:Osaka
Organization Name (eg, company) [Internet Widgits Pty Ltd]:COMPANY ELECTRIC CORPORATION
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:company.co.jp
Email Address []:

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

5.2. 各フィールドの説明

フィールド 必須 説明 入力例
Country Name 国コード(2文字) JP
State or Province Name 都道府県名(英語) Osaka, Tokyo
Locality Name 市区町村名(英語) Osaka, Chiyoda
Organization Name 組織名(正式な英語表記) COMPANY ELECTRIC CORPORATION
Organizational Unit Name × 部門名 IT Department(省略可)
Common Name (CN) サーバのFQDN(最重要) company.co.jp
Email Address × メールアドレス (省略可)
A challenge password × チャレンジパスワード (通常は空欄)
An optional company name × 追加の会社名 (通常は空欄)

5.3. Common Name(CN)の重要性

Common Name(CN)は最も重要なフィールドです。

  • 必ずサーバのFQDNを入力:company.co.jpwww.company.co.jpなど
  • CNと実際のドメインが一致しないと、ブラウザで警告が表示される
  • ワイルドカード証明書の場合:*.company.co.jp

5.4. Organization Nameの注意点

  • 正式な英語表記を使用:登記簿上の正式名称の英語表記
  • 株式会社の場合:CorporationCo., Ltd.Inc.など
  • 認証局によっては登記簿謄本での確認が必要な場合がある

6. CSRの内容確認

作成したCSRの内容を確認します。

openssl req -noout -text -in company.co.jp.csr

正常に作成された場合の出力例:

Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C = JP, ST = Osaka, L = Osaka, O = COMPANY ELECTRIC CORPORATION, CN = company.co.jp
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:d3:73:5f:c8:35:0d:96:09:4b:47:67:9b:5f:f9:
                    cc:d3:44:eb:98:7d:92:6e:26:7c:e8:e3:33:08:9f:
                    c2:e3:dc:6e:b8:0d:76:ff:cf:97:65:c1:19:71:c4:
                    69:65:e1:c3:12:c0:4a:f0:13:ca:b0:78:80:71:b4:
                    97:50:4e:e3:a3:b5:e8:7e:8c:50:ef:17:f8:99:59:
                    2e:3d:51:82:bf:ce:10:a2:96:82:0d:3f:1c:f2:3b:
                    d9:ce:cf:ad:c1:7b:90:5d:20:29:56:02:52:cf:f7:
                    65:bc:0b:b6:da:a6:75:3b:34:ee:7b:40:a0:f7:e6:
                    77:7e:4e:22:fa:94:4f:a0:5c:3e:1c:8e:60:6b:dc:
                    cd:af:89:7b:ea:a8:f3:73:44:c7:34:fc:02:e8:cf:
                    25:1a:5b:11:42:ad:58:1f:d8:04:a7:61:11:be:f0:
                    ee:b7
                Exponent: 65537 (0x10001)
        Attributes:
            (none)
            Requested Extensions:
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        ba:4d:5b:7a:a3:c2:e7:db:e8:af:97:9f:72:b1:11:4a:14:f2:
        4d:77:95:82:60:55:f6:fc:eb:fb:06:44:d3:29:55:db:10:d2:
        af:a5:51:d3:50:64:91:fe:b2:79:87:16:04:11:a7:f6:03:e1:
        46:b2:b1:4e:c6:e6:71:d3:3b:8b:5e:6e:d3:59:9a:52:4c:65:
        74:2e:df:5d:23:11:64:33:2b:77:10:7f:c4:93:1c:bc:b1:5c:
        cb:cb:26:cf:2b:09:52:c1:ae:be:0f:a4:1f:67:b1:53:fd:eb:
        d5:86:03:b5:9b:19:b6:bc:de:7a:e3:97:b1:53:20:80:e2:3f:
        a2:47:12:db:b4:b2:4c:db:b8:27:56:4e:2a:fc:80:ec:f5:a7:
        d0:bd:db:a3:e8:74:14:a3:90:1f:68:b0:b5:f6:99:ca:ec:55:
        54:7b:bd:f2

6.1. 確認すべきポイント

  • Subject:入力した組織情報が正しいか
  • CN(Common Name):サーバのFQDNが正しいか
  • Public-Key:鍵長が想定通りか(2048 bit)
  • Signature Algorithm:sha256WithRSAEncryptionになっているか

6.2. CSRの取り扱い

  • CSRは公開情報:認証局に送信しても問題ない
  • 組織情報は正確に:虚偽の情報を入力しない
  • 再利用しない:証明書更新時は新しい秘密鍵とCSRを作成することを推奨。(毎年更新するから、昨年のCSRを再利用するというのはできることはできる。)

6.3. 秘密鍵とCSRの整合性確認

CSRを大量に作成する場合、どの秘密鍵を使用するのかわからなくなってしまうことがあります。

そこで、秘密鍵とCSRの整合性は以下で確認できます。

# 秘密鍵のモジュラス値
openssl rsa -noout -modulus -in company.co.jp.key | openssl md5

# CSRのモジュラス値
openssl req -noout -modulus -in company.co.jp.csr | openssl md5

# 2つのMD5ハッシュが一致すればOK

7. 参考URL

GitHubで編集を提案

Discussion