centos7 + nginxでLet's EncryptでSSL証明書を更新しようとした際、エラーが発生したのでその対処方法について記載する。
以下では証明書を更新するコマンドの certbot renew --force-renewalを実行している。
# certbot renew --force-renewal
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/hoge.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/certbot/_internal/renewal.py", line 71, in _reconstitute
renewal_candidate = storage.RenewableCert(full_path, config)
File "/usr/lib/python2.7/site-packages/certbot/_internal/storage.py", line 470, in __init__
self._check_symlinks()
File "/usr/lib/python2.7/site-packages/certbot/_internal/storage.py", line 537, in _check_symlinks
"expected {0} to be a symlink".format(link))
CertStorageError: expected /etc/letsencrypt/live/hoge.com/cert.pem to be a symlink
Renewal configuration file /etc/letsencrypt/renewal/hoge.com.conf is broken. Skipping.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
No renewals were attempted.
Additionally, the following renewal configurations were invalid:
/etc/letsencrypt/renewal/hoge.com.conf (parsefail)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
0 renew failure(s), 1 parse failure(s)
CertStorageError: expected /etc/letsencrypt/live/hoge.com/cert.pem to be a symlink というエラーがでている。
エラー内容をみると、どうやらシンボリックリンクのcert.pemが置かれていないという話らしい。
確認してみると、
# ls -l /etc/letsencrypt/live/hoge.com/
-rw-r--r--. 1 root root 1586 2月 9 08:52 chain.pem
-rw-r--r--. 1 root root 3424 2月 9 08:52 fullchain.pem
-rw-------. 1 root root 1704 2月 9 08:52 privkey.pem
-rw-r--r--. 1 root root 1838 2月 9 08:52 cert.pem
確かに、シンボリックリンクはない。あるのは通常ファイルだ。
本来/etc/letsencrypt/live/hoge.comに配置されるのは、
/etc/letsencrypt/archive/hoge.comに配置されているpemファイルへのシンボリックシンクになるそうだ。普通にインストールしただけなのにな。ツールのバグか??
それはさておき、liveの方ほファイルは適当なところに退避して、シンボリックリンクを作成してあげましょう。
# cd /etc/letsencrypt/live/hoge.com
# mkdir bk
# mv *.pem bk
# ln -s /etc/letsencrypt/archive/hoge.com/*.pem .
コマンドを順番に実行すると、/etc/letsencrypt/live/hoge.comにシンボリックリンクが作成される。
# ls -l /etc/letsencrypt/live/hoge.com
合計 0
drwxr-xr-x. 2 root root 79 2月 10 03:31 bk
lrwxrwxrwx. 1 root root 48 2月 10 03:59 cert1.pem -> /etc/letsencrypt/archive/hoge.com/cert1.pem
lrwxrwxrwx. 1 root root 49 2月 10 03:59 chain1.pem -> /etc/letsencrypt/archive/hoge.com/chain1.pem
lrwxrwxrwx. 1 root root 53 2月 10 03:59 fullchain1.pem -> /etc/letsencrypt/archive/hoge.com/fullchain1.pem
lrwxrwxrwx. 1 root root 51 2月 10 03:59 privkey1.pem -> /etc/letsencrypt/archive/hoge.com/privkey1.pem
シンボリックリンクの名前にxxx1.pemなどの番号がついてしまっているので、
それをリネームしてxxx.pemのかたちに修正。
# mv cert1.pem cert.pem
# mv chain1.pem chain.pem
# mv fullchain1pem fullchain.pem
# mv privkey1.pem privkey.pem
もう一度 ls -l を実行。
# ls -l /etc/letsencrypt/live/hoge.com
合計 0
drwxr-xr-x. 2 root root 79 2月 10 03:31 bk
lrwxrwxrwx. 1 root root 48 2月 10 03:59 cert.pem -> /etc/letsencrypt/archive/hoge.com/cert1.pem
lrwxrwxrwx. 1 root root 49 2月 10 03:59 chain.pem -> /etc/letsencrypt/archive/hoge.com/chain1.pem
lrwxrwxrwx. 1 root root 53 2月 10 03:59 fullchain.pem -> /etc/letsencrypt/archive/hoge.com/fullchain1.pem
lrwxrwxrwx. 1 root root 51 2月 10 03:59 privkey.pem -> /etc/letsencrypt/archive/hoge.com/privkey1.pem
これでSSLの更新処理ができるはず。
# certbot renew --force-renewal
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/hoge.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Plugins selected: Authenticator standalone, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Renewing an existing certificate for hoge.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/hoge.com/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all renewals succeeded:
/etc/letsencrypt/live/hoge.com/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
これで成功。
あとは、webサーバーを再起動すれば証明書が適用される。
お疲れさまでした!