テックブログ

技術ネタ

Let’s Encryptで無料SSL設定

はじめまして ネットアシストのamiyataです。

Let’s Encryptという無料で取得できるSSLを
紹介したいと思います。

まずSSLとはなんぞやというところから
軽く説明したいと思います。

ブラウザのアドレスバーの左のほうが緑の鍵みたいなのがついていたら
SSLを利用しています。
以上。というわけにもいかないのでもう少し詳しく書くと

インターネット上のやりとりを暗号化する仕組みです。
インターネット通販などを利用するとどうしても個人情報を入力する必要があります。

クレジットカード情報や個人情報は第3者に漏れてしまうと
大なり小なり悪用はされます。

漏れても解読できないよう暗号化して情報のやり取りをおこない
安全にサービスを利用することができるようになります。

逆にいえばSSLを利用していないサイトで
入力する情報はまるまる誰でも見ようと思えば見れると
いうことになります。

またGoogleは常時SSL化を推奨しています。
Googleの検索結果はSSLサイトを優遇したり、
Chromeを利用した際HTTPサイトへのアクセスは警告を表示するようするという計画のアナウンスもありました。

とこれ以上書くとSSLだけで前置きが長くなってしますので、
実際に設定します。

ちなみにLet’s EncryptはDV証明書といわれるものになります。
OV,EV証明書が必要な場合は機関に申請して取得しましょう

今回はcentos6系とapacheの環境で設定してみました。

Let’s Encrypt は Certbotを利用して証明書の取得と更新を行うので
それをインストールします

  1. gitインストール
    # yum install git
    

    ※導入されていれば必要ありません

  2. Certbotをインストールするディレクトリへ移動
    # cd /usr/local/src
    

    ※基本的に管理できればどこでもよいです

  3. Certbotをインストール
    # git clone https://github.com/certbot/certbot
    
  4. テスト
    # cd certbot/
    # ./certbot-auto
    

    ※必要パッケージの導入、更新が実施されるため
    よく確認が必要ですTUIが開きますが、キャンセルして下さい。

  5. Centos6系のエラーへの対応
    おそらく4を実行後下記エラーが出力されます./certbot-auto: line 558: virtualenv: コマンドが見つかりません
    ※エラーが発生しなければ読み飛ばして下さいこれはCentos6系のPythonがCertbotで推奨される2.7ではないため
    発生するので2.7を導入します。

    # yum install centos-release-scl
    # yum install python27 python27-python-tools
    # scl enable python27 bash
    # python -V
    

    2.7.xが表示されていればOKです
    4番を再実行します

  6. 証明書の取得
    # ./certbot-auto certonly --standalone -d ドメイン名
    

    実際に取得するドメイン名を入力しますTUIが起動します
    certbot_001
    メールアドレスを入力します。
    有効期限が近くなってきたときやletsencryptからの案内が送付されるため、
    有効かつ利用しているメールアドレスを入力したほうがよいです次に利用規約を確認されます。
    certbot_002Agreeを選択します
    完了です。
    エラーが表示された際は内容に従い対応します。
    80番ポートが起動していると失敗します
    firewallやDNS等も確認しましょう下記メッセージが出力されたら証明書の取得が完了です。

    Version: 1.1-20080819
    Version: 1.1-20080819
     - Congratulations! Your certificate and chain have been saved at
     /etc/letsencrypt/live/ドメイン名/fullchain.pem. Your
     cert will expire on 2016-12-20. To obtain a new or tweaked version
     of this certificate in the future, simply run certbot-auto again.
     To non-interactively renew *all* of your certificates, run
     "certbot-auto 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
    
  7. 取得したファイルについて
    /etc/letsencrypt/live/ドメイン名/cert.pem …証明書
    /etc/letsencrypt/live/ドメイン名/chain.pem …中間証明書
    /etc/letsencrypt/live/ドメイン名/fullchain.pem … 上記2つを結合したもの
    /etc/letsencrypt/live/ドメイン名/privkey.pem …秘密鍵上記ファイルを設定ファイルの適切な箇所にしようします
    certとchain、及びfullchainについては利用しているWebサーバにあわせてどちらかを使います。
  8. 確認
    confファイルの設定は割愛して実際の設定後下記の画像のようになっていれば成功です
    certbot_003

