LibreSSL で SSL/TLS 対応の Webサーバを設定する（FreeBSD編）

LibreSSL の OpenBSD 以外の BSD系 での利用はどうなっているでしょうか？
OpenBSD 以外の BSD系でも OpenSSL ではなく LibreSSL を利用する試みがなされています。
ここでは [FreeBSD](https://www.freebsd.org/) での LibreSSL の利用について確認してみます。

---

# はじめに
FreeBSD での LibreSSL の利用については以下の Wiki に情報がまとめられています。
https://wiki.freebsd.org/LibreSSL

利用方法は大きく２つあって、Ports を LibreSSL を使ってビルドする方法と Base システム全体を LibreSSL で再構築してしまう方法です。
後者の全体を再構築する方法は、/usr/src 以下に LibreSSL でビルドするためのパッチを当てる、というものになっています。
再構築にかなり時間が掛かって(やってみたら6時間超掛かりました)お手軽ではありませんでした。

今回は前者の Ports を LibreSSL を使ってビルドする方法を確認してみます。
Ports の機能で LibreSSL と [Apache](https://httpd.apache.org/) 及び [Nginx](http://nginx.org/) をインストールして動作確認してみます。
Ports の方法は自分の必要な部分だけを LibreSSL 化できるので使い勝手も良いと思います。

# 環境について

FreeBSD 10.3 (amd64) で検証しました。
FreeBSD-10.3-RELEASE-amd64-dvd1.iso でインストールしています。

確認の前に Ports を最新の状態にしておきました。

```shell-session
# portsnap fetch
# portsnap extract
# portsnap update
```

この状態で OpenSSL のファイルを確認しておくと以下のようになっています。

```shell-session
コマンド： /usr/bin/openssl
ライブラリ： /usr/lib/libssl.so.7　/lib/libcrypto.so.7
ヘッダファイル：　/usr/include/openssl/

# openssl version
OpenSSL 1.0.1s-freebsd  1 Mar 2016
```
OpenSSL のファイルは /usr/ 配下にインストールされていることが分かります。

# Ports を利用して LibreSSL をインストールする

方法は通常の Ports と同じです。
LibreSSL の Ports は /usr/ports/security/ 配下にあり２つのバージョンが用意されています。
libressl が安定版で libressl-devel が非安定板となっています。
各々のバージョンを distinfo ファイルで確認してみると、libressl が 2.3.5、libressl-devel が 2.4.0 となっていました。

今回は、最新の 2.4.0 を試したいので libressl-devel を選択してみます。
インストール手順は以下のようになります。

```shell-session
# cd /usr/ports/security/libressl-devel
# make install
```

この状態で LibreSSL のファイルを確認しておくと以下のようになっています。

```shell-session
コマンド： /usr/local/bin/openssl
ライブラリ： /usr/local/lib/libssl.so.39　/usr/local/lib/libcrypto.so.38
ヘッダファイル：　/usr/local/include/openssl/

# /usr/local/bin/openssl version
LibreSSL 2.4.0
```
LibreSSL のファイルは /usr/local/ 配下にインストールされていることが分かります。


# Ports を利用して LibreSSL とリンクした Apache HTTP サーバをインストールする
Ports に www/apache24 として 2.4.20 が用意されていますのでこれをインストールしてみます。

## インストール
まず LibreSSL をリンクするように以下の設定を行います。

```control:/etc/make.conf 
WITH_OPENSSL_PORT=	yes
OPENSSL_PORT=		security/libressl-devel
```

次に Apache をインストールします。

```shell-session
# cd /usr/ports/www/apache24
# make install
```
Apache も /usr/local/ 配下にインストールされます。
また、LibreSSL とリンクされていることが以下で分かります。

```shell-session
# ldd /usr/local/libexec/apache24/mod_ssl.so
/usr/local/libexec/apache24/mod_ssl.so:
        libssl.so.39 => /usr/local/lib/libssl.so.39 (0x801633000)
        libcrypto.so.38 => /usr/local/lib/libcrypto.so.38 (0x801892000)
        libcrypt.so.5 => /lib/libcrypt.so.5 (0x801c8e000)
        libthr.so.3 => /lib/libthr.so.3 (0x801eae000)
        libc.so.7 => /lib/libc.so.7 (0x800821000)
#
```

## SSL/TLS 通信の設定

SSL/TLS 通信のための設定を行います。
以下に示す行の先頭の '#' を削除しています。

```control:/usr/local/etc/apache24/httpd.conf
...(略)...
     89 LoadModule socache_shmcb_module libexec/apache24/mod_socache_shmcb.so
...(略)...
    143 LoadModule ssl_module libexec/apache24/mod_ssl.so
...(略)...
    512 Include etc/apache24/extra/httpd-ssl.conf
...(略)...
```

LibreSSL の `openssl` コマンドを使って秘密鍵とサーバ証明書(自己署名証明書、いわゆるオレオレ証明書)を生成します。

```shell-session
# /usr/local/bin/openssl genrsa -out server.key 2048
# /usr/local/bin/openssl req -new -key server.key -out server.csr
# /usr/local/bin/openssl x509 -days 30 -req -signkey server.key -in server.csr -out server.crt
```

生成したサーバの鍵と証明書を配置します。

```shell-session
# mv server.key /usr/local/etc/apache24/
# smv server.crt /usr/local/etc/apache24/
```

Apache の起動を許可する設定を行っておきます。

```shell-session
# echo 'apache24_enable="YES"' >> /etc/rc.conf
```
設定は以上で完了です。

## 動作確認
以下のコマンドで Apache を起動します。

```shell-session
# /usr/local/sbin/apachectl start
```
Web ブラウザで https を指定してアクセスすると、"It works!" が表示されるのが分かると思います。

また、以下のように openssl s_client コマンドで SSL/TLS 通信の確認をすることもできます。

```shell-session
# /usr/local/bin/openssl s_client -port 443 -cipher 'CHACHA20'
...
---
SSL handshake has read 1588 bytes and written 378 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-CHACHA20-POLY1305
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-CHACHA20-POLY1305
...
```

# Ports を利用して LibreSSL とリンクした Nginx をインストールする
Ports に www/nginx-devel として 1.11.1 が用意されていますのでこれをインストールしてみます。

## インストール
LibreSSL をリンクするため以下の設定をしておくのは同様です。

```control:/etc/make.conf 
WITH_OPENSSL_PORT=	yes
OPENSSL_PORT=		security/libressl-devel
```

次に Nginx をインストールします。

```shell-session
# cd /usr/ports/www/nginx-devel
# make install
```
Nginx も /usr/local/ 配下にインストールされます。

## SSL/TLS 通信の設定
SSL/TLS 通信のための設定を行います。
以下に示す行の先頭の '#' を削除しています。

```control:/usr/local/etc/nginx/nginx.conf
...(略)...
     98     # HTTPS server
     99     #
    100     server {
    101         listen       443 ssl;
    102         server_name  localhost;
    103
    104         ssl_certificate      cert.pem;
    105         ssl_certificate_key  cert.key;
    106
    107         ssl_session_cache    shared:SSL:1m;
    108         ssl_session_timeout  5m;
    109
    110         ssl_ciphers  HIGH:!aNULL:!MD5;
    111         ssl_prefer_server_ciphers  on;
    112
    113         location / {
    114             root   /usr/local/www/nginx;
    115             index  index.html index.htm;
    116         }
    117     }
...(略)...
```

LibreSSL の `openssl` コマンドを使って秘密鍵とサーバ証明書(自己署名証明書、いわゆるオレオレ証明書)を生成します。

```shell-session
# /usr/local/bin/openssl genrsa -out server.key 2048
# /usr/local/bin/openssl req -new -key server.key -out server.csr
# /usr/local/bin/openssl x509 -days 30 -req -signkey server.key -in server.csr -out server.crt
```

生成したサーバの鍵と証明書を配置します。

```shell-session
# mv server.key /usr/local/etc/nginx/cert.key
# mv server.crt /usr/local/etc/nginx/cert.pem
```
設定は以上で完了です。

## 動作確認
以下のコマンドで Nginx を起動します。

```shell-session
# /usr/local/sbin/nginx
```
Web ブラウザで https を指定してアクセスすると、"Welcome to nginx!" が表示されるのが分かると思います。

また、以下のように openssl s_client コマンドで SSL/TLS 通信の確認をすることもできます。

```shell-session
# /usr/local/bin/openssl s_client -port 443 -cipher 'CHACHA20'
...
SSL handshake has read 1492 bytes and written 298 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-CHACHA20-POLY1305
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-CHACHA20-POLY1305
...
```

# まとめ

最新の FreeBSD 10.3 では Ports を使うと簡単に LibreSSL が導入できることを確認しました。
バージョンも安定版と非安定版のどちらか使いたい方を選択できるようになっています。
また Apache や Nginx 等の Webサーバも、Ports を使えば LibreSSL とリンクしたものを容易にインストールできることが分かりました。

今後、FreeBSD 上で SSL/TLS 通信が必要となる場合、標準の OpenSSL だけでなく、LibreSSL も候補として検討することができるでしょう。