CentOS6にLet's Encryptをインストールする

CentOS6にLets Encryptで取得したサーバ証明書をインストールして利用できるようにする手順です。

1.python2.7インストール

Centos6ではpythonのバージョンが古いため、Python 2.7が利用(共存)できるようにSoftware Collectionを利用します。

Pythonバージョン確認

# python --version
Python 2.6.6

Software Collectionとpython27をインストール

# yum install centos-release-scl-rh
# yum install python27

profile作成

# vi /etc/profile.d/python27.sh
# yum install python27

-- 以下の項目を設定します --------------------------
#!/bin/bash
source /opt/rh/python27/enable
export X_SCLS="`scl enable python27 'echo $X_SCLS'`"
----------------------------------------------

環境設定を読み込む

# source /opt/rh/python27/enable
# export X_SCLS="`scl enable python27 'echo $X_SCLS'`"

Pythonバージョン確認

# python --version
2.7.17

2.certbotコマンドを入手して証明書を取得

certbotコマンドは認証局Let's Encryptが発行する無料のTLSサーバ証明書を、簡単なコマンド操作で取得・更新できるオープンソースソフトです。
まずは下記よりwgetコマンドでcertbot-autoを入手します。

# wget https://dl.eff.org/certbot-auto
# chmod 744 certbot-auto

コマンド実行前に--dry-runオプションをつけて問題がないか確認します。
ここで設定するメールアドレスに、更新通知のメールが来るようになります。

./certbot-auto certonly --webroot -w [ドキュメントルート] -d [ドメイン名] --email [メールアドレス] --dry-run

不足しているパッケージがあればここでインストールが促されるので y でインストールを実行します。
※URLにwwwありでもアクセス可能な運用をしている場合は併せて指定しておく必要があります。
以下は実行例です。

./certbot-auto certonly --webroot -w /home/www -d example.com -d www.example.com --email info@example.com --dry-run

(下記のエラーが出る場合)
Waiting for verification...
Challenge failed for domain [ドメイン名]
http-01 challenge for [ドメイン名]
Cleaning up challenges
Some challenges have failed.

port 80 に対してアクセスを試みて失敗している状況です。
既に他社でサーバ証明書を設定していたり、してport80のバーチャルホスト設定を削除している場合は、再設定してRewrite設定を追加しておきましょう。

<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName example.com
ServerAlias www.example.com
CustomLog logs/example.com-access_log combined
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

問題がなければ--dry-runオプションを外して再度実行します

# ./certbot-auto certonly --webroot -w /home/www -d example.com -d www.example.com --email info@example.com

以下それぞれ質問に答えて進めます。キャンペーンメール受信のNは必要であればYで回答。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, 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: N

出力内容を確認します

# ll /etc/letsencrypt/live/[ドメイン名]/
合計 4
-rw-r--r-- 1 root root 692 11月 4 10:36 2020 README
lrwxrwxrwx 1 root root 34 11月 4 10:36 2020 cert.pem -> ../../archive/[ドメイン名]/cert1.pem
lrwxrwxrwx 1 root root 35 11月 4 10:36 2020 chain.pem -> ../../archive/[ドメイン名]/chain1.pem
lrwxrwxrwx 1 root root 39 11月 4 10:36 2020 fullchain.pem -> ../../archive/[ドメイン名]/fullchain1.pem
lrwxrwxrwx 1 root root 37 11月 4 10:36 2020 privkey.pem -> ../../archive/[ドメイン名]/privkey1.pem

上記内容が出力されるので、それぞれバーチャルホストに設定します。

SSLCertificateFile /etc/letsencrypt/live/[ドメイン名]/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/[ドメイン名]/privkey.pem
SSLCACertificateFile /etc/letsencrypt/live/[ドメイン名]/chain.pem

設定に問題がないか確認、問題がなければリロードして設定を反映させる

# httpd -S
# service httpd reload

3.動作確認

実際にブラウザでアクセスしてみましょう。
もしくは下記コマンドでも確認は可能です。

echo x | openssl s_client -connect [対象ドメイン]:443 -showcerts

4.自動更新設定

Let's Encryptの有効期限は3か月です、効期限が30日前になったら更新可能になります。自動更新されるようにcron設定をしておくと便利です。

まずは--dry-runを付与した状態でコマンドを実行して更新がうまくいくか検証します。

# /root/certbot-auto renew --dry-run

自動更新設定 crontab

# crontab -e

-- 設定例 ------------------------------------
0 1 3 * * /root/certbot-auto renew
0 2 3 * * service httpd restart
----------------------------------------------
上記をcrontabに設定で毎月3日の朝1時に新しい証明書が取得されて、2時にhttpdサービスの再起動を行い新しい証明書が読み込まれるようになります。
前述のとおり有効期限が30日前になったら更新可能になりますので、それまでは無視されます。頻繁に更新処理を投げるとブロックされますので注意が必要です。
無償利用のため出来る限り負荷をかけない設定が好ましいです。

通知先メールアドレスを変更する場合は下記コマンドで変更できます。

# certbot-auto register --update-registration --email [new Mailaddress]

last update:2020/12/18