導入事態はこれで終わりです。
Let’s Encrypt の証明書有効期限は3ヶ月と短いため、
自動で更新を行うように設定を行います。

  1. 実際に更新できるかテストコマンドを実行
    # scl enable python27 "/usr/local/src/certbot/certbot-auto renew --force-renew --dry-run"
    

    ※dry-runオプションがテストとなります
    なぜテストコマンドで確認するのかというと認証回数に制限があるためです。
    おそらくそのまま実行すると下記エラーが出力されます。

    The program httpd (process ID 3998) is already listening on TCP port 80. This
    will prevent us from binding to that port. Please stop the httpd program
    temporarily and then try again. For automated renewal, you may want to use a
    script that stops and starts your webserver. You can find an example at
    https://letsencrypt.org/howitworks/#writing-your-own-renewal-script.
    Alternatively you can use the webroot plugin to renew without needing to stop
    and start your webserver.
    

    Webサーバを止めずに更新するにはwebrootを使いましょうとのメッセージです。

  2. webrootオプションを使用して更新テスト
    # scl enable python27 "/usr/local/src/certbot/certbot-auto renew --force-renew --webroot -w /var/www/html --dry-run"
    

    ※webroot はドキュメントルートを指定しておけば問題ないです。
    実行後success が確認できればOKです

    -------------------------------------------------------------------------------
    Processing /etc/letsencrypt/renewal/ドメイン名.conf
    -------------------------------------------------------------------------------
    ** DRY RUN: simulating 'certbot renew' close to cert expiry
    **   (The test certificates below have not been saved.)
    
    Congratulations, all renewals succeeded. The following certs have been renewed:
    /etc/letsencrypt/live/ドメイン名/fullchain.pem (success)
    ** DRY RUN: simulating 'certbot renew' close to cert expiry
    **  (The test certificates above have not been saved.)
    
  3. 自動更新設定
    問題なさそうなのでcronにセットします
    と行きたいところですが実際に更新できるか
    調べます。
    現在の有効期限を確認します

    # openssl x509 -in /etc/letsencrypt/live/ドメイン名/cert.pem -noout -dates
    notBefore=Sep 21 18:59:00 2016 GMT
    notAfter=Dec 20 18:59:00 2016 GMT
    

    更新します。

    # scl enable python27 "/usr/local/src/certbot/certbot-auto renew --force-renew --webroot -w /var/www/html"
    -------------------------------------------------------------------------------
    Processing /etc/letsencrypt/renewal/ドメイン名.conf
    -------------------------------------------------------------------------------
    
    -------------------------------------------------------------------------------
    new certificate deployed without reload, fullchain is
    /etc/letsencrypt/live/ドメイン名/fullchain.pem
    -------------------------------------------------------------------------------
    
    Congratulations, all renewals succeeded. The following certs have been renewed:
    /etc/letsencrypt/live/ドメイン名/fullchain.pem (success)
    

    ここでエラーが出ているのならテストのときとコマンド
    が間違えてないか等確認しましょう

    改めて証明書の有効期限を確認します

    # openssl x509 -in /etc/letsencrypt/live/ドメイン名/cert.pem -noout -dates
    notBefore=Sep 22 13:02:00 2016 GMT
    notAfter=Dec 21 13:02:00 2016 GMT
    

    日付や時間が更新されていれば問題ありません。
    cronに設定します

    #crontab -e
    5 0 1 * * scl enable python27 "/usr/local/src/certbot/certbot-auto renew --force-renew --webroot -w /var/www/html && /etc/init.d/httpd restart"
    

    時間等は各環境でお好みに
    注意点としてはWebサーバの再起動を忘れないようにしましょう
    後日更新されているか確認しましょう。
    更新が失敗し続けている場合は
    最初に設定したメールアドレスに有効期限が近い旨のメールが届くので、
    実行ログを出力させたり等の対応を実施して調査をしましょう

以上で完了です。
どんな環境でもすぐに設定できるわけではないですが、
自己証明書と違い、エラーは出ません。
先にも書いた通りSSL化の流れがあり、
無料で設定できるという利点もあります。

では最後に宣伝を…
弊社では下記3社のSSL設定代行サービスを行っております。

  • ベリサイン株式会社(セキュア・サーバーID/グローバル・サーバーID他)
  • グローバルサイン株式会社(クイック認証SSL/企業認証SSL他)
  • セコムトラストシステムズ株式会社(セコムパスポート for Web他)

3社の第3者認証機関の証明書が必要な際は営業部へ
お気軽にお問い合わせ下さい。

実績数30,000件!
サーバーやネットワークなど
ITインフラのことならネットアシストへ、
お気軽にご相談ください