Let’s Encryptとは
無料で認証されたSSL証明書を発行できるサービスです。今月パブリックベータになり、誰でも試すことができるようになりました。Web Tech界隈では今アツい技術の一つです。
今回使うnginxは1.8系のため、HTTP/2、SPDYは使えません。メインラインの1.9系を使うことで対応できるので、興味がある方は別に調べてみてください。
ビジネスなどエンタープライズで使用する際はこのSSLではなく信頼された発行元から
Let’s Encryptのインストール
Let’s Encryptを使うためには、nginxやapacheなどのウェブサーバーのほかGitが必要です。OpenSSLなどはインストールされていない場合、Let’s Encryptが自動的にインストールしてくれます。Gitがインストールされていなければ、事前にyumで入れておきます。
まず、Let’s Encryptのクライアント本体を適当な場所にgitでクローンしておきましょう。
gitが必要な箇所はここだけです。結構頻繁に更新されているようなので、都度ローカルリポジトリも追従させてあげるのが良いでしょう。
|
1 2 3 |
cd ~ git clone https://github.com/letsencrypt/letsencrypt.git cd letsencrypt |
クローンしたら、内包されているメインのコマンド letencrypt-auto を叩いてみましょう。このコマンドを実行した場合、letsencryptが使用する必要なライブラリがインストールされていなければ自動でインストールしようとします。rootで実行していない場合はパスワードを入力してください。
|
1 2 3 4 5 |
cd letsencrypt ./letsencrypt-auto # WARNING: Amazon Linux support is very experimental at present... # if you would like to work on improving it, please ensure you have backups # and then run this script again with the --debug flag! |
今回、AWS EC2で実行している関係で上のような警告が表示されました。EC2上で利用するのであれば一般的なCentOS等と使い方は何ら変わりませんので、言われるままに継続します。
|
1 2 3 4 5 6 7 |
./letsencrypt-auto --debug # Bootstrapping dependencies for Amazon Linux... # (中略) # Running with virtualenv: (インストールパス)/bin/letsencrypt --debug # Version: 1.1-20080819 # Version: 1.1-20080819 # No installers are available on your OS yet; try running "letsencrypt-auto certonly" to get a cert you can install manually |
一度debugをつけて実行した後はdebugなしで利用できるようです。
証明書の取得
発行にはドメインの所有権認証が必要です。letsencrypt-autoでは、次の方法でこの認証を簡単なコマンドだけで実行できます。
現時点でlets encryptでは apache, standalone, webroot の3種類の証明書取得方法をサポートしています。apacheを使っている場合はapacheを使うと自動でインストールしてくれます。standaloneはletsencrypt自身がウェブサーバーを起動して所有権の認証を行います。webrootは既にウェブサーバーが起動している場合、ドキュメントルートを指定して既存のサーバーを介して認証を行います。 詳しい違いについては ./letsencrypt –help で確認してください。
今回はnginxですし、既に起動しているサーバーに対してインストールしょうとしているので、3番目のwebrootオプションを使って認証を行います。
|
1 |
./letsencrypt-auto certonly --webroot --webroot-path <発行するドメインのドキュメントルート> -d <ドメイン> |
上記を実行するとメールアドレスの入力と利用規約への同意が求められますので、指示通り進みます。認証情報を紛失した際などは、ここで登録したメールアドレスを使ってリカバリするので間違えないように気をつけてください。
次のようなメッセージが出力されれば、正しく証明書を取得することができました。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
IMPORTANT NOTES: - If you lose your account credentials, you can recover through e-mails sent to <登録したメールアドレス>. - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/<ドメイン>/fullchain.pem. Your cert will expire on <有効期限>. To obtain a new version of the certificate in the future, simply run Let's Encrypt again. - Your account credentials have been saved in your Let's Encrypt configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Let's Encrypt so making regular backups of this folder is ideal. |
上の例では、/etc/letsencrypt/live/<ドメイン>/ の中に証明書類が保存されています。
DH鍵交換のパラメーター生成
証明書をウェブサーバーにインストールする前に、セキュリティ向上のために実行することをおすすめします。
opensslコマンドで生成します。AWSのsmallインスタンスで3分程度かかりました。環境によってはもっと時間がかかるかもしれません。
|
1 2 |
sudo mkdir /etc/nginx/ssl # フォルダがない場合 sudo openssl dhparam 2048 -out /etc/nginx/ssl/dhparam.pem |
証明書をnginxに設定
最後に取得したSSL証明書をnginxから参照して利用できるようにします。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
server { listen 80; + listen 443 ssl; - server_name localhost; + server_name <ドメイン>; + ssl_certificate /etc/letsencrypt/live/<ドメイン>/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/<ドメイン>/privkey.pem; + ssl_session_timeout 1d; + ssl_session_cache shared:SSL:50m; + # 生成したDHパラメータを使用 + ssl_dhparam /etc/nginx/ssl/dhparam.pem; + # 暗号化スイートを明示的に指定する + ssl_prefer_server_ciphers on; + ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; + # POODLE対策でSSLv1〜3は有効にしない + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + # HSTSヘッダを設定 (SSL接続を強制する場合のみ) + #add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;'; } |
上の通り変更して、nginxを再起動します。設定ファイルに問題がなければSSLで通信できるようになっていますので、テストしてみましょう。
|
1 2 |
sudo service nginx restart echo "Lets Encrypt" > /usr/share/nginx/html/test.html |
ということで、Let’s Encryptで簡単にSSL対応できました!
SSLのセキュリティテスト
SSLサーバーのセキュリティテストは Qualys SSL Report を使って簡単に実施できます。
最低限の設定を施しただけだとCやDランクになるかと思います。例えばPOODLEや弱いDHパラメーター、ダウングレード攻撃などの脆弱性を防いでいない場合は評価が下がります。
前述のnginx.confの設定を施せばAまたはA+の評価になると思います。ときどきこのサイトでSSLの安全性をチェックして、常にこの評価をキープしていきましょう。
雑感
以前から無料で発行できるSSL証明書もありましたが、手続きが煩雑だったりと色々厄介なことが多かったです。Let’s Encryptもまだ改善の余地はあり、速い速度で開発も進んでいますので、まだまだ今後に期待できるでしょう。Let’s EncryptでSSL対応が当たり前な時代になれば良いですね。




