サーバ証明書の有効期限を調べるコマンド

opensslコマンドで以ってサーバ証明書の有効期限を詳らかにするならこういう具合である。

$ sudo su -c "openssl x509 -dates -noout </etc/letsencrypt/live/www7390uo.sakura.ne.jp/cert.pem" | grep After
notAfter=Nov  5 23:18:58 2020 GMT

出力結果から有効期限の残り日数を導こうとするならば、もうひと手間かけねばならないとおもって取り組んだ成果がこうである。

!/bin/bash -eu

CERTPATH='/etc/letsencrypt/live/backtick.dip.jp/cert.pem'
EXPIRATION=$(sudo su -c "openssl x509 -dates -noout <${CERTPATH}" | grep After | cut -d= -f2)
END=$(date +%s --date "${EXPIRATION}")
NOW=$(date +%s)

echo $(( ("${END}" - "${NOW}") / 86400 ))

込み入っていて大変煩雑であるから工夫を凝らす余地が残されていると思うけれども思うばかりで詮無きことである。Let’s Encryptの証明書に限ればcertbotコマンドで以って有効な日数のみを得ることができる。

$ sudo certbot certificates 2>/dev/null | grep VALID | awk '{print $6}'
40

参考:
How to find Certifications Expiry Date

Let’s Encryptから取得したサーバ証明書の更新

OS: Ubuntu Server 16.04.5 LTS
certbot 0.26.1

嘗て取得したサーバ証明書の有効期限が30日を切り更新の実施が可能になったからをこれを実施しようというものである。30日以上の期限を残していても force-renewal サブコマンドで以って強制的に更新することは可能であるけれども今般はセオリー通り、renewal サブコマンドによる通常の更新なのである。

$ sudo certbot certificates
(snip)
Found the following certs:
  Certificate Name: www7390uo.sakura.ne.jp
    Domains: www7390uo.sakura.ne.jp
    Expiry Date: 2019-01-13 16:41:16+00:00 (VALID: 29 days)

然し乍らいざ証明書を更新する段になって改めて有効期限を確認すると89日間になっていてまったく魂消た。知らぬ間に更新が済んでいた模様である。此は如何にと思案し調べるとどうやらsystemdで以って自動的に更新されるよう手配されていたようである。関わりのあるユニットファイルは2つで、

/lib/systemd/system/certbot.timer
/lib/systemd/system/certbot.service

に配されている模様である。certbot.service には証明書を更新するコマンドが記述されており其の内容は /usr/bin/certbot -q renew こういう具合である。このコマンドを実行するタイミングは certbot.timer によって支配されており、毎日0時と12時に0~43200秒間のうちランダムな秒数だけ待機してから発動するよう計画されている。

$ systemctl list-timers
NEXT                         LEFT          LAST                         PASSED       UNIT                         ACTIVATES
Tue 2018-12-18 08:43:21 JST  6h left       Mon 2018-12-17 19:54:17 JST  5h 56min ago certbot.timer                certbot.service

更新の際にはLet’s Encryptのvalidation serverからアクセスがあるから、厳正なアクセス制限を施している場合は更新の妨げにならぬようアクセスを許可してやらねばならない。IPアドレスは13.58.30.69、34.213.106.112、52.29.173.72、64.78.149.164、66.133.109.36の少なくとも5つのうちいずれかのようである。

またSystemdを採用していないLinuxディストリビューションの為にCRONで以って同等の更新処理がなされるよう拵えてあった。こうして知らぬ間にサーバ証明書が更新されるのであるけれども、Webサーバを再起動しないと新たな証明書が有効にならないから気に留めておかねばならない。

$ cat /etc/cron.d/certbot
# /etc/cron.d/certbot: crontab entries for the certbot package
(snip)
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew

参考:
Cerbot cron job?
Automated Renewals
systemd/タイマー

nginxにSSLサーバ証明書の設定をおこなう

OS: Ubuntu Server 16.04.5 LTS
Nginx 1.14.0
OpenSSL 1.0.2g 1 Mar 2016

