Let’s Encrypt証明書発行から削除まで試行錯誤

#Let’s Encrypt証明書発行から削除手順
新規ドメイン導入に伴い、SSL対応をしたかったことと、
現在使用中のドメインはそのままでサブドメインのみを追加したかったが、
サブドメインのみの証明書作成が見当たらなかったため、手探りで実行したメモ

##前提
###環境
CentOS

nginx

ドメインルートに認証なし(basic認証など)でアクセスできること

###使用ドメイン
example.com / www.example.com

home.comのサブドメイン(このドメインとwww付ドメインはラピッドSSLで証明書の残期間があるのでサブドメインのみ追加)

xxx.home.com / yyy.home.com

##インストール
```bash
$ sudo yum install epel-release
$ sudo yum install certbot
```

##証明書の発行
```bash
$ sudo certbot certonly --webroot -w /usr/share/nginx/example/ -d example.com -d example.com -m xxx@example.com --agree-tos
$ sudo certbot certonly --webroot -w /usr/share/nginx/xxx/ -d xxx.home.com -w /usr/share/nginx/yyy/ -d yyy.home.com -m xxx@example.com --agree-tos
```

使用コマンド

* certonly　　　　
	* 証明書作成
* --webroot
	* webサーバ稼働中に証明書作成
* -w
	* nginxで指定しているのwebルート
* -d
	* ドメイン名
* -m
	* 更新時に期限に連絡が入るメールアドレス
* -agree-tos
	* 非対話式で実行

複数のドメインを登録する場合は、最初に記載したドメイン名のディレクトリが作成される

よって1枚で複数ドメインに対応できる。(2018年にワイルドカード実装予定らしい)

今回は運用上、ドメイン毎に1枚の発行とする。

##更新
###通常の更新
```bash
$ sudo certbot renew 			#更新
$ sudo certbot --force-renew	#強制更新
```

###更新する証明書を限定する方法(未検証-公式から引用)
指定した1枚の証明書のみを更新したい場合には、certbot renew コマンドを使用することはできません。

代わりに、-d フラグで証明書が有効なドメイン名（複数指定した場合には サブジェクトの代替名 として扱われます）を指定した certbot certonly コマンドを実行します。

その際に、ユーザーからの入力が要求されることのないよう -nフラグを指定する

古い証明書を更新された証明書に置き換えるためには、証明書がカバーするすべてのドメイン名・サブドメイン名を指定する必要があり、

異なるドメイン名の集合が指定された場合、古い証明書が置き換えられるのではなく、指定されたドメイン名のみに有効な新しい証明書が取得されます。

```bash
$ sudo certbot certonly -n -d example.com -d www.example.com
```

###取得済みの証明書に新しいドメイン名を追加する方法(未検証-公式から引用)
取得済みの証明書を、過去に取得したすべてのドメイン名と新たに追加するドメイン名（複数可）に対して有効な証明書に更新します。

```bash
$ sudo certbot --expand -d example.com existing.com newdomain.com

個別にドメイン名指定
$ sudo certbot --expand -d example.com -d existing.com -d newdomain.com
```

###取得済みの証明書から一部ドメインを削除する方法(未検証-公式から引用)
複数のドメイン名に有効な証明書の発行を要求した際に、いくつかのドメイン名を使わなくなった場合に

認証に成功したドメイン名のみの組み合わせに対して有効な証明書を取得します。

```bash
$ sudo certbot certonly --allow-subset-of-names
```

##自動更新
cronに実行予定追加

```bash
50 2 1 * * certbot renew --post-hook "systemctl reload nginx" >> /var/log/letsencrypt.log
```
指定の時刻に「certbot renew」を実行して、nginxのリロードを行い、実行ログを残す。

##削除
###証明書の失効
```bash
$ sudo certbot revoke --cert-path /etc/letsencrypt/live/xxx.home.com/cert.pem
```
* --cert-pat	証明書のパスを指定

###証明書関連ファイルの削除
証明書に関連するすべてのファイルは、deleteコマンドでシステムから削除できます。

```bash
$ sudo certbot delete --cert-name xxx.home.com
```
※deleteを使用して証明書を完全に削除しないと、次の更新で自動的に更新されます。

###nginxの設定
ssl.confを新規に作成して作成された証明書の場所を設定
ついでに「dhparam.pem」を同ディレクトリに格納します。

```bash
$　sudo openssl dhparam 2048 -out /etc/letsencrypt/live/xxx.home.com/dhparam.pem
$　sudo vi /etc/nginx/conf.d/ssl.conf
# TLS(SSL)
ssl_certificate /etc/letsencrypt/live/xxx.home.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xxx.home.com/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_trusted_certificate /etc/letsencrypt/live/xxx.home.com/chain.pem;
ssl_dhparam /etc/letsencrypt/live/xxx.home.com/dhparam.pem;
```

nginx.confのserver配下にincludeでSSLの設定を読み込ませると複数サイトをする場合でも一行で終わります。

