無料でSSL!商用利用も可能な SSL/TLS 証明書 Let's Encrypt をさくらVPS(CentOS)に導入してみた


lets_encrypt_00

個人ブログしたり、ちょっとしたAPIを作って他社のサービスに組みこんだりしてたのだが、SSLにするのが面倒だったり個人の趣味にSSLにお金かけたくないなと思ってたのでSSLは導入してませんでした。SSL化の動きが世間的に加速化し、他社サービスからのAjaxやJSONPでの組み込みもSSLからじゃはじかれたりと不便になったので以前からちょっと話題になっていた「Let's Encrypt」を導入と。備忘録をまとめます。

Let's Encrypt とは

SSLを導入するにはSSL証明書を発行してもらう必要があるんだけど、このSSL証明書には認証レベルがあります。Let's Encrypt が発行できる認証レベルはDomain Validation (DV)だけ。運営者の実在性審査がないのだけど、暗号化通信や他社サービスでのSSL連携をするなどはこれで十分!
認証レベルについては、「改めて知ろう、SSLサーバー証明書とは?(第二回) - さくらのナレッジ」が分かりやすかったです。

認証レベルが一番低い Domain Validation (DV)でも、普通にすると結構面倒!レンタルサーバではSSLサービス業者と提携していることが多いので処理を代行してくれるけど、CSRを生成したりとか、申し込みフォームで申し込み項目書いたりとか、サーバに設置したりとかいろいろ作業が多い・・・
Let's Encrypt は、この煩わしい証明書の発行・インストール・更新処理を自動化してくれる!レンタルサーバ業者などにお金を払って代行手数料取られるわけでもなく、ACME Clientというプログラムをインストールして無料で自動処理していきます。

Let's Encrypt が発行するSSL証明書の有効期限は90日間!そもそもSSL証明書って有効期限が短いことも多いらしい。認証レベルが高いと厳密に運営者の実在性審査が行われるので印鑑証明のように電子取引やサイト運営の信頼性を保証するもの。だからきちんと管理してるでしょうって感じかな。あと実印が盗まれた(秘密鍵が漏洩)みたいなことになっても極力被害を減らせることができるとか・・SSLって単に暗号化するだけじゃないんだよってことですね。Domain Validation は更新も簡単にできます。なので更新も自動化してしまいます。

推奨されたインストール方法

ユーザーガイド - Let's Encrypt 総合ポータル さんの情報を参考にして進めていきます。「Let's Encrypt ユーザーガイド」は、User Guide — Certbot 0.10.0.dev0 documentation の全文を和訳(意訳)した上で、補足説明などを加えたサイトらしい。オフィシャルサイトの情報が基になってるので信頼できそうです。
Certbot クライアントの適切なインストール手順は、OS(ディストリビューション)によって異なるので、今回は「CentOS 6 / RHEL 6」で進めます。

  • Certbot と依存関係にあるパッケージのインストール
  • Certbot クライアントをインストール
  • SSL証明書の取得
  • ApacheでHTTPSの設定
  • SSL動作確認

Certbot と依存関係にあるパッケージのインストール

Certbot クライアントが必要とする依存関係にあるパッケージの一部が EPEL (Extra Packages for Enterprise Linux) リポジトリに含まれているため、Certbot クライアントをインストールする前に有効にする必要があります。

ということでEPELパッケージをインストールします。

【コマンド】
sudo yum install epel-release

[hoge@hoge ~]$ sudo yum install epel-release
[sudo] password for hoge: 
Loaded plugins: fastestmirror, security
Determining fastest mirrors
略  
Setting up Install Process
Package epel-release-6-8.noarch already installed and latest version
Nothing to do
[hoe@hoge ~]$ 

Certbot クライアントをインストール

使用している OS のパッケージ管理システムに Certbot パッケージが存在しない場合には、下記の方法で、電子フロンティア財団(EFF)の公式サイトから Certbot クライアントを直接ダウンロードしてください。

