Let’s EncryptとMyDNS.JPによるSSL認証

Memo

この記事に触発されてホコリが被っていたラズパイをいじったときの備忘録。

Apacheのインストール

apache2とmod_wsgi関連の諸々(正直よくわかってない)をインストールする。

$ sudo apt-get install apache2
$ sudo apt-get install libapache2-mod-wsgi
$ sudo pip install mod_wsgi

Apacheの設定

設定ファイルを編集する。理由は割愛。

$ sudo vi /etc/apache2/conf-available/serve-cgi-bin.conf
(変更後)
<IfDefine ENABLE_USR_LIB_CGI_BIN>
    ScriptAlias /cgi-bin/ /home/litoma/public_html/cgi-bin/
    <Directory "/home/litoma/public_html/cgi-bin">
$ sudo vi /etc/apache2/sites-available/000-default.conf
(変更前)
 # Include conf-avaliable/serve-cgi-bin.conf
(変更後:コメントを外す)
 Include conf-avaliable/serve-cgi-bin.conf
$ sudo vi /etc/apache2/mods-available/mime.conf
(変更後)
  AddHandler cgi-script .cgi .py
  AddHandler wsgi-script .wsgi

シンボリックリンクを所定のフォルダに作成して必要な機能を有効化する。Debianの場合こうするらしい。

$ sudo ln -s /etc/apache2/mods-available/userdir.conf /etc/apache2/mods-enabled/userdir.conf
$ sudo ln -s /etc/apache2/mods-available/userdir.load /etc/apache2/mods-enabled/userdir.load
$ sudo ln -s /etc/apache2/mods-available/cgi.load /etc/apache2/mods-enabled/cgi.load
$ sudo ln -s /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled/ssl.conf
$ sudo ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled/ssl.load
$ sudo ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/default-ssl.conf
$ sudo ln -s /etc/apache2/mods-available/wsgi.conf /etc/apache2/mods-enabled/wsgi.conf
$ sudo ln -s /etc/apache2/mods-available/wsgi.load /etc/apache2/mods-enabled/wsgi.load

元記事だとこれでうまくいくみたいだけど、自分の場合shmcbが足りない的なエラーが出たので以下も追加する。ちなみにこのサイトを参考にした。

$ sudo ln -s /etc/apache2/mods-available/socache_shmcb.load /etc/apache2/socache_shmcb.load

apache2を再起動して設定を反映して終わり。

$ sudo /etc/init.d/apache2 restart

サーバ証明書の取得

元記事のとおりLet’s Encryptを使用する。ただし、MyDNS.JPとの組み合わせでは元記事のままではうまくいかなかったので、少し工夫する。

certbotのインストール

まずLet’s Encryptのクライアント(certbot)をインストールしなきゃいけない。が、これが結構面倒だった。

このサイトを参考にDebian Backports リポジトリを追加する。

$ sudo vi /etc/apt/sources.list
(以下を追加)
deb http://ftp.jp.debian.org/debian stretch-backports main contrib non-free

GPGエラーとか出る場合は以下を実行してみる。

$ gpg --keyserver pgpkeys.mit.edu --recv-key 8B48AD6246925553

dirmngrが足りないとか言われたら以下も実行する。

sudo apt-get install dirmngr

諸々うまくいったらcertbotをインストール。

$ sudo apt-get update
$ sudo apt-get install certbot python-certbot-apache -t stretch-backports

このパッケージ版certbotの場合、自動的にcronが追加されるらしいのだけど、あとで自分で追加したいので今は削除。特にこだわりがなければそのままでもいいと思う。

$ sudo rm -rf /etc/cron.d/certbot

DNS認証ツールの実行

基本的にはツール提供元のとおりやればいいのだけど、unzipでうまくいかない場合は以下参照。(この記事を参考にした)

$ sudo su -
# mkdir /etc/letsencrypt/DirectEdit-master
# chmod 700 /etc/letsencrypt/DirectEdit-master
# cd /etc/letsencrypt/DirectEdit-master/
# wget https://raw.githubusercontent.com/disco-v8/DirectEdit/master/txtdelete.php
# wget https://raw.githubusercontent.com/disco-v8/DirectEdit/master/txtedit.conf
# wget https://raw.githubusercontent.com/disco-v8/DirectEdit/master/txtregist.php
# chmod 600 ./*.conf
# chmod 700 ./*.php

confファイルの変更。

# vi /etc/letsencrypt/DirectEdit-master/txtedit.conf
(''内を適宜変更する)
$MYDNSJP_MASTERID = 'yourmasterid';
$MYDNSJP_MASTERPWD = 'yourpasswd';
$MYDNSJP_DOMAIN = 'yourdomain';

certbotでサーバ証明書を取得。

(<<<>>>内を適宜変更する)
# certbot certonly --manual --preferred-challenges=dns \
--manual-auth-hook /etc/letsencrypt/DirectEdit-master/txtregist.php \
--manual-cleanup-hook /etc/letsencrypt/DirectEdit-master/txtdelete.php \
-d <<<Domain>>> \
--server https://acme-v02.api.letsencrypt.org/directory \
--agree-tos -m <<<Mail Address>>> --manual-public-ip-logging-ok

ここで、phpがないとツールが動かなくて死ぬ。以下を実行。

# apt-get install php
# apt-get install php-mbstring

certbotがうまくいけば以下のファイルがあるはず。

/etc/letsencrypt/live/XXXXXX.mydns.jp/fullchain.pem
/etc/letsencrypt/live/XXXXXX.mydns.jp/privkey.pem

サーバ証明書を参照するようにApacheの設定を変更する。

$ sudo vi /etc/apache2/sites-available/default-ssl.conf
(変更後)
SSLCertificateFile        /etc/letsencrypt/live/XXXXXX.mydns.jp/fullchain.pem
SSLCertificateFileKeyFile /etc/letsencrypt/live/XXXXXX.mydns.jp/privkey.pem

apache2を再起動して設定を反映。

$ sudo /etc/init.d/apache2 restart

ブラウザからhttps://XXXXXX.mydns.jpにアクセスしてデフォルトページが表示できれば成功。お疲れさまでした。

DDNSと証明書の自動更新

MySQLのDDNS更新

更新中。この記事を参考にやる。

サーバ証明書の更新

更新中。この記事を参考にやる。

cronによる自動化

更新中。

コメント