OpenSSLを使って自己署名証明書を作成(XAMPPでマルチドメインSSL化)

自作サーバ(XAMPP)でマルチドメインSSLを利用できるようにする。
通常、OpenSSL で作成する SSL証明書 は、ひとつのSubjectを持ち、ひとつのホスト名
に対してのみ有効です。
ですが、X509拡張のSAN(Subject Alternative Name)を使用すると、複数のホスト名に
対応させることができます。
自己署名証明書(Certificate)で複数ドメインをサポートするものです。
で、CSR を作成しないと行けなかったのですが、今までの CSR の作成方法では基本1つ
しかドメインを指定できないので、マルチドメインSSL の CSR作成手順を述べます。
環境はWindows Server 2016 で XAMPP の OpenSSLで、XAMPPにバンドルされている
openssl ではなく別途ダウンロードしてマルチドメインSSLの作り方を簡単に紹介です。
XAMPPのバージョンは8.0.0です。
Windows 用の OpenSSL を使って自己署名のサーバー証明書を作成する手順を紹介します。

  1. Windows 用バイナリーをダウンロードする
  2. 既定の設定ファイル ( openssl.cnf ) を作成する
  3. 起動用バッチファイル ( openssl.exe ) を作成する
  4. 自己署名のサーバー証明書作成用コンソールを起動する
  5. 秘密鍵 ( Private key = server.key ) を作成する
  6. 証明書署名要求 (CSR) を作成する
  7. 証明書の発行 (複数ホスト名に対応させる(SAN/Subject Alternative Name)
  8. XAMPP にサーバー証明書を配置する
  9. httpd.conf と httpd-ssl.conf の 確認
  10. 参考サイト

1.Windows 用バイナリーをダウンロードする

以下のサイトから ZIP ファイルをダウンロードします。

32 ビット版の場合、ファイル名は openssl-*-i386-win32.zip のようになっています。
2021/01/06日時点の最新バージョンは openssl-1.0.2u-i386-win32.zip です。
今回はこのバージョン 1.0.2u で手順を紹介します。

適当な場所に openssl¥bin というフォルダーを作成して、
そこにダウンロードした ZIP ファイルの中身を解凍します。
今回は C:¥openssl¥bin に解凍しました。 フォルダーの階層や名前は自由に決めてもいいですが、最後のフォルダー名は 必ず bin としてください。
C:¥opensll

2.既定の設定ファイルを作成する

ファイルを展開した場所 ( C:¥openssl ) に、
openssl.cnf という名前のテキストファイルを作成する。
内容を以下の通りにします。
面倒な方は、以下のリンクからダウンロードできます。
openssl.cnf をダウンロードする。

openssl.cnf
######################################################################
[ req ]

default_bits                   = 2048
default_keyfile                = privkey.pem
distinguished_name             = req_distinguished_name


######################################################################
[ req_distinguished_name ]

countryName                    = Country Name (2 letter code)
countryName_default            = JP
countryName_min                = 2
countryName_max                = 2

stateOrProvinceName            = State or Province Name (full name)
stateOrProvinceName_default    = Not Applicable

localityName                   = Locality Name (eg, city)
localityName_default           = Not Applicable


0.organizationName             = Organization Name (eg, company)
0.organizationName_default     = Apache Friends

organizationalUnitName         = Organizational Unit Name (eg, section)
organizationalUnitName_default =

commonName                     = Common Name (eg, your website’s domain name)
commonName_max                 = 64


######################################################################
[ server ]

nsCertType=server
extendedKeyUsage = serverAuth

######################################################################
[ SAN ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = site01.jp
DNS.2 = ajisai.mydns.jp
DNS.3 = localhost
# IP.1 = 192.168.1.15
####DNS.〇の順にマルチドメインを追記する。〇は数値
####※全てのDNS(Aレコード)の名前解決ができなければ全ての証明書発行が
####  できないので注意すること。
####IP.〇も同様の方法で記載可能

25 行目の Apache Friends は自分の組織名に書き換えてください。

subjectAltNameの詳細は https://kaede.jp/2018/06/10191854/ を参考にしました。

3.起動用バッチファイルを作成する

ファイルを展開した場所 ( C:¥openssl ) に、
OpenSSL_Console.bat という名前のバッチファイルを作成する。
内容を以下の通りにします。
ファイルは以下のリンクからダウンロードできます。
OpenSSL_Console.bat をダウンロードする。

OpenSSL_Console.bat
@ECHO OFF SET PATH=%~dp0bin;%PATH% SET OPENSSL_CONF=%~dp0openssl.cnf @openssl version %COMSPEC% /K "cd /d %~dp0"

4.自己署名のサーバー証明書作成用コンソールを起動する

ここまでの作業でフォルダーは以下のような構成になっています。

C:¥openssl フォルダに必ず openssl.cnf OpenSSL_Console.bat のファイルが
あることを確認してから OpenSSL_Console.bat をダブルクリックして起動する。
OpenSSL のバージョンが表示されれば成功です。

注意)
このままコマンドプロンプトは閉じないでください。

5. RSA 秘密鍵を作成する

以下のコマンドを入力して秘密鍵(Private key = server.key)を作成します。
ここでは秘密鍵のファイル名を server.key としています。

  1. コマンドプロンプトを閉じた場合は、Windowsキー + Rキー を押す。
  2. cd c:\openssl を入力して Enterキー を押す。
  3. openssl genrsa -out server.key 2048 を入力して Enterキー を押す。

これで秘密鍵(Private key) server.key ができました。
( C:¥openssl¥server.key )

6.証明書署名要求 (CSR) を作成する

Private key(server.key) と 先ほどの sample.cnf を使って CSR を作成します。
以下のコマンドを入力して証明書署名要求 (CSR) を作成します。
コンソールでの対話形式で作業を進めていきます。
既定値として openssl.cnf に記載した内容が表示されるので、
ほとんどの項目では Enter を押して進めていくことができます。
これでC:¥xampp¥apache¥conf¥ssl¥my-server.keyが生成されます。
適当な内容を入力します(以下黄色部分)。最後の2項目は必須ではないため入力不要です。

上記の の項目は今回省略しています。

下記のコマンドを実行すると入力が求められるので適当な内容を入力します。( 以下 黄色部分
最後の2項目は必須ではないため入力不要です。
最後の Common Name については既定値が表示されません。
ここには実際に使用する ウェブサーバーのホスト名 を入力してください。

C:¥openssl>openssl req -new -sha256 -key server.key -out server.csr -config openssl.cnfを入力して Enterキー を押す。
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) [Not Applicable]:Fukuoka-Pref(都道府県名)
Locality Name (eg, city) [Not Applicable]:cyuou-ku(市区町村名)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Apache Friends(組織名)
Organizational Unit Name (eg, section) []:tonbo(組織内ユニット名)
Common Name (eg, your website's domain name) []:tonbo.example.com(アクセス名[http://アクセス名])

これで C:¥openssl¥server.crt が生成されます。

7.証明書の発行

複数ホスト名に対応させる(SAN/Subject Alternative Name)
通常、OpenSSLで作成するSSL証明書は、ひとつのSubjectを持ち、ひとつのホスト名に対してのみ有効です。
ですが、X509拡張のSAN(Subject Alternative Name)を使用すると、複数のホスト名に対応させることができます。
複数ホスト名に対応させる場合は、次のようなテキストファイルを用意します。
ファイル名は、なんでもいいです。

今回は openssl.cnf の最後に下記のパラメータを追加する。

 [ SAN ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = site01.jp
DNS.2 = ajisai.mydns.jp
DNS.3 = localhost

以下のコマンドを入力してサーバー証明書を作成します。
引数 -days で有効期間 3650 日 ( 年/365日 : 約 10 年 ) を指定しています。

C:¥openssl> openssl x509 -req -in server.csr -signkey server.key -out server.crt -days 3650 -extensions serverを入力して Enterキーを押す。
Loading 'screen' into random state - done
Signature ok
subject=/C=JP/ST=FukuokaL=cyuou-ku/O=Computer Planning/OU=tonbo/CN=exsample.ne.jp

上記の赤字が入力した結果です。(確認する。)

これで、サーバー証明書( C:¥openssl¥server.crt ) が生成されました。

以降で使用するファイルは server.key server.crt のみです。

8.XAMPP にサーバー証明書を配置する

最後に作成した自己署名サーバー証明書を Apache に配置してみます。
XAMPP を使用している場合は、下記の フォルダーを開いて、
作成した server.crt と server.key を上書きコピーします。

c:¥xampp¥apache¥conf¥ssl.crt¥server.crt
c:¥xampp¥apache¥conf¥ssl.key¥server.key

これで Apache を再起動すれば、 サーバー証明書が有効になります。

9. httpd.conf と httpd-ssl.conf の 確認

c:¥xampp¥apache¥conf¥httpd.conf をテキスト ・ エディターで開いて以下の内容を編集します。
LoadModule ssl_module modules/mod_ssl.so がコメントアウトされている場合はコメントを外して有効化します。
Include conf/extra/httpd-ssl.conf がコメントアウトされている場合はコメントを外して有効化します。
(この行自体が存在しない場合は追記してください。)

c:¥xampp¥apache¥conf¥extra¥httpd-ssl.conf をテキスト ・ エディターで開いて以下の内容を編集します。

SSLCertificateFile "${SRVROOT}/conf/server.crt" がコメントアウトされている場合はコメントを外して有効化します。
ファイル名が異なっている場合は実際に配置したサーバー証明書のファイル名に合わせてください。
SSLCertificateKeyFile "${SRVROOT}/conf/server.key" がコメントアウトされている場合はコメントを外して有効化します。
ファイル名が異なっている場合は実際に配置したサーバー証明書のファイル名に合わせてください。

これでApacheを再起動すれば、作成した証明書が適用されます。

10.参考サイト

参考サイトは以下です。ありがとうございました。