概要
LetsEncrypt は無料で SSL 証明書が取得できるサービスです
基本的にはドメイン認証のみになるので企業認証 (EV) などはできません
今回は専用クライアントのインストールから実際に証明書を取得してサーバにインストールするところまで行ってみます
環境
- CentOS 7.3
- nginx 1.10.3
- certbot 0.12.0
- Python 2.7.5
事前作業
事前にドメインを取得おきましょう
そして取得したいドメイン or サブドメインを DNS の A レコードとして登録して名前から IP が引けるようにしておいてください
自分は Freenom で取得したドメインを Dozens に登録することで対応しました
また、今回 SSL 証明書を取得するドメインは www.hawksnowlog.cf
とします
(このドメインはすでに A レコードから削除しているためアクセスはできません)
certbot のインストール
- yum -y install epel-release
- yum -y install certbot python-certbot-apache
で OK です
他のプラットフォームだとインストール方法が異なるので詳細は以下をご覧ください
https://letsencrypt.jp/usage/
nginx で一旦 443 を LISTEN できるようにする
証明書を作成するのにドメインを設定したサーバの保有者であることを確認するために一旦サーバを 443 で受け付ける必要があります
自己証明書で問題ないので一旦自己証明書で 443 LISTEN 出来るように設定します
まずは自己証明書を作成します
- mkdir /etc/nginx/cert
- cd /etc/nginx/cert
- openssl req -new -days 365 -x509 -nodes -keyout cert.key -out cert.crt
次に作成した自己証明書を設定した nginx 用の ssl.conf を作成します
- vim /etc/nginx/conf.d/ssl.conf
server {
listen 443;
ssl on;
ssl_certificate /etc/nginx/cert/cert.crt;
ssl_certificate_key /etc/nginx/cert/cert.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-User $remote_user;
root /usr/share/nginx/html;
index index.html index.htm;
}
}
コンテンツは何でも OK です
- vim /usr/share/nginx/html/index.html
<html>
<head>
<title>
</title>
</head>
<body>
<p>Welcome www.hawksnowlog.cf !</p>
</body>
</html>
これで一旦 nginx を起動して 443 で LISTEN できるか確認してください
-k
オプションがないと証明書で怒られると思います
certbot コマンドを使って証明書を取得する
LetsEncrypt は専用のコマンドを使って証明書を取得します
先程インストールした certbot コマンドを使います
certbot certonly --standalone -d www.hawksnowlog.cf
-d オプションの後は SSL 証明書を取得したいドメインを指定します
certonly サブコマンドは証明書の取得だけを行うサブコマンドです
まず実行するとメールアドレスを登録するように言われます
何でも OK ですが緊急時の連絡などが来るのでドメインの管理者のメールアドレスを登録するのが良いと思います
(以下はダミーのメールアドレスです)
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):your-name@dummy.com
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
利用規約に同意します
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
メールアドレスを EFF に共有しても良いですか?という確認です
EFF は certbot を管理している組織です
とりあえず今回はテストなので No にしました
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
証明書の作成が始まります
ここでドメインの 443 へのアクセスがあります
外部からアクセスできる必要があるのでファイアウォールなどの設定で 443 はオープンにしておいてください
また、ngxin も起動状態にしておきます
Obtaining a new certificate
Performing the following challenges:
tls-sni-01 challenge for hawksnowlog.cf
tls-sni-01 challenge for www.hawksnowlog.cf
Waiting for verification...
Could not bind TCP port 443 because it is already in use by another process on
this system (such as a web server). Please stop the program in question and then
try again.
(R)etry/(C)ancel:R
アクセスできるとすでに 443 ポートが使われいるという旨が表示されるので一旦停止します
停止したあとで、そして Retry を入力します
すると証明書の作成が進み最終的に作成が完了します
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/www.hawksnowlog.cf/fullchain.pem. Your cert
will expire on 2017-07-18. To obtain a new or tweaked version of
this certificate in the future, simply run certbot again. 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
作成される主な証明書は以下の通りです
- サーバ証明書
- /etc/letsencrypt/archive/www.hawksnowlog.cf/cert1.pem
- 中間証明書
- /etc/letsencrypt/archive/www.hawksnowlog.cf/chain1.pem
- サーバ証明書+中間証明書
- /etc/letsencrypt/archive/www.hawksnowlog.cf/fullchain1.pem
- 秘密鍵
- /etc/letsencrypt/archive/www.hawksnowlog.cf/privkey1.pem
また、最新版の証明書を管理するシンボリックされます
サーバから使用する場合は基本的に以下を参照しておけば常に最新版を使うことになるので以下を参照するようにしましょう
- ls /etc/letsencrypt/live/www.hawksnowlog.cf
cert.pem chain.pem fullchain.pem privkey.pem README
nginx の設定ファイルの書き換え
作成した LetsEncrypt の証明書を nginx に設定します
- vim /etc/nginx/conf.d/ssl.conf
server {
listen 443;
ssl on;
ssl_certificate /etc/letsencrypt/live/www.hawksnowlog.cf/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.hawksnowlog.cf/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-User $remote_user;
root /usr/share/nginx/html;
index index.html index.htm;
}
}
書き換えている箇所は ssl_certificate
と ssl_certificate_key
の部分です
nginx の場合、中間証明書を指定するディレクティブがないので証明書には合体版の証明書を使います
指定できたら再起動します
そして再度ドメインにアクセスしてみましょう
今度は証明書の警告が出ないでアクセスできるようになっていると思います
ブラウザでもアクセスしてみましょう
左上ボタンで証明書の情報を確認することができます
設定したドメインの証明書であることと LetsEncrypt が認証局になっていることを確認してください
また、LetsEncrypt の場合証明書の期限が 3 ヶ月になっているので更新チェックはこまめに行うようにしましょう
(自動で証明書の更新を行う方法もあるようなので、それを使うのが簡単かなと思います)
最後に
LetsEncrypt を使って無料で SSL 証明書を取得してみました
コマンドだけなのでハードルは高いですが、逆にエンジニア的にはコマンドだけで証明書の管理から作成、更新までできるのでかなり楽です
cerbot コマンドには他にもいろいろなオプションがあるので興味ある方はサイトで調べてみるといいと思います
日本語のドキュメントサイトもかなり丁寧に書かれているのでわかりやすいです
参考サイト
Tips
取得した証明書の確認方法
取得した証明書の削除方法
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Press 1 [enter] to confirm the selection (press 'c' to cancel): 1
-------------------------------------------------------------------------------
Deleted all files relating to certificate www.hawksnowlog.cf.
-------------------------------------------------------------------------------
現在保持している証明書の一覧が表示されるので番号を入力すれば OK です
証明書を管理しているディレクトリ (/etc/letsencrypt/archive) ごとなくなっているのが確認できると思います
LetsEncrypt はワイルドカード SSL 証明書には対応していないようです
コードサイニングの証明書としても使えないようです
その他、詳しい情報は FAQ のページに詳しく書かれています