Let’s EncryptでSSL証明書を(再)発行!

  • 投稿日:2019.07.10
  •        
  • 更新日:2020.05.08
  •           
  • IT
Let’s EncryptでSSL証明書を(再)発行!

はい,つい一昨日のことです.当ブログのSSL証明書をうっかり期限切れにしてしまいました.最初は検証用で使うくらいかなという気持ちで作ったので自動更新の設定とか忘れてました.ブログにアクセスすると警告が出るので数日間ガタッとアクセス数が落ちていました.というわけでSSL証明書を再発行します.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: www.ether-zone.com
    Domains: www.ether-zone.com
    Expiry Date: 2019-07-05 10:56:30+00:00 (INVALID: EXPIRED)
    Certificate Path: /etc/letsencrypt/live/www.ether-zone.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/www.ether-zone.com/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

環境はクライアントOSがMacOS,ウェブサーバーをホストしているのはAzureのWebAppsです.クライアント上ではすでにLet’s Encryptをインストール済み.

まずは簡単に更新コマンドで試行するも失敗

期限切れの証明書に対して次のコマンドで証明書の更新を試みました.2行目は強制的に更新するコマンドです.

sudo certbot renew
sudo certbot --force-renew

このコマンドを使っても証明書を更新することはできませんでした...やはり一度切らしてしまった証明書は使えないと考え,再発行することにしました.

まずは環境内で残っている関係ファイルを削除しておきます./etc/letsencrypt内の以下ディレクトリを掃除しておきます.

/live/<domain-name>
/archive/<domain-name>
/renewal/<domain-name>
/renewal/<domain-name>.conf

Let’s Encryptで証明書を再発行

まず,事前準備として発行する証明書のドメインでホストの名前解決をできるようにしておきます.具体的には所有しているドメインのDNSレコードにホストを解決できるようにAレコードやCNAMEレコードを記載します.AzureのWebAppsなどであればCNAMEレコード,固定グローバルIPを割り振ったWEBサーバーならAレコードといった具合です.Azureなら「Azure DNSゾーン」でDNSレコードを管理することが可能です.ドメイン取得自体はお名前.comなので,指定のネームサーバーを参照するように設定しておくだけ.

クライアント上で次のコマンドを実行します.<domain-name>のところは適宜置き換えてもらって結構です.

sudo certbot certonly -a manual -d <domain-name>  --server https://acme-v01.api.letsencrypt.org/directory --agree-dev-preview

初めての場合,コマンドを実行するとメールアドレスの登録を促された記憶があります.途中表示される同意文には’Y’で同意して先に進みます.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:

その後,認証用の文字列が表示されるのでこの状態でそのまま別の作業に移ります.(Enterキーは押さないまま放置してください)次のような表示となります.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Create a file containing just this data:

gHooijvDKsmu560kt0OjgMu5ft2SZ5JVz3ggld5gnsk.aehcj1ovzmycaLpOq22fPC6ypD-gSfEHWPO8Ubnn2tI

And make it available on your web server at this URL:



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

ドメインをホストしているサーバーのディレクトリに前の表示文で指定されたファイルを作成します.この場合,ホストの’well-known/acme-challenge/gHooijvDKsmu560kt0OjgMu5ft2SZ5JVz3ggld5gnsk’ディレクトリ内に,’gHooijvDKsmu560kt0OjgMu5ft2SZ5JVz3ggld5gnsk.aehcj1ovzmycaLpOq22fPC6ypD-gSfEHWPO8Ubnn2tI’というデータのファイルを作成します.

WebAppsの場合[高度なツール]からディレクトリを操作します.[Debug Console]>[CMD]から指定のディレクトリにファイルを作成していきます.

あくまでも作成する場所はホストしているサイトのルートディレクトリからみた場所になります.ファイルには1行のデータのみ含めればOKです.作成できたら直接URLを指定して,作成したファイルへ外部からアクセスできることを確認します.

ここまでできたらコマンドプロンプトへ戻ってEnterキーを押します.するとLet’s EncryptのサーバからホストしているWEBサーバへドメインの検証が走ります.正しく検証が行われればその後に表示されるディレクトリに生成された証明書ファイルが格納されます.

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/<domain-name>/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/<domain-name>/privkey.pem
   Your cert will expire on 2019-10-06. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"

PFXファイルへの変換

今回はAzure WebAppsというかAzure Application Gatewayで利用するための証明書なのでPFXファイルへ変換する必要があります.<domain-name>と<output-filename>は適宜自分の環境に合わせて変更してください.-outオプションで指定した先にPFXファイルが出力されるのでそのファイルを使用します.

sudo openssl pkcs12 -export -in ./live/<domain-name>/fullchain.pem -inkey ./live/<domain-name>/privkey.pem -out <output-filename>.pfx

PFXファイルを改めてホストしているサイトにアップロードすると,更新された証明書が適用されていることが確認できます.

証明書の更新にご注意を

Let’s Encryptの証明書の有効期限は90日間です.4半期に1回くらいは更新しないといけないのでうっかり忘れてしまいがちです.自動更新などで証明書を期限切れにしないようにしましょう.