Apache HTTP Server + mod_auth_openidc で OpenID Connect (OIDC) 認証が必要な Web サイトを作ってみます。
本記事は「1. 準備編」で、https のサイトを作るところまでです。次の記事は「2. d アカウント・コネクト編」です。
もしかしたらマズい設定などがあるかもしれません。気が付いた方はご指摘いただけるとありがたいです。
環境
とりあえず Windows 10 で WSL2 に Ubuntu 20.04 という環境でやってみます。インストールは済んでいるものとします。異なる環境、異なる設定で試したい場合は適宜必要な変更をするなりして読み替えてください。
IP アドレスとホスト名
Windows から example.com という名前で WSL2 にアクセスできるようにします。Ubuntu のコンソールで
$ hostname -I
172.28.160.85
とするか Windows のコマンドプロンプトで
>wsl -e hostname -I
172.28.160.85
などとすると WSL2 の IP アドレスがわかります。これは起動のたびに毎回変わりますが、上記の例だと 172.28.160.85
ですね。この IP アドレスを使って Windows の C:\Windows\System32\drivers\etc\hosts
に
172.28.160.85 example.com
というような行(もちろん IP アドレスは毎回変わるのでその時の IP アドレスに変える)を追加します(要管理者権限)。なお、この行は本件の動作確認するときだけ追加し、他のことをするときや、WSL2 を終了するとき、Windows をシャットダウンするときには消すようにします。
SSH
個人的に標準のコンソールがあまり好きではないので WSL2 に SSH でアクセスできるようにします。Ubuntu のコンソールで
$ sudo apt install openssh-server
$ sudo ssh-keygen -A
として OpenSSH をインストールし、ホスト鍵を生成しておきます。また、ユーザの鍵ペアを Windows 側で生成し、公開鍵を Ubuntu の ~/.ssh/authorized_keys
に登録しておきます。ここまでは一回だけやれば OK です。
WSL2 では OpenSSH サーバを自動起動してくれないので、WSL2 起動時は毎回 Ubuntu のコンソールから以下を実行して OpenSSH サーバを起動します。
$ sudo service ssh start
これで Windows から example.com へ SSH 接続すると WSL2 の Ubuntu につながるようになります。
Apache HTTP Server
Apache HTTP server をインストールするには、Ubuntu のコンソールで
$ sudo apt install apache2
とします。ここまでは一回だけやれば OK ですが、WSL2 では Apache HTTP Server を自動起動してくれないので、WSL2 起動時は毎回 Ubuntu のコンソールから以下を実行して Apache HTTP Server を起動します。
$ sudo service apache2 start
Windows のブラウザ(Edge など)で http://example.com を開いて Apatch HTTP Server の画面が出てくれば成功です。
オレオレ証明書
http ではなくて https 、つまり https://example.com に警告など無しにアクセスできるようにするためオレオレ証明書を作ります。作り方は何でもよいのですが、ここでは以下のようにしてみました。
作る
まず Ubuntu で
$ cd
$ mkdir -p git/github/trueroad/
$ cd git/github/trueroad/
$ git clone https://github.com/trueroad/make-cert-kit.git
$ cd make-cert-kit/samples/RSA-SHA2/server/
としてから、そこにある csr.conf
, extension.cnf
に以下のような変更を加えます。
--- csr.cnf.org
+++ csr.cnf
@@ -17,4 +17,4 @@
L = Some-City
O = Some-Company
OU = Some-Section
-CN = www.example.com
+CN = example.com
--- extension.cnf.org
+++ extension.cnf
@@ -15,4 +15,4 @@
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer:always
-subjectAltName=DNS:www.example.com
+subjectAltName=DNS:example.com
そして以下のようにしてルート証明書、中間証明書、サーバ証明書を生成します。
$ cd ..
$ make -C root
$ make -C inter
$ make -C server
Apache HTTP Server で使えるようにする
できた証明書などを /etc
以下に入れておきます。
$ sudo cp server/cert.crt /etc/ssl/certs/ssl-cert-test-example-com.pem
$ sudo cp server/private/key.pem /etc/ssl/private/ssl-cert-test-example-com.key
$ sudo mkdir /etc/apache2/ssl.crt
$ sudo cp inter/cert.crt /etc/apache2/ssl.crt/test-intermediate-ca.pem
Windows へのインストールと削除
オレオレ証明書を Windows にインストールします。あくまでもオレオレ証明書なので動作確認するときだけインストールして、動作確認が終わったらすぐに削除するようにした方がよいでしょう。オレオレ証明書を Windows へインストールしたまま使用するのは危険です。
Windows にオレオレ証明書をインストールするには \\wsl$\Ubuntu-20.04\home\trueroad\git\github\trueroad\make-cert-kit\samples\RSA-SHA2\root
にある cert.crt
を開いて「証明書のインストール」ボタンを押します。証明書ストアの選択では「証明書の種類の基づいて、自動的に証明書ストアを選択する」ではなくて「証明書をすべて次のストアに配置する」を選択し「参照」ボタンを押して「信頼されたルート証明機関」を選びます。
Windows にインストールしたオレオレ証明書を削除するには certmgr.msc
を起動して、「信頼されたルート証明機関」→「証明書」の中にある「Test Root CA RSA 4096 with SHA-384」を右クリックして「削除」を選びます。
http/https サイト設定
Ubuntu ではデフォルトのサイトのファイルは /var/www/html
以下に入っていますが、こことは別に example.com 用のファイルを /var/www/example.com
以下に入れるように設定します。
設定ファイル
まず http のデフォルト設定ファイル /etc/apache2/sites-available/000-default.conf
を元に http://example.com 用の設定を書いた以下の内容の /etc/apache2/sites-available/001-example.com.conf
を置きます。
<VirtualHost *:80>
ServerName example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www/example.com
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
次に https のデフォルト設定ファイル /etc/apache2/sites-available/default-ssl.conf
を元に https://example.com 用の設定を書いた以下の内容の /etc/apache2/sites-available/example.com-ssl.conf
を置きます。証明書などは上記で /etc/
以下に入れたものを使用します。
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@example.com
DocumentRoot /var/www/example.com
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-test-example-com.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-test-example-com.key
SSLCertificateChainFile /etc/apache2/ssl.crt/test-intermediate-ca.pem
</VirtualHost>
</IfModule>
設定の有効化
デフォルトのサイト設定ファイルを無効化(/etc/apache2/sites-enabled
のシンボリックリンクを消す)します。
$ sudo a2dissite 000-default
$ sudo a2dissite default-ssl
example.com のサイト設定ファイルを有効化(/etc/apache2/sites-enabled
にシンボリックリンクを作る)します。
$ sudo a2ensite 001-example.com
$ sudo a2ensite example.com-ssl
https でアクセスできるように mod_ssl を有効化(/etc/apache2/mods-enabled
にシンボリックリンクを作る)します。
$ sudo a2enmod ssl
コンテンツの配置
以下のような適当なコンテンツを /var/www/example.com/index.html
に置きます。
<DOCTYPE! html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>example.com テストページ</title>
</head>
<body>
<h1>example.com テストページ</h1>
</body>
</html>
設定の確認とサービス再起動
Apache HTTP Server の設定が正しいか確認します。Ubuntu のコンソールで
$ sudo apache2ctl configtest
Syntax OK
として上記のように Syntax OK と出たら確認 OK ですので、
$ sudo service apache2 restart
として Apache HTTP Server を再起動します。
動作確認
Windows のブラウザ(Edge など)で https://example.com を開き、警告など無しで「example.com テストページ」が表示されれば成功です。
次回
引き続き d アカウント・コネクトでソーシャルログインできるようにしてみる「2. d アカウント・コネクト編」に続きます。