Apache 2.4:無料SSL証明書「Let’s Encrypt」導入

無料SSL証明書の「Let’s Encrypt」を Apache 2.4環境に導入します。(2016-05-08作成)

vitieubao / Pixabay

Let’s Encrypt とは

認証局( CA )として「SSL/TLSサーバ証明書」を無料で発行するとともに、証明書の発行・インストール・更新のプロセスを自動化することにより、TLS や HTTPS(TLSプロトコルによって提供されるセキュアな接続の上でのHTTP通信)を普及させることを目的としているプロジェクトです。

1.環境整備

$ cat /etc/redhat-release 
CentOS release 6.7 (Final)

$ sudo /usr/sbin/httpd -V | head -n 1
Server version: Apache/2.4.10 (Unix)

$ openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013

$ git --version
git version 1.7.1

$ python --version
Python 2.7.5

★Let's Encrypt 導入サイト(参考)
https://www.offline-net.com

2.Python をアップデートする

SCLをインストール
$ sudo yum install centos-release-SCL

python2.7 と scl utilsをインストール
$ sudo yum update
$ sudo yum install scl-utils python27 python27-scldevel

【参考】 SCLとは、Software Collections(以下 SCL) の略、Red Hat が提供する最新アプリケーション(安定版)のパッケージを提供、yumの旧パッケージと共存できる、サポート期間は「3年間」である。yum でのインストールしようとしたけど、古いのしか無い場合、自分でコンパイルする必要もなく、依存関係の解決から解放されます。

3.Let’s Encypt Client のインストール

$ sudo su
# scl enable python27 bash ←※python2.7をbash上で有効化
# cd /usr/local
# git clone https://github.com/letsencrypt/letsencrypt
# cd letsencrypt/
# ./letsencrypt-auto --help

★依存パッケージに問題がないようであれば、以下ログが出力されます。

…
Checking for new version...
Creating virtual environment...
Installing Python packages...
Installation succeeded.
Requesting root privileges to run letsencrypt...
   /root/.local/share/letsencrypt/bin/letsencrypt --help

  letsencrypt-auto [SUBCOMMAND] [options] [-d domain] [-d domain] ...

The Let's Encrypt agent can obtain and install HTTPS/TLS/SSL certificates.  By
default, it will attempt to use a webserver both for obtaining and installing
the cert. Major SUBCOMMANDS are:

  (default) run        Obtain & install a cert in your current webserver
  certonly             Obtain cert, but do not install it (aka "auth")
  install              Install a previously obtained cert in a server
  renew                Renew previously obtained certs that are near expiry
  revoke               Revoke a previously obtained certificate
  rollback             Rollback server configuration changes made during install
  config_changes       Show changes made to server config during installation
  plugins              Display information about installed plugins

Choice of server plugins for obtaining and installing cert:

  --apache          Use the Apache plugin for authentication & installation
  --standalone      Run a standalone webserver for authentication
  (nginx support is experimental, buggy, and not installed by default)
  --webroot         Place files in a server's webroot folder for authentication

OR use different plugins to obtain (authenticate) the cert and then install it:

  --authenticator standalone --installer apache

More detailed help:

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

   all, automation, paths, security, testing, or any of the subcommands or
   plugins (certonly, install, nginx, apache, standalone, webroot, etc)

★依存関係のエラーとなった場合…依存するパッケージのインストールを行う。

…
./letsencrypt-auto: line 460: virtualenv: コマンドが見つかりません

???
$ yum search virtualenv
…
python-paver.noarch : Python-based build/distribution/deployment scripting tool
$ sudo yum install python-paver
$ python --version
Python 2.6.6

4.SSL証明書の作成と設定

Let’s Encryptの「SSL証明書」発行には、次の2通りの方法があります。

standaloneモード (httpdサーバ無しで発行する)
webrootモード (稼働中のhttpdサーバを使う)

