はじめまして、ビジネス開発室の『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/ドメイン名配下に各証明書のシンボリックリンクが作成されます。

  • Webサーバの再起動
    service httpd restart
  • 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よりも手間はかかりますが…。
    また、需要と機会があれば記事にしたいと思います。