Let’s encryptでUbuntu 16.04のApacheをhttps化するには


Let’s encryptとは

無料で使えるSSL認証局で、Internet Security Research Group (ISRG)という団体が提供しています。

ISRGには、Current Sponsors – Let’s Encrypt – Free SSL/TLS Certificatesを見ると、しっかりスポンサーがついているので安心して使えそうです。
SAKURA Internetなど日本の企業もスポンサーも居ます。

証明書の発行とセットアップは、公式に提供されている Certbot コマンドで行います。

証明書の期限は90日で、エージェントが自動更新を行ってくれます。
ということは、AWSのELBのように、Let’s encrypt非対応のミドルウェアを利用している場合は、更新の仕組みを自分で用意する必要があります。

また、さくらのレンタルサーバなどLet’s encryptに対応していてるホスティングサービスの場合、サービスのコントロールパネルで設定が可能でセットアップが簡単にできたりするそうです。

さくらインターネットの「さくらのレンタルサーバ」、コントロールパネル上の簡単操作で無料SSL証明書「Let’s Encrypt」を設定可能に~「Let’s Encrypt」のシルバースポンサーとして参画し、常時SSL化推進に貢献~
提供は、10/17からのようです。

参照情報

公式サイト:Let’s Encrypt – Free SSL/TLS Certificates
日本語サイト: Let’s Encrypt 総合ポータル
Certbot: Certbot

仕組み

[Let’s Encrypt の仕組み – Let’s Encrypt 総合ポータル]に詳しい説明があります。

Apache on Ubuntu 16.04にセットアップ

Ubuntu 16.04にインストールされたApacheのhttpsアクセスを有効化した際の手順をまとめました。

前提条件

Let’s Encrypt の使い方 4. DNS設定と準備で確認できます

  • DNS設定
  • 80,443ポートが開いている

letsencrypto.workというドメインに、digital oceanに立てたサーバーを設定しました

Apacheをインストール

確認用のApacheをインストール

$ sudo apt-get update
$ sudo apt-get install apache2 -y

また、80と443ポートを空けておきます

$ sudo ufw allow 'Apache Full'

DNS設定が有効になっているか、ブラウザなどでドメインにhttpアクセスをして、対象サーバーのApacheのデフォルトページが表示されることを確認しておきます

参考: How To Install the Apache Web Server on Ubuntu 16.04 | DigitalOcean

letsencryptコマンドをインストール

Ubuntu 16.04では、Certbotの古い名前のletsencryptコマンドをaptリポジトリよりインストールできます

$ sudo apt-get install letsencrypt python-letsencrypt-apache -y

参考: Certbot クライアントのインストール – Let’s Encrypt 総合ポータル > Ubuntu 16.04 (xenial)

aptリポジトリからではなく、Certbot公式のPPAリポジトリからもインストールすることも可能です

$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ apt-get install python-certbot-apache -y

公式のインストール手順: Apache on Ubuntu 16.04 (xenial)

証明書のセットアップ letsencryptコマンドの場合

Let’s Encrypt の使い方 SSL/TLS サーバ証明書の取得を参考に証明書を取得してApacheのセットアップを行います

letsencryptコマンドを実行します

$ letsencrypt --apache

サブコマンドを指定しない場合のデフォルトはletsencrypt runになります

ウィザードに沿ってインストールしていきます

<Yes>を選択してEnterするとドメインを入力するプロンプトが表示されます

ドメインを入力し、<OK>を選択してEnter

次は、通知用のEmailの入力するプロンプトが表示されます

メールアドレスを入力し、<OK>を選択してEnter

次は、サービス利用規約の許諾をきかれるので

<Agree>を選択してEnter

Apacheのセットアップ方法、httpアクセスを残すかどうかをきかれます

httpsアクセスのみに制限する場合はSecure<OK>を選択してEnter

セットアップ完了!! とても簡単です。

<OK>を選択してEnterすると以下のメッセージが表示され、シェルに戻ります

証明書のセットアップ Certbotコマンドの場合

CertbotをPPAリポジトリからインストールした場合は、certbotコマンドを実行します

certbotコマンドの場合は、コマンドラインのままプロンプトされます

# certbot --apache
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): admin@letsencrypt.work

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A

-------------------------------------------------------------------------------
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 EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: N
No names were found in your configuration files. Please enter in your domain
name(s) (comma and/or space separated)  (Enter 'c' to cancel): www.letsencrypt.work
Obtaining a new certificate
Performing the following challenges:
tls-sni-01 challenge for www.letsencrypt.work
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/000-default-le-ssl.conf
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Deploying Certificate for www.letsencrypt.work to VirtualHost /etc/apache2/sites-available/000-default-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/000-default-le-ssl.conf

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Enabled Apache rewrite module
Redirecting vhost in /etc/apache2/sites-available/000-default.conf to ssl vhost in /etc/apache2/sites-available/000-default-le-ssl.conf

-------------------------------------------------------------------------------
Congratulations! You have successfully enabled https://www.letsencrypt.work

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=www.letsencrypt.work
-------------------------------------------------------------------------------

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/www.letsencrypt.work/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/www.letsencrypt.work/privkey.pem
   Your cert will expire on 2018-01-13. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

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

Apacheの設定の確認

letsencryptまたはcertbotコマンドを実行した後、Apacheの設定を確認すると、以下の設定が自動で行われたことを確認できます

  1. /etc/apache2/sites-available/000-default-le-ssl.confの生成

Let’s encryptから取得した証明書を指定されています

<IfModule mod_ssl.c>
<VirtualHost *:443>
   ServerAdmin webmaster@localhost
   DocumentRoot /var/www/html

   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined

SSLCertificateFile /etc/letsencrypt/live/www.letsencrypt.work/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.letsencrypt.work/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
ServerName www.letsencrypt.work
</VirtualHost>
</IfModule>
  1. /etc/apache2/sites-available/000-default.conf

httpでアクセスした場合に、httpsにリダイレクトするように設定が追加されています

<VirtualHost *:80>
   ServerAdmin webmaster@localhost
   DocumentRoot /var/www/html

   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined

RewriteEngine on
RewriteCond %{SERVER_NAME} =www.letsencrypt.work
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

証明書の更新設定

Let’s Encryptの証明書は90日間ですので、証明書の更新を設定しておく必要があります。

SSL/TLS サーバ証明書の更新 に従って設定します。

証明書の更新は、サブコマンドrenewを使います。renewを実行すると残り30日未満になると新しい証明書に更新してくれます。
よって、証明書の更新設定は、renewのコマンドをcronに登録するだけです。

renewコマンドをテスト実行して問題なく動作するか確認しておきます

$ sudo certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/www.letsencrypt.work.conf
-------------------------------------------------------------------------------
Cert not due for renewal, but simulating renewal for dry run
Renewing an existing certificate
Performing the following challenges:
tls-sni-01 challenge for www.letsencrypt.work
Waiting for verification...
Cleaning up challenges

-------------------------------------------------------------------------------
new certificate deployed with reload of apache server; fullchain is
/etc/letsencrypt/live/www.letsencrypt.work/fullchain.pem
-------------------------------------------------------------------------------
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/www.letsencrypt.work/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)

以下のコマンドをcronに登録します

certbot renew

証明書の破棄

証明書を使わなくなった場合は、以下のコマンドでRevokeできます

$ certbot revoke --cert-path /etc/letsencrypt/live/www.letsencrypt.work/fullchain.pem