LoginSignup
6

More than 3 years have passed since last update.

openssl.cnfを改変せずにopensslコマンドでSAN情報を付加した証明書発行要求(CSR)を作成する

Last updated at Posted at 2020-01-03

:information_source: この記事は別サイトで執筆したopenssl.cnfを改変せずにopensslコマンドでSAN情報を付加した証明書発行要求(CSR)を作成する – ひつじぶどうの内容を転載しています。

はじめに

どうも‪‪✋(´・ᴗ・` )‬
opensslコマンドでSAN情報を付加したCSRを発行したくなったのですが, ググっても openssl.cnf をいじる方法ばかり出てきて苦戦したので忘備録です。
複数のサーバーに対するCSRを手元のMacで作って認証局に投げたいので, それでは困るんです。
ちなみに openssl.cnf はLinuxだと /etc/pki/tls/openssl.cnf, macOSだと /System/Library/OpenSSL/openssl.cnf にあるようです。

SAN情報を付加したくなるケース

いろいろあると思うんですが, DNSにCNAMEを設定していて2つのURLから1つのWebページにアクセスできる環境とか, サーバーを冗長化していてユーザーはVIPに振られているURLからWebサイトにアクセスするとかそういうケースで必要になるかと思います。
あとは自己証明書を使っている場合, DNS情報の記載がないとエラーが出るようになっているようですのでその対策とかでしょうか。

どこに付加するの?

Common NameやCountry等を記録するサブジェクト領域とは別にある, 「SAN(Subject Alter Name)」という拡張領域に付加します。
ここに複数のFQDNを記録することで, サブジェクトのCommon Nameに記載したWebサイト以外の証明書として使用できるようになります。

手順

以下でCSR発行の手順を説明します。

実行環境

この記事を執筆した際は下記の環境で実施しています。

項目
OS macOS Mojave
OS Version 10.14.5
OpenSSL Version 2.6.5

秘密鍵の作成

まずはCSRを作成するための秘密鍵を作成します。
鍵の長さは任意で良いですが, 今回は2048bitで。

$ openssl genrsa 2048 > rumraisin.key

設定ファイルの作成

SANを指定するために設定ファイルを作成し, 証明書に載せたいDNS情報をそこに記述します。
[ req ], [ req_distinguished_name ], [ req_ext ], [ alt_names ]各セクションには下記のものを記述します。

セクション 説明
[ req ] 証明書発行要求に関する設定を記述するセクションです。
[ req_distinguished_name ] [ req ]のサブセクションで, CN等の要素を対話的に入力する際のメッセージや各要素のデフォルト値を記述します。
[ req_ext ] 証明書発行要求のための拡張情報を記載するセクションです。
[ alt_names ] Subject Alter Nameを記述します。

設定ファイル(今回はrumraisin.cnf)を作成し, 下記の内容を記載します。

[ req ]
default_bits       = 2048
distinguished_name = req_distinguished_name
req_extensions     = req_ext
[ req_distinguished_name ]
countryName                = Country Name (2 letter code)
stateOrProvinceName        = State or Province Name (full name)
localityName               = Locality Name (e.g, city)
organizationName           = Organization Name (e.g, company)
commonName                 = Common Name (e.g. server FQDN or YOUR name)
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = rumraisin.tokyo
DNS.2 = rumraisin.dev

[ req ], [ req_distinguished_name ], [ req_ext ]の各セクションは必要に応じて変更してください。
rumraisin.cnfの作成が終わったら準備は完了です。
下記のコマンドを打ってCSRを作成します。

$ openssl req -new -key rumraisin.key -config rumraisin.cnf -out rumraisin.csr

対話型が嫌いな方はワンライナーでもできたと思いますが, 私は嫌いではないので対話型で必要な情報を入力しました。

$ openssl req -new -key rumraisin.key -config rumraisin.cnf -out rumraisin.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) []:JP
State or Province Name (full name) []:Kumamoto
Locality Name (e.g, city) []:Fuyuki-shi
Organization Name (e.g, company) []:Raisin Lab.
Common Name (e.g. server FQDN or YOUR name) []:rumraisin.dev

念のために中身を確認します。

$ openssl req -text -noout -in rumraisin.csr
$ openssl req -text -noout -in rumraisin.csr
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C = JP, ST = Kumamoto, L = Fuyuki-shi, O = Raisin Lab., CN = rumraisin.dev
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                       ︙

これで中身が問題なければOKです。

参考にしたページ

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
6