自分のCentOS環境には、Certbot パッケージが存在しないので、Certbot クライアントをダウンロード・インストールしました。保存場所はパスが通っている「/usr/bin/」にしました。ダウンロードするコマンドは以下の通りです。

【コマンド】
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto


まず、「/usr/bin/」にカレントを移します。

[hoge@hoge ~]$ cd /usr/bin/

指定されたコマンドでCertbot クライアントをダウンロードします。

[hoge@hoge bin]$ sudo wget https://dl.eff.org/certbot-auto
[sudo] password for hoge: 
--2017-01-14 10:47:04--  https://dl.eff.org/certbot-auto
dl.eff.org をDNSに問いあわせています... 173.239.79.196
dl.eff.org|173.239.79.196|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 46237 (45K) 
`certbot-auto' に保存中

100%[=====>] 46,237      --.-K/s 時間 0.1s    

2017-01-14 10:47:05 (463 KB/s) - `certbot-auto' へ保存完了 [46237/46237]

[hoge@hoge bin]$ 

指定されたパーミッション(読取+実行)にCertbot クライアントを変更します。

[hoge@hoge bin]$ sudo chmod a+x certbot-auto
[hoge@hoge bin]$ ls -l | grep certbot
-rwxr-xr-x  1 root root      46237  1月 14 10:25 2017 certbot-auto
[hoge@hoge bin]$

ファイアウォールでPort 443 (https) のポートを許可する

Certbot クライアント を実行すると、パッケージインストールや 仮想化された Python 環境の構築などが行われた後に証明書の取得を行います。このときにPort 443 (https) が許可されていないと以下のエラーになりました。

Failed to connect to xx.xx.xx.xx:443 for TLS-SNI-01 challenge

Let's Encrypt 認証サーバから Certbot クライアントを実行しているサーバに対する接続を確立できない場合に、このエラーが発生するようです。なのでまず Port 443 (https) を許可します。
本当にSSLサーバを導入しようとしているサーバのPort 443 (https)が許可されていないのか、MacBookAirのターミナルから確認しました。

hoge:~ hoge$ nc -z al5rithm.info 80
Connection to al5rithm.info port 80 [tcp/http] succeeded!
hoge:~ hoge$ nc -z al5rithm.info 443
hoge:~ hoge$

nc(netcat)コマンド でPort 80 (http) と Port 443 (https) に接続。Port 80 (http) は succeeded! が返ってきましたが、Port 443 (https) は応答がありません。
ということでSSLサーバを導入しようとしているサーバ(さくらVPS)でPort 443 (https) を許可します。

sudo vim /etc/sysconfig/iptables に以下のコードを追加します。

【追加コード】
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT

/etc/sysconfig/iptables

略

# SSH, HTTP, FTP1, FTP2, MySQL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 20    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306  -j ACCEPT

#Add 2017/01/14
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
略

iptables を設定したら、iptables を再起動します。

[hoge@hoge ~]$ sudo service iptables restart

iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]
[hoge@hoge ~]$

再度、MacBookAirのターミナルから確認。

hoge:~hoge$ nc -z al5rithm.info 443
Connection to al5rithm.info port 443 [tcp/https] succeeded!
hoge:~hoge$ 

Port 443 (https) 接続でも succeeded! が返ってくるようになりました。

Certbot クライアントの実行(証明書の取得)

certbot-auto を実行すると、OS 標準のパッケージリポジトリ( apt-get や yum など)を使用して、Certbot クライアントの実行に必要な複数のパッケージ(依存関係にあるパッケージ)が自動的にインストールされ、仮想化された Python 環境(PyPI からダウンロードしたパッケージを動作させるための環境)が構築されます。

Certbot クライアントの実行するため以下のコマンドを叩きます。

【コマンド】
sudo certbot-auto 