```bash:nginx.conf
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name  xxx.home.com;
    root         /usr/share/nginx/xxx;
    index        index.html;
    include /etc/nginx/conf.d/admin/ssl.conf;
}
```

##実行ログ
###証明書の発行
```bash
$ sudo certbot certonly --webroot -w /usr/share/nginx/xxx/ -d xxx.home.com -w /usr/share/nginx/www/ -d www.home.com -w /usr/share/nginx/yyy/ -d yyy.home.com -m xxx@home.com

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for xxx.home.com
http-01 challenge for www.home.com
http-01 challenge for yyy.home.com
Using the webroot path /usr/share/nginx/yyy for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/xxx.home.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/xxx.home.com/privkey.pem
   Your cert will expire on 2018-01-26. 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"
 - 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

#証明書の作成を確認(-dで最初に指定したxxx.home.comのディレクトリ内にファイルが作成される)
$ sudo ls /etc/letsencrypt/live
xxx.home.com  example.com

$ sudo ls /etc/letsencrypt/live/xxx.home.com
cert.pem  chain.pem  fullchain.pem  privkey.pem  README
```

###証明書の管理
```bash
$ sudo certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Found the following certs:
  Certificate Name: example.com
    Domains: example.com,www.example.com
    Expiry Date: 2018-01-22 14:26:27+00:00 (VALID: 79 days)
    Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem
  Certificate Name: xxx.home.com
    Domains: xxx.home.com,yyy.home.com,www.home.com
    Expiry Date: 2018-01-26 00:55:42+00:00 (VALID: 82 days)
    Certificate Path: /etc/letsencrypt/live/xxx.home.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/xxx.home.com/privkey.pem
-------------------------------------------------------------------------------
```
証明書の名前と登録しているドメイン名が出力されます。

###証明書の失効
```bash
$ sudo certbot revoke --cert-path /etc/letsencrypt/live/xxx.home.com/cert.pem
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org

-------------------------------------------------------------------------------
Congratulations! You have successfully revoked the certificate that was located
at /etc/letsencrypt/live/xxx.home.com/cert.pem

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

#失効を確認
$ sudo  certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Found the following certs:
  Certificate Name: example.com
    Domains: example.com,www.example.com
    Expiry Date: 2018-01-22 14:26:27+00:00 (VALID: 79 days)
    Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem
  Certificate Name: xxx.home.com
    Domains: xxx.home.com,yyy.home.com,www.home.com
    Expiry Date: 2018-01-26 00:55:42+00:00 (INVALID: REVOKED)
    Certificate Path: /etc/letsencrypt/live/xxx.home.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/xxx.home.com/privkey.pem
-------------------------------------------------------------------------------
#xxx.home.comが登録時は「82 days」だったのが「REVOKED」と表示されました。

#関連ファイルの削除
$ sudo certbot delete --cert-name xxx.home.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Deleted all files relating to certificate xxx.home.com.
-------------------------------------------------------------------------------

#失効を確認
$ sudo  certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Found the following certs:
  Certificate Name: example.com
    Domains: example.com,www.example.com
    Expiry Date: 2018-01-22 14:26:27+00:00 (VALID: 79 days)
    Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem
-------------------------------------------------------------------------------
#xxx.home.comが完全に削除されました。
```

###証明書登録時のエラー
CAAを別に設定していると発生するエラー
これはドメインのレコードにCAAを設定していると発生しました。
メインドメインがラピッドSSLなのでそれに対応したCAAを設定したまま
サブドメインをLet'sに登録しようとしたので、登録された情報と違うよとエラーを返されました。
ですので、CAAレコードの登録を解除すれば解決しました。
ちなみにドメイン登録後にCAAレコードを設定しても問題はありませんでしたが、ドメイン更新時にはエラーがでるでしょう。

````bash
sudo certbot certonly --webroot -w /usr/share/nginx/xxx/ -d xxx.home.com -w /usr/share/nginx/yyy/ -d yyy.home.com -m xxx@home.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for xxx.home.com
http-01 challenge for yyy.home.com
Using the webroot path /usr/share/nginx/yyy for all unmatched domains.
Waiting for verification...
Cleaning up challenges
An unexpected error occurred:
Error creating new cert :: Rechecking CAA: While processing CAA for xxx.home.com: CAA record for xxx.home.com prevents issuance, While processing CAA for yyy.home.com: CAA record for yyy.home.com prevents issuance
Please see the logfiles in /var/log/letsencrypt for more details.
```
ドメインはお名前で管理してさくらVPSサーバを使用しています。
さくらのネームサーバー登録画面でCAAを設定できます。
レコードタイプ「NS」はお名前のネームサーバ指定
サブドメインを「CNAME」で登録しているので、CAAの登録は1個しか登録できません。
サブドメインを「A」で登録すれば個別にCAAを設定できるようですが、設定しなおすのはめんどくさいのでメインドメインの有効期限が切れるまではそのままになりそうです。
![無題.jpg](https://qiita-image-store.s3.amazonaws.com/0/70171/2cccd4c3-ac43-03d8-8dea-6315a7e92b55.jpeg)