HTTPSで通信するための最低限の設定は公式サイトに示されているけれどもこれだけではセキュリティレベルに懸念が残るから此れを払拭するためにはMozilla SSL Configuration Generatorを活用するのが早いし容易い。

returnディレクティブによってHTTPへのアクセスをHTTPSへリダイレクトする設定も併せて表示してくれる心配りもあるからSSL設定に与って力があるサイトだとおもう。然し乍らHTTP/2での接続を受け付ける設定をも積極的に盛り込もうとするから、nginxをHTTP/2プロトコルに対応させるなり設定から除去するなどの始末をせねばコンフィグテストから剣突を食らうことは言を俟たない。

$ sudo /usr/local/nginx/sbin/nginx -t
nginx: [emerg] the "http2" parameter requires ngx_http_v2_module in /usr/local/nginx/conf/nginx.conf:25
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed

nginxをHTTP/2プロトコルに対応させるならばコンフィグオプションで --with-http_v2_module をつけて再度ビルド・インストールすれば宜しい。

ApacheにSSLサーバ証明書の設定をおこなう

OS: Ubuntu Server 18.04.1 LTS
Apache 2.4.35

SSLサーバ証明書を取得したらWebサーバの設定もアタボウに必要である。ソースからインストールしたApache2の設定ファイルを編集してゆく。幸い conf/extra/httpd-ssl.conf に雛形が用意されているので大きく書き換える必要が無くて大変有難いものである。

暗号化通信をおこなうためのモジュールがロードされていないと

AH00526: Syntax error on line 2 of /usr/local/apache2/conf/extra/httpd-ssl.conf:
Invalid command 'SSLCipherSuite', perhaps misspelled or defined by a module not included in the server configuration

というエラーメッセージを頂戴したり

AH00526: Syntax error on line 8 of /usr/local/apache2/conf/extra/httpd-ssl.conf:
SSLSessionCache: 'shmcb' session cache not supported (known names: ). Maybe you need to load the appropriate socache module (mod_socache_shmcb?).

という具合にSSLセッションをキャッシュする機能を活用するためのモジュールが必要である旨、知らされるから予めモジュールをロードするように各項目をコメントアウトしておく。

$ sudo vi /usr/local/apache2/conf/httpd.conf 
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
Include conf/extra/httpd-ssl.conf

あとはhttpd-ssl.confの雛形を利用してVirtualHostの設定をしたり証明書や秘密鍵を読み込むようよしなに書き換えてconfigtestでSyntax OKが出れば終いである。

$ sudo vi /usr/local/apache2/conf/extra/httpd-ssl.conf
SSLCertificateFile "/etc/letsencrypt/live/www7390uo.sakura.ne.jp/fullchain.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/www7390uo.sakura.ne.jp/privkey.pem"

mod_rewriteで以ってHTTPでのアクセスをHTTPSへリダイレクトさせる為に.htaccessも追加してやった。クライアントへ返すHTTPステータスコードは301 Moved Parmanentlyにしてやれば良さそうな情勢である。

$ vi .htaccess
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Let’s EncryptでSSLサーバ証明書を取得

OS: Ubuntu 18.04.1 LTS
Apache 2.4.34
certbot 0.23.0-1

HTTPによる通信の暗号化をせっせと進めてゆこうという世論の高まりにおされてLet’s Encryptが発行する無料のSSLサーバ証明書の取得を試みるものである。

SSLサーバ証明書の発行にはACME(Automated Certificate Management Environment) clientであるCertbotというツールがLet’s Encryptによって薦められているようである。

CertbotはGitHubより取得できるけれどもUbuntu Server 18.04.1にはcertbotパッケージが用意されているから此れを用いる。

$ sudo apt install certbot

多数のpythonパッケージと共にcertbotがインストールされる。そうしたら早速certbotの実行をする。サブコマンドはデフォルトで run が指定されて此れは証明書の取得からインストールまでこなすけれども、ひとまず証明書だけ取得したいから certonly を指定した。

--webroot--webroot-pathwebrootプラグインで以って証明書を発行するという注文である。--webroot-pathで指定したパスに一時ファイルが作成され此れをLet’s Encryptが検証の為にアクセスするからくりのようである。

