Let’s EncryptでSSL証明書を楽々自動更新

はじめまして、ビジネス開発室の『ab』です。
今回は、商用利用も可能な無償の証明書発行サービス『Let’s Encrypt』を紹介したいと思います。

はじめに

弊社のとあるプロジェクトで使用しているredmineはAWS上でセキュアに動いてはいるのですが、
SSL証明書はオレオレ証明書を使用していました。
なので、証明書の有効期限を気にしながら、発行(更新)時はいくつもコマンドを叩いて、確認して・・・
といったとってもメンドクサイ運用をしていました。
そんな面倒な作業から解放されたい・・・
というか、そもそも「オレオレ」ってどうなのよ・・・?
というわけで、それら全てを解決してくれそうなLet’s Encryptを導入してみました。
同じようにそんなモヤモヤから解放されたい!と思っている方の参考になれば嬉しいです♪

Let’s Encryptについて

簡単ではありますが、メリット・デメリットについて。
冒頭でも紹介しましたが、2016年4月12日から、商用利用も可能となった無償の証明書発行サービスです。
導入も簡単で、gitからLet’s Encryptをダウンロードするだけです。
あとは、Let’s Encryptを呼び出すコマンドをたたくだけで、証明書の発行が出来てしまいます。
そして、証明書更新の自動化も可能です。
これらが無償で提供されているのです。なんて素敵なサービスなのでしょう♪
と、いいところばかり紹介してきましたが、デメリット(?)ももちろんあります。
例えば、Let’s Encryptはドメイン認証のみとなるので、手軽な反面、
他の認証方法(企業実在認証やEV認証)と比較すると、一番レベルの低い認証しか出来ません。
などなど。
その他、詳細に関してはサイトをご覧ください。
【本家サイト】https://letsencrypt.org/
【Let’s Encrypt 総合ポータル】https://letsencrypt.jp/

導入手順

EC2にてSSL証明書を発行~自動更新するまでの手順です。
OSはAmazonLinux、WebサーバはApacheを利用しています。

  1. Let’s Encryptの導入
    #任意のフォルダに移動して、Let’s Encryptをgitからダウンロード
    #ここでは/home/ec2-userにダウンロードすることとします
    cd /home/ec2-user
    git clone https://github.com/certbot/certbot
    #ダウンロードしたフォルダ内でテスト実行
    cd certbot
    sudo ./certbot-auto –debug
    ※yumなどのパッケージ管理システムを利用したアプリなどのインストールやアップデートが、自動的に行われます。厳格にパッケージのバージョンを管理している場合はご注意ください。
  2. 証明書発行
    sudo ./certbot-auto certonly ¥
    –webroot -w ドキュメントルート ¥
    -d ドメイン名 ¥
    -m メールアドレス ¥
    –renew-by-default –agree-tos –debug
  3. Apacheの設定ファイルを更新
    #Webサーバの設定ファイルを編集
    sudo vi /etc/httpd/conf/httpd.conf

    #各証明書の配置場所を設定
    SSLCertificateFile /etc/letsencrypt/live/ドメイン名/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/ドメイン名/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/ドメイン名/chain.pem
    ※証明書発行した際に、/etc/letsencrypt/live/ドメイン名配下に各証明書のシンボリックリンクが作成されます。
  4. Webサーバの再起動
    service httpd restart
  5. Cronの設定
    #毎月1日の1時に強制的に更新をします。
    0 1 1 * * root /home/ec2-user/certbot/certbot-auto renew –force-renew && service httpd reload
    ※証明書の有効期限は90日です。

とても簡単ですよね!?
と、手順だけ見るととてもスムーズにいったかのようですが、ところどころでつまづいてます。
環境によっては、上記手順ですんなりいくこともあるのでしょうけど・・・・
弊社の、「とあるプロジェクト」環境では残念ながらスムーズには行きませんでした。。。
つまづいた箇所も続けて書きますので、何かの参考になればと思います。

その他・つまづいたことなど

  • テスト実行時、virtualenvコマンドがないよ、的なエラーが。
    【エラー(一部抜粋)】
    Package 1:mod_ssl-2.2.31-1.7.amzn1.x86_64 already installed and latest version
    Nothing to do
    Creating virtual environment…
    ./certbot-auto: line 558: virtualenv: command not found
    virtualenvがバージョン違いで複数インストールされていて、かつ古いバージョンのvirtualenvが選択されていたことが原因でした。
    update-alternativesでバージョン(コマンド実行パス)を管理し、妥当なバージョンに切り替えることで解決しました。
  • 証明書発行時、下記エラーが!!
    【エラー(一部抜粋)】
    To fix these errors, please make sure that your domain name was
    entered correctly and the DNS A record(s) for that domain
    contain(s) the right IP address.
    ポート80を解放していなかった事(AWSのセキュリティーグループの設定)が原因でした。
    ちなみに、Standalone プラグインの TLS-SNI-01 Challenge を使用することでポート80を解放しなくても実行可能となるらしいです。
    上記、試す機会があればまた追記します。

さいごに…

これで、今後の手動による証明書の更新作業がなくなりました!
そしてなぜか、redmineが早くなりました。
ハッキリとした原因は不明ですが、やはりオレオレが原因だったのでしょうか???
今回はEC2での自動更新までを記事にしましたが、ELBでも同様に自動更新が可能です。
ただし、EC2よりも手間はかかりますが…。
また、需要と機会があれば記事にしたいと思います。


SNSでもご購読できます。