pkgsrc/security/acmeshでLet's EncryptのTLS/SSL証明書を使う

この記事は、NetBSD Advent Calendar 2018の4日目の記事です。

自分のウェブサイトをLet's EncryptでTLS/SSL化したいと思っていて、 過去にはpkgsrc/security/py-certbotを試すために pkgsrc/sysutils/py-psutilのNetBSDへの移植に 取り組んだこともあったのだが、なかなか継続的に利用し続けるのは大変だった。

NetBSD blogの Using acme.sh for Let's Encrypt certificates on pkgsrc.org servers を読んで、acme.sh を試したいと思ったのだが、そもそもpkgsrcには収録されていないし、DNSによる認証は ちょっと遠慮したいので、そのまま適用はできないでいた。 やっと重い腰を上げてpkgsrcに追加して設定した話を書きたい。 ちなみに、ワイルドカード証明書が発行できるようになっているが、今回はワイルドカード証明書 は発行を受けない。

インストール

インストールは、pkgsrc/security/acmeshを使えば良い。

# cd /usr/pkgsrc/security/acmesh
# make install
以上のように実行すれば良い。このようにインストールすると、 ▽usおそらくHTTPでの認証で ウェブサーバーをインストールしないでもTLS/SSL証明書を発行できるように pkgsrc/net/socatもインストールされる。 今回はsocatは使わないがインストールされてしまう。

TLS/SSL証明書の発行を受ける

TLS/SSL証明書の発行を受けようというサーバーのホスト名はwww.example.com であることにしよう。 このFQDNでアクセスできるようにDNSを設定しておくのが必要なのは言うまでもない。

私は、このサーバーでpkgsrc/www/nginx-develをhttpdとして 使用する予定なので、TLS/SSL証明書の発行を受ける際にも、これを使用することにする。 以下のようにインストールし、設定しておく。

# cd /usr/pkgsrc/www/nginx-devel
# make install
# vi /usr/pkg/etc/nginx/nginx.conf
http {
(snip)
    server {
        listen       80;
        server_name  www.example.com;
(snip)
        location / {
            root   /usr/htdocs;
            index  index.html index.htm;
        }
(snip)
# cp /usr/pkg/share/examples/rc.d/nginx /etc/rc.d
# vi /etc/rc.conf
(snip)
nginx=YES
(snip)
# /etc/rc.d/nginx start
次に、HTTPでの認証用のファイルの作成などをacme.shコマンドを使って行なう。
# sudo nginx
$ /usr/pkg/sbin/acme.sh --issue -w /usr/htdocs -d www.example.com
こによって、例えば
/usr/htdocs/.well-known/acme-challenge/q-h2-aGCzrWmEurHUYgG_KZU1hVroXgi9n6nzNH0odc
のようなファイル名のファイルが生成され、2分間(?)程度待つとTLS/SSL証明書が発行される。 場所は、nginxユーザーのホームディレクトリーである/var/db/nginx 以下である。 使用する2つのファイルを/usr/pkg/etc/nginx内にシンボリックリンクしておく。
# cd /usr/pkg/etc/nginx
# ln -s /var/db/nginx/.acme.sh/www.example.com/fullchain.cer www.example.com.cer
# ln -s /var/db/nginx/.acme.sh/www.example.com/www.example.com.key www.example.com.key

これらを、それぞれ/usr/pkg/etc/nginx.confに以下のように設定する。

# vi /usr/pkg/etc/nginx.conf
(snip)
http {
    server {
        listen       443 http2 ssl;
        server_name  www.example.com;

        ssl_certificate      www.example.com.cer;
        ssl_certificate_key  www.example.com.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
(snip)

TLS/SSL証明書を更新する

このように発行されたLet's EncryptのTLS/SSL証明書は、3カ月しか有効ではない。 毎回手作業では大変なのでcronで自動的に更新したい。 今回は以下のように、TLS/SSL証明書を再取得してnginxを再起動する ように設定した。しかし、まだ初回の更新の機会がめぐって来ていないので、 実際のところはうまく動くかは分からない。

# cd /usr/pkgsrc/security/sudo
# make install
# visudo
(snip)
nginx ALL=(root) NOPASSWD: /etc/rc.d/nginx reload
# sudo nginx
$ crontab -e
3 1 * * * /usr/pkg/sbin/acme.sh --cron --home /var/db/nginx/.acme.sh --reloadcmd "/usr/pkg/bin/sudo /etc/rc.d/nginx reload" && /usr/pkg/sbin/acme.sh --cron --home /var/db/nginx/.acme.sh  --installcert -d www.example.com --reloadcmd "/usr/pkg/bin/sudo /etc/rc.d/nginx reload"
crontabの内容について、実際に動くのを確認できた内容に書き換えました。

明日は、NetBSDデスクトップ環境として常用しているHP Spectre x360 13-inch ae019TUについて、 NetBSD/amd64-currentをインストールする話を書こうと思います。

Comments

Popular posts from this blog

#5000へCメールを送れないau端末でezweb.ne.jpの電子メールアドレスをIMAP4/SMTPで扱う方法

PostgreSQLのOracle Foreign Data WrapperをWindowsで使う

Vaio Pro 11/13用のサードパーティーのACアダプター