2017年4月20日木曜日

LetsEncrypt で無料で SSL 証明書を取得してみた

概要

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_certificatessl_certificate_key の部分です
nginx の場合、中間証明書を指定するディレクティブがないので証明書には合体版の証明書を使います

指定できたら再起動します

  • nginx -s stop
  • nginx

そして再度ドメインにアクセスしてみましょう
今度は証明書の警告が出ないでアクセスできるようになっていると思います

ブラウザでもアクセスしてみましょう
左上ボタンで証明書の情報を確認することができます
設定したドメインの証明書であることと LetsEncrypt が認証局になっていることを確認してください
letsencrypt1.png

また、LetsEncrypt の場合証明書の期限が 3 ヶ月になっているので更新チェックはこまめに行うようにしましょう
(自動で証明書の更新を行う方法もあるようなので、それを使うのが簡単かなと思います)
letsencrypt2.png

最後に

LetsEncrypt を使って無料で SSL 証明書を取得してみました
コマンドだけなのでハードルは高いですが、逆にエンジニア的にはコマンドだけで証明書の管理から作成、更新までできるのでかなり楽です

cerbot コマンドには他にもいろいろなオプションがあるので興味ある方はサイトで調べてみるといいと思います
日本語のドキュメントサイトもかなり丁寧に書かれているのでわかりやすいです

参考サイト

Tips

取得した証明書の確認方法

  • certbot certificates

取得した証明書の削除方法

  • certbot delete
Saving debug log to /var/log/letsencrypt/letsencrypt.log

Which certificate would you like to delete?
-------------------------------------------------------------------------------
1: www.hawksnowlog.cf
-------------------------------------------------------------------------------
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 のページに詳しく書かれています

0 件のコメント:

コメントを投稿