Let's Encryptで無料SSL証明書を取得する


目的

  • ステージング環境のGCPのVMインスタンスにSSL証明書を設定してhttps通信したい。
  • やり方を忘れないための忘却録として。更新時の作業のメモに。

取得前に確認すること

  • まずドメイン名を取得していること。
  • そのドメイン名をDNS登録してIPアドレスへ名前解決している事
  • 期限切れ時近くにくるメールの受信用メールアドレスを決める。

Let's EncryptのクライアントソフトCertbotをインストール

  • 証明書の取得はCertbotというソフトからコマンド操作をする事で取得できるので、まずインストール
# yum install epel-release
# yum install certbot python-certbot-apache
  • インストールされて使えるかはヘルプ表示で確認
# certbot -h

-------------------------------------------------------------------------------

  certbot [SUBCOMMAND] [options] [-d DOMAIN] [-d DOMAIN] ...
以下省略

80,443ポートを証明書の認証確認の為に開放する

  • ステージング、開発環境等のサーバで、外部からのポートが閉じている場合は認証が失敗します。
  • 認証に必要なので、一時的に開ける操作をします。
  • GCPのVMの場合はVMインスタンス→対象のサーバ選択→編集→ファイアウォールHTTP トラフィックを許可するにチェック→HTTPS トラフィックを許可するにチェック→保存 でポートを開けます。
  • ポートを閉じる場合はHTTP、HTTPSトラフィックを許可するにチェックを外す→保存 

証明書取得コマンドを叩く

  • certonly : 証明書のみを取得
  • --webroot : httpdが動いていて、無停止で取得したい場合に指定
  • -w : ルートディレクトリを指定します
  • -d : ドメイン名を指定
# certbot certonly --webroot -w /home/appuser/public_html/ -d hoge-staging.example.com
  1. 以下会話形式に進みます
    1. 連絡用のメールアドレスを入力 :
    2. 規約への同意 : Y
    3. メーリングリストへの登録 : N (今回不要だった)
    4. 以上入力するとエラーが起きなければ発行される。

証明書の確認

  • デフォルトで /etc/letsencrypt/live/以下に証明書が保存されます。
# ll /etc/letsencrypt/live/hoge-staging.example.com/
total 4
lrwxrwxrwx 1 root root  58 Mar 22 11:26 cert.pem -> ../../archive/hoge-staging.example.com/cert1.pem
lrwxrwxrwx 1 root root  59 Mar 22 11:26 chain.pem -> ../../archive/hoge-staging.example.com/chain1.pem
lrwxrwxrwx 1 root root  63 Mar 22 11:26 fullchain.pem -> ../../archive/hoge-staging.example.com/fullchain1.pem
lrwxrwxrwx 1 root root  61 Mar 22 11:26 privkey.pem -> ../../archive/hoge-staging.example.com/privkey1.pem

Apacheに証明書を設定する

  • httpd 2.4に証明書を設定するには/etc/httpd/conf.d/ssl.confを以下のように編集します
DocumentRoot "/home/appuser/public_html"
SSLCertificateFile /etc/letsencrypt/live/hoge-staging.example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/hoge-staging.example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/hoge-staging.example.com/chain.pem
  • httpdを再起動して起動確認
# service httpd restart
# service httpd status

証明書を更新したい時

  • Let's Encryptの証明書は有効期限が90日です。
  • 更新はrenewコマンドで行います。更新日の30日前になると更新処理が実行されます。
  • このコマンドをclontabに登録して自動化するなど、更新作業を自動化する事ができます。
# certbot renew

終わりに、感想、課題など

  • 更新の自動化時に当然ポートを外部に開放していないと認証失敗するので、更新時には開放している必要があります。閉じたサーバ等ではなにかしら工夫が必要とおもいます。
  • 認証のために80と443を開けないといけない。一時的でも開けたくない時もある。
  • それを差し置いても、取得、更新がコード化できる所が良いところなのかな。

    自分の技術ブログではフリーランス界隈の情報や最新のIT情報の発信していますので、よろしくお願いします。