standaloneモードは、証明書を取得するときに「80番ポート」と「443番ポート」を使うサーバを立ち上げます。つまり両方のポート(httpdサーバー)は停止する必要があります。webrootモードは、既に稼働中の httpdサーバで発行する場合、使用します。

【参考】 どちらの証明書発行モードでも「Let’s Encrypt」側からの「ドメイン認証」のために、サーバの「80番ポート」に外部からアクセスできる必要があります。ファイアウォール等で「80番ポート」をフィルタリングしている場合は、許可する必要があります。

★【standaloneモードでの発行】

# /usr/local/letsencrypt/letsencrypt-auto certonly --standalone -d www.offline-net.com

⇒メールアドレスの入力が求められるので入力して、<了解>を選択します。
⇒利用規約に同意するか聞かれるので、<Agree>を選択します。

成功例!!

# ./letsencrypt-auto certonly --standalone -d www.offline-net.com
Checking for new version...
Requesting root privileges to run letsencrypt...
   /root/.local/share/letsencrypt/bin/letsencrypt certonly --standalone -d www.offline-net.com
Version: 1.1-20080819
Version: 1.1-20080819

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/www.offline-net.com/fullchain.pem. Your cert
   will expire on 2016-07-14. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.
 - If you like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

# ls -1 /etc/letsencrypt/live/www.offline-net.com/
cert.pem
chain.pem
fullchain.pem
privkey.pem

失敗例!! ⇒名前解決できる FQDNと同一のサーバーである必要がある。

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: www.offline-net.com
   Type:   unauthorized
   Detail: Correct zName not found for TLS SNI challenge. Found 'www
   .offline-net.com, offline-net.com'

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A record(s) for that domain
   contain(s) the right IP address.

★【webrootモードでの作成】

# /usr/local/letsencrypt/letsencrypt-auto certonly --webroot -w /var/www/html/ -d www.offline-net.com

【参考】 http://使用するFQDN/.well-known 配下に「認証用ファイル」が設置されます。

5.Apacheサーバー設定

# vi /etc/httpd/conf/extra/httpd-ssl.conf

(発行されたSSL証明書をApacheの設定ファイルに追加)
SSLCertificateFile /etc/letsencrypt/live/www.offline-net.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.offline-net.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.offline-net.com/chain.pem

6.SSL証明書の自動更新設定

# scl enable python27 'python -V'
Python 2.7.5

★ログイン毎に、自動的に「python2.7.x」を有効化にします

$ sudo vi /etc/profile.d/enablepython27.sh  ⇒新規作成する。

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

$ sudo chmod +x /etc/profile.d/enablepython27.sh

★自動更新を httpdサーバー無停止で行う

# /usr/local/letsencrypt/letsencrypt-auto certonly --renew-by-default --webroot -w /var/www/html/ -d www.offline-net.com

Checking for new version...
Requesting root privileges to run letsencrypt...
   /root/.local/share/letsencrypt/bin/letsencrypt certonly --renew-by-default --webroot -w /var/www/html/ -d www.offline-net.com
Version: 1.1-20080819
Version: 1.1-20080819

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/www.offline-net.com/fullchain.pem. Your cert
   will expire on 2016-08-05. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.
 - If you like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

# /etc/init.d/httpd reload

★Let’s Encrypt の証明書の有効期限は「90日間」のため、定期的に更新する必要があります。

# cat /var/spool/cron/root
00 05 01 * * /usr/local/letsencrypt/letsencrypt-auto certonly --renew-by-default --webroot -w /var/www/html/ -d www.offline-net.com && /sbin/service httpd reload

付録.1 「Let’s Encrypt」の証明書の取得をやり直す場合…

「/etc/letsencrypt」 自体を削除して、httpdサーバーの「https」設定を無効にします。その後、本紙手順3.から再実行します。

以上

About yoshimasa

埼玉県さいたま市在住、2男3女のパパです。Linux系の技術情報を中心にまとめています。1978年2月生まれ。