mod_auth_openidc で OpenID Connect (OIDC) 認証を --- 1. 準備編

Apache HTTP Server + [mod\_auth\_openidc](https://github.com/zmartzone/mod_auth_openidc) で OpenID Connect (OIDC) 認証が必要な Web サイトを作ってみます。

本記事は「1. 準備編」で、https のサイトを作るところまでです。次の記事は「[2. d アカウント・コネクト編](https://qiita.com/trueroad/items/3562be88b1d48130c18c)」です。

もしかしたらマズい設定などがあるかもしれません。気が付いた方はご指摘いただけるとありがたいです。

## 環境

とりあえず 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` に以下のような変更を加えます。

```.patch
--- 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` を置きます。

```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/` 以下に入れたものを使用します。

```example.com-ssl.conf
<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` に置きます。

```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 アカウント・コネクト編](https://qiita.com/trueroad/items/3562be88b1d48130c18c)」に続きます。