# Let's Encrypt certbot で無料 SSL 設定

CentOS 7に Lets Encrypt 無料 SSL 証明書入れた時のメモ、今まで何回も作業していたが、コマンドや手間が多く毎回調べなたらでやっていました。ググる情報の中で古くて使えないものもあったので、CentOS 7 + Apache 2.4 最新版メモりました。

# 環境

  • CentOS 7
  • Apache 2.4
  • Git

Apache インストール yum install httpd
Git インストール yum install git

# certbot-auto インストール

root 権限必要

# git clone
git clone https://github.com/certbot/certbot

# リンク作成してコマンド化
ln --symbolic $PWD/certbot/certbot-auto /usr/local/sbin/

# 依存パッケージのインストール
certbot-auto --install-only

# バージョン
certbot-auto --version
certbot 0.40.1

# Lets encrypt 無料 SSL ドメイン設定

certbot-auto

ガイドに従って設定すれば OK

# Apache config 設定

/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d
conf ファイル SSL 設定

<VirtualHost *:443>
  DocumentRoot /var/www/ドメイン名
  ServerName ドメイン名

  SSLEngine on
  SSLProtocol all -SSLv2 -SSLv3
  SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
  SSLCertificateFile /etc/letsencrypt/live/ドメイン名/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/ドメイン名/privkey.pem

</VirtualHost>

確認

apachectl configtest
Syntax OK

Apache2.4.8 からcert.pem chain.pemの代わりにSSLCertificateFilefullchain.pem privkey.pem推奨

fullchain.pem
All certificates, including server certificate (aka leaf certificate or end-entity certificate). The server certificate is the first one in this file, followed by any intermediates.

This is what Apache >= 2.4.8 needs for SSLCertificateFile (opens new window), and what Nginx needs for ssl_certificate (opens new window).

参考certbot.eff.org (opens new window)

# Apache リロード・再起動・状態確認

初回は start する必要、二回目以降はreload restart

service httpd reload
service httpd status

# 証明書更新 certbot-auto renew

有効期限残り 30 日以下の時に自動更新してくれます。
crontabで月一回実行設定した方が忘れなく安心。

certbot-auto renew

Crontab 設定
crontab -eコマンドで下記追加

00 03 01 * * root certbot-auto renew --post-hook "service httpd reload"

# certbot-auto コマンドについて

certbot-auto コマンド構造

certbot-auto [SUBCOMMAND] [options] [-d DOMAIN] [-d DOMAIN] ...

# SUBCOMMAND サブコマンド

certonly サーバ証明書の取得のみ(設定は手動)
renew 有効期限が近い証明証を更新

他にもinstall revoke register rollback config_changesなどありますが、詳細はLet's Encrypt 総合ポータル (opens new window)にて

# options オプション

-h --help ヘルプ表示
-m --email アカウント登録や回復するためのメールアドレス -m abc@example.com
-d --domains SSL 取得申請ドメイン名 -d sub.example.com -dは複数回指定 OK
--redirect HTTP から HTTPS に自動リダイレクトする
--no-redirect HTTP から HTTPS に自動リダイレクトしない

--hsts すべての HTTP レスポンスにStrict-Transport-Securityヘッダーを追加
--no-hsts すべての HTTP レスポンスにStrict-Transport-Securityヘッダーを追加しない

--uir すべての HTTP レスポンスにContent-Security-Policy: upgrade-insecure-requestsヘッダーを追加
--no-uir すべての HTTP レスポンスにContent-Security-Policy: upgrade-insecure-requestsヘッダーを追加しない

# サブコマンドrenewのオプション

renew は証明書を更新するためのサブコマンドで以下の専用オプションがあります。

--pre-hook 証明書更新前に実行するシェルコマンド
--post-hook 証明書更新作業後に実行するシェルコマンド
--renew-hook 証明書更新成功後に実行するシェルコマンド

# certbot-auto ヘルプ

certbot-auto -h

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  certbot-auto [SUBCOMMAND] [options] [-d DOMAIN] [-d DOMAIN] ...

Certbot can obtain and install HTTPS/TLS/SSL certificates.  By default,
it will attempt to use a webserver both for obtaining and installing the
certificate. The most common SUBCOMMANDS and flags are:

obtain, install, and renew certificates:
    (default) run   Obtain & install a certificate in your current webserver
    certonly        Obtain or renew a certificate, but do not install it
    renew           Renew all previously obtained certificates that are near
expiry
    enhance         Add security enhancements to your existing configuration
   -d DOMAINS       Comma-separated list of domains to obtain a certificate for

  --apache          Use the Apache plugin for authentication & installation
  --standalone      Run a standalone webserver for authentication
  --nginx           Use the Nginx plugin for authentication & installation
  --webroot         Place files in a server's webroot folder for authentication
  --manual          Obtain certificates interactively, or using shell script
hooks

   -n               Run non-interactively
  --test-cert       Obtain a test certificate from a staging server
  --dry-run         Test "renew" or "certonly" without saving any certificates
to disk

manage certificates:
    certificates    Display information about certificates you have from Certbot
    revoke          Revoke a certificate (supply --cert-path or --cert-name)
    delete          Delete a certificate

manage your account:
    register        Create an ACME account
    unregister      Deactivate an ACME account
    update_account  Update an ACME account
  --agree-tos       Agree to the ACME server's Subscriber Agreement
   -m EMAIL         Email address for important account notifications

More detailed help:

  -h, --help [TOPIC]    print this message, or detailed help on a topic;
                        the available TOPICS are:

   all, automation, commands, paths, security, testing, or any of the
   subcommands or plugins (certonly, renew, install, register, nginx,
   apache, standalone, webroot, etc.)
  -h all                print a detailed help page including all topics
  --version             print the version number

# 参考

Let's Encrypt 公式サイト (opens new window)
Github Certbot (opens new window)
Certbot 公式サイト certbot.eff.org (opens new window)
Let's Encrypt 総合ポータル (opens new window)
Certbot(Let's Encrypt)入門 (opens new window)

# 遭遇エラー

certbot-auto renew で SSL 更新しようと思って思わず遭遇したエラーです。

certbot-auto renew -d xxx.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Currently, the renew verb is capable of either renewing all installed certificates that are due to be renewed or renewing a single certificate specified by its name. If you would like to renew specific certificates by their domains, use the certonly command instead. The renew verb may provide other options for selecting certificates to renew in the future.

いわゆる、デバッグログは/var/log/letsencrypt/letsencrypt.logに保存したけど、ドメインを指定して SSL 更新するなら=certonly=使ってみてねってことです。

certbot-auto certonly --apache -d xxx.com

試しに、コマンド打ってみましたが、問題解決しました。
SSL の更新は certbot-auto renew より certonly の方が良かったようです。

2019-11-20
  • centos