あとは--emailでメールアドレスを、--domainでCommon Nameを指定してコマンドを実行するばかりであるけれども最初は如何な落ち度が潜んでいるか知れないから --dry-runを追加してテストをした。

$ sudo certbot certonly --webroot --webroot-path /home/guro/public_html/ --email www7390uo@gmail.com --domain www7390uo.sakura.ne.jp --dry-run

IMPORTANT NOTES:
 - The dry run was successful.

問題が無いようであれば--dry-runを外して実行である。最初はサービスの利用規約に同意するか否かを問われる。常に合意する心持ちがあれば --agree-tos オプションで以ってこの問いかけをスキップできるようである。

$ sudo certbot certonly --webroot --webroot-path /home/guro/public_html/ --email www7390uo@gmail.com --domian www7390uo.sakura.ne.jp
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel:

次は登録するメールアドレスをElectronic Frontier Foundation(EFF、電子フロンティア財団)と分かち合って良いか尋ねられる。分かち合えば登録したメールアドレス宛にEFFからのニュースやキャンペーンの報せが届くという。

Let’s Encryptプロジェクトの共同創設者でありCertbotを開発する非営利組織たるEFFからのお誘いであるけれどもNoと返答した。これは --no-eff-email オプションで予めNoを突きつけることができるし --eff-email オプションでYesと答える手間を省ける。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:

するとこうである。証明書の発行数制限に抵触した模様であってこうなるとどうも為す術がない。ドメインあたり週に50までと云う規制が課されているから今週分の注文については一足遅かったようである。なんて日だとおもう。

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for www7390uo.sakura.ne.jp
Using the webroot path /home/guro/public_html for all unmatched domains.
Waiting for verification...
Cleaning up challenges
An unexpected error occurred:
There were too many requests of a given type :: Error finalizing order :: too many certificates already issued for: sakura.ne.jp: see https://letsencrypt.org/docs/rate-limits/
Please see the logfiles in /var/log/letsencrypt for more details.

翌週までじっと堪えてから改めてコマンドを実行するとまだ発行数の上限には達していないものと見られ、恙無く証明書が発行された。証明書と中間証明書が一体になったfullchain.pemと秘密鍵privkey.pemだけでなく証明書単体cert.pemと中間証明書単体chain.pemも併せて/etc/letsencrypt/archive/www7390uo.sakura.ne.jpディレクトリに作成されるからサーバの環境に合わせて用いると良さそうな風情である。

$ sudo certbot certonly --webroot --webroot-path /home/guro/public_html/ --email www7390uo@gmail.com --domian www7390uo.sakura.ne.jp
(snip)
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/www7390uo.sakura.ne.jp/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/www7390uo.sakura.ne.jp/privkey.pem
   Your cert will expire on 2019-01-11. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"

証明書の内容を覗いてみればこうである。有効期限は90日間であるから期限切れの前に更新する段取りを立てておく必要がある。

# openssl x509 -text -in /etc/letsencrypt/live/www7390uo.sakura.ne.jp/cert.pem
Certificate:
(snip)
        Issuer: C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3
        Validity
            Not Before: Oct 15 16:41:16 2018 GMT
            Not After : Jan 13 16:41:16 2019 GMT
        Subject: CN=www7390uo.sakura.ne.jp
(snip)

なおアクセスログを眺めているとLet’s Encrypt validation serverからアクセスがあって /.well-known/acme-challenge/ 内に生成された一時ファイルを読み取っている模様である。

Let’s Encrypt validation serverには13.58.30.69、34.213.106.112、52.29.173.72、66.133.109.36の少なくとも4つIPアドレスがあったからこれらの接続を妨げないようファイアウォールやWebサーバの設定をよしなに改める必要があるけれどもIPアドレスは変更される可能性もあるから油断ならない。

$ tail -f /usr/local/apache2/logs/access_log.guro
66.133.109.36 - - [13/Oct/2018:15:23:28 +0900] "GET /.well-known/acme-challenge/ab4cOkLSd034tdoxftVHDpgrLVsC4oz5N_8H5ySX7_3 HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" 267 361