[hoge@hoge bin]$ sudo ./certbot-auto
Bootstrapping dependencies for RedHat-based OSes...
yum is /usr/bin/yum
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
略
Installed:
...
Dependency Installed:
...        
Updated:
...            
Dependency Updated:
...                    
Complete!
Creating virtual environment...
Installing Python packages...
Installation succeeded.
/root/.local/share/letsencrypt/lib/python2.6/site-packages/cryptography/__init__.py:26: DeprecationWarning: Python 2.6 is no longer supported by the Python core team, please upgrade your Python. A future version of cryptography will drop support for Python 2.6
  DeprecationWarning
Saving debug log to /var/log/letsencrypt/letsencrypt.log

Certbot クライアントの実行に必要な複数のパッケージがインストールされ、また仮想化された Python 環境が構築されました。
この後は対話式になります。

ドメイン入力

No names were found in your configuration files. Please enter in your domain
name(s) (comma and/or space separated)  (Enter 'c' to cancel): 

SSL証明書と紐付けるドメインを入力します。

メールアドレス入力

Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): 

入力したメールアドレスは、緊急の通知、鍵を紛失したときの復旧、証明書の有効期限が近付いた場合の通知に使用されます。

利用規約への同意

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

pdfを読んで利用規約に同意します。 ⇒ A

証明書の取得

Obtaining a new certificate
Performing the following challenges:
tls-sni-01 challenge for al5rithm.info
We were unable to find a vhost with a ServerName or Address of al5rithm.info.
Which virtual host would you like to choose?
(note: conf files with multiple vhosts are not yet supported)
------------------------------------------------
1: ssl.conf        |          | HTTPS | Enabled
------------------------------------------------
Press 1 [enter] to confirm the selection (press 'c' to cancel): 

新規SSL証明書を取得します。 ⇒ 1

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for al5rithm.info
Using the webroot path /var/www/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/al5rithm.info/fullchain.pem. Your cert will
   expire on 2017-04-14. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot-auto again. To
   non-interactively renew *all* of your certificates, run
   "certbot-auto 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 
[hoge@hoge ~]$ 

証明書は、/etc/letsencrypt/live/ドメイン名/ に生成されています。確認します。

[hoge@hoge]$ sudo ls /etc/letsencrypt/live/al5rithm.info/
README    cert.pem  chain.pem  fullchain.pem  privkey.pem
[hoge@hoge letsencrypt]$

証明書が作成されていることが確認できました。この証明書へのパスはApacheの設定に使うのでメモります。

サーバ証明書 cert.pem
中間CA証明書 chain.pem
証明書+中間CA証明書 fullchain.pem
秘密鍵 private.pem

ApacheでHTTPSの設定

自分は、ApacheのSSL設定ファイルが/etc/httpd/conf.d にあったのでssl.confを変更します。なかったらssl.conf作成したり、直接httpd.confに追記しても可能です。
追記したコードは以下の通りです。

SSLCertificateFile /etc/letsencrypt/live/al5rithm.info/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/al5rithm.info/privkey.pem
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

※パスはそれぞれの証明書のパスに置き換えてください。

サーバ証明書 SSLCertificateFile /etc/letsencrypt/live/al5rithm.info/cert.pem
中間CA証明書 SSLCertificateChainFile /etc/letsencrypt/live/al5rithm.info/chain.pem
秘密鍵 SSLCertificateKeyFile /etc/letsencrypt/live/al5rithm.info/privkey.pem

自分の場合は、ssl.confにはもともとSSLCertificateFile 、SSLCertificateChainFile そして SSLCertificateKeyFile のサンプル指定があったのでそれらをコメントアウトして書き換えました。

[hoge@hoge conf.d]$ sudo service httpd restart
Stopping httpd:                                            [  OK  ]

Apacheを再起動して設定を反映させます。

動作確認

SSLを実装したドメインのサイトにアクセスします。

lets_encrypt_01

ブラウザから正常にSSLが認識されました。

まとめ

証明書の発行・インストール・更新処理を自動化ということで簡単かなと思ったんですが、結構面倒でした。確かにLet's Encrypt を使わないときと比べれは全く手間が違いますが、ちょっとデザイナーさんなどシステムに詳しくない人は難しいかなと思います。
自動更新については正常に更新されたことが確認できたら別でまとめようと思います。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です