Let’s Encrypt で「-0001」つきの証明書が作成された時の対処方法(CentOS6環境)

Let’s Encrypt
Let’s Encryptの更新に失敗する。調べてみると「ドメイン-0001」の証明書が作成されている。どうすればよい?

この疑問に回答します。

Let’s Encryptで証明書対象を増加減させていると、いつのまにか0001が付いた設定で証明書が作成されてしまいます。

「ドメイン-0001」が作成される理由

Let’s Encryptで証明書対象を増加減させていると設定の上書きを行う場面に遭遇します。その時に、素直に上書きすればよいのに、キャンセルをすると「0001」で作成されてしまいます。

Do you want to expand and replace this existing certificate with the new certificate? (E)xpand/(C)ancel

出来てしまったら仕方がない。設定が新たに追加された状態になります。confファイルも証明書も追加されます。

####
### conf ファイル
####
./letsencrypt/renewal/
├── [mydomain]-0001.conf
└── [mydomain].conf

####
### 証明書 ファイル
####
./letsencrypt/live/
├── [mydomain] ← 既存の証明書
│   ├── README
│   ├── cert.pem -> ../../archive/[mydomain]/cert17.pem
│   ├── chain.pem -> ../../archive/[mydomain]/chain17.pem
│   ├── fullchain.pem -> ../../archive/[mydomain]/fullchain17.pem
│   └── privkey.pem -> ../../archive/[mydomain]/privkey17.pem
└── [mydomain]-0001 ← 0001が付いた新しい証明書
     ├── README
     ├── cert.pem -> ../../archive/[mydomain]-0001/cert2.pem
     ├── chain.pem -> ../../archive/[mydomain]-0001/chain2.pem
     ├── fullchain.pem -> ../../archive/[mydomain]-0001/fullchain2.pem
     └── privkey.pem -> ../../archive/[mydomain]-0001/privkey2.pem

作成されてしまうと元に戻すことはできません。

「ドメイン-0001」が作成された時の対応方法

特に難しいことはありません。対応方法はシンプルです。

作成された情報は削除して新たに再作成する。

「0001」付きがイヤな場合

新旧2つの情報を削除し再作成する。

簡単に説明すると「無かったことにする」ってことです。

サイトの構築段階で、サイトにアクセスが来ていない時に対応する方法です。

ここで注意することがあります。

 Renew & replace the cert (limit ~5 per 7 days)
証明書の更新/置き換えは、7日間に5回までと制限されます。やり過ぎには注意してください。

「0001」付きがで構わない場合

旧の情報を削除する

簡単に説明すると「出来てしまったものは仕方ない。新しい方を利用する」ってことです。
既存サイトなどで、既に運用が始まりサイトにアクセスがある場合は影響を少なくするためにこの方法で対応します。

「certbot」コマンドを利用して証明書を削除する

場合によって、旧署名書を削除しないとエラーが出ます

Let’s Encryptの更新コマンド(renew)は、管理下の証明書全てを更新する動きをします。

もし、不要ドメインが入っていたり、well-knownディレクトリにアクセス出来なかったりすると、Let’s Encrypt証明書の更新処理が失敗します。

# /usr/bin/scl enable python27 '/etc/letsencrypt/letsencrypt-auto renew'
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/[mydomain]-0001.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal ← 新設定は問題なし

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/[mydomain].conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator webroot, Installer None
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for [mydomain]
Using the webroot path /usr/share/nginx/html for all unmatched domains.
Waiting for verification...
Challenge failed for domain [mydomain]
http-01 challenge for [mydomain]
Cleaning up challenges
Attempting to renew cert ([mydomain]) from /etc/letsencrypt/renewal/[mydomain].conf produced an unexpected error: Some challenges have failed.. Skipping.
All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/[mydomain]/fullchain.pem (failure) ← 旧設定はエラー

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

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/[mydomain]-0001/fullchain.pem expires on 2020-09-30 (skipped)
All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/[mydomain]/fullchain.pem (failure)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 renew failure(s), 0 parse failure(s) ← エラーがあるので更新に失敗

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: [mydomain]
   Type:   dns
   Detail: DNS problem: NXDOMAIN looking up A for [mydomain]
   - check that a DNS record exists for this domain ← エラー原因

今回は、旧設定にDNSに登録されていないドメインが指定されてエラーになっています(不要なのでDNSを消した)

証明書の確認を行う(certbot certificates)

まずは、Let’s Encrypt が管理している証明書を確認します。

CentOS6を利用している場合は、少しだけ特殊です。

Let’s Encrypt を動かすにはpython(2.7)が必要です。しかし、CentOS6のpython(2.6)が古いためLet’s Encrypt がスグに動きません。Software collections(SCL)を利用して利用します。

# /usr/bin/scl enable python27 '/etc/letsencrypt/certbot-auto certificates'
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: [mydomain]-0001
    Serial Number: 3c7bedb93743a170ab3e8a72f73650b17ab
    Domains: [mydomain]
    Expiry Date: 2020-09-30 05:55:48+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/[mydomain]-0001/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/[mydomain]-0001/privkey.pem
  Certificate Name: [mydomain]
    Serial Number: 49ab75117f3a7f5f322fec6d2ffbc85c5f7
    Domains: [mydomain]
    Expiry Date: 2020-07-28 20:02:16+00:00 (VALID: 25 days)
    Certificate Path: /etc/letsencrypt/live/[mydomain]/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/[mydomain]/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

新旧2つの証明書があることが確認できました。

証明書の削除を行う(certbot delete)

不要な証明書を削除します。既存サイトなので、影響が出ないように古い設定ファイルのみ削除します。

削除対象は「certbot certificates」コマンドで確認した「Certificate Name」の値を利用します。

#  /usr/bin/scl enable python27 '/etc/letsencrypt/certbot-auto delete --cert-name [mydomain]'
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Deleted all files relating to certificate [mydomain].
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

これで、削除対象の設定が削除されました。

あとは、忘れずにApacheやNginxで設定した証明書の位置を再確認してください。

 

以上、「Let’s Encrypt で「-0001」つきの証明書が作成された時の対処方法(CentOS6環境)」という記事でした。