macOS Serverに『Let's Encrypt』の証明書のセットアップ (手動更新)

#はじめに
Let's Encryptで証明書作成して早2ヶ月、有効期限90日の証明書失効が近づいた。期限が切れる前に更新し、そのメモです。作成クライアントマシンは、macOS High Sierraで、サーバマシンは、macOS Server 5.3です。

##更新といっても
更新ということで、『certbot renew』を使おうと思うわけですが、エラーになります。community.letsencrypt.orgの『[Certbot manual renew](https://community.letsencrypt.org/t/certbot-manual-renew/17789/2)』よると、そもそも、--manualオプションで作っているので、renewは使えないようです。なので、コマンドは、新規の時と同じで行います。ただし、既存の証明書がある場合、更新処理となります。

#事前準備
『[macOS Serverに『Let's Encrypt』の証明書のセットアップ](https://qiita.com/motofumi/items/3f2f27c52ba461678639)』
で設定した証明書の更新です。certbotクライアントのセットアップと失効が近づいている証明書は、クライアントにあるはずです。その証明書の更新します。



#大まかな流れ
1. クライアントマシンに失効を迎える証明書の確認
2. certbotコマンドで証明書の更新
3. できた証明書をサーバマシンにアップロード
4. Server.appを使って証明書をセットアップ


#手順
##クライアントマシンで失効を迎える証明書の確認
/etc/letsencrypt/live/ドメイン名/
と
/etc/letsencrypt/archive/ドメイン名/
に証明書があることを確認する。パーミッションがないと思うので、root権限で確認する。(sudo suコマンド)

例えば、いままで更新したことがない場合、
『/etc/letsencrypt/archive/ドメイン名/cert1.pem』があり、そのシンボリックリンクが、『/etc/letsencrypt/live/ドメイン名/cert.pem』として存在します。

##certbotを使って証明書をクライアントマシンで更新

1 次のコマンド入力
```
$ sudo certbot certonly --manual
```

2 次の通り出力されるので、以前作成したホスト名.ドメイン名やドメイン名を入力

```
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel): 
```

3 次の通り出力されるので、以前yesを入力

```
Cert is due for renewal, auto-renewing...
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for ホスト名.ドメイン名
http-01 challenge for ドメイン名

-------------------------------------------------------------------------------
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: 
```

4 次の通り出力されるので、『ファイル名(ランダムな文字列)』で『ファイルの内容(ランダムな文字列)』のWebページをサーバ(ホスト名.ドメイン名 or/and ドメイン名)上で作成。(複数ある場合、複数のページを作成)

```
-------------------------------------------------------------------------------
Create a file containing just this data:
ファイルの内容(ランダムな文字列)

And make it available on your web server at this URL:
http://ホスト名.ドメイン名/.well-known/acme-challenge/ファイル名(ランダムな文字列)
-------------------------------------------------------------------------------
Press Enter to Continue

```


5 次の通り出力されて、証明書が更新される
（証明書の実体は、/etc/letsencrypt/archive/ドメイン名/に入っていて、以前の証明書の名前の末尾の数字がインクリメントされているはずです。）

例えば、更新1回目の場合
『/etc/letsencrypt/archive/ドメイン名/cert2.pem』作成され、そのシンボリックリンクが、『/etc/letsencrypt/live/ドメイン名/cert.pem』として存在します。

```
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/ドメイン名/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/ドメイン名/privkey.pem
Your cert will expire on 2018-04-20. 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

```





##できた証明書をサーバマシンにアップロード
証明書ができると、/etc/letsencrypt/live/ドメイン名/に4種類の証明書が作成されて、その中のprivkey.pemとfullchain.pemをサーバにコピーする。ちなみにliveディレクトリに入っているのはリンクで、実体は、/etc/letsencrypt/archive/ドメイン名/に入っている。

##Server.appを使って証明書をセットアップ
Server.appのサーバの証明書で、『証明書識別情報を読み込む...』選ぶ。

![スクリーンショット 2017-10-26 8.31.32.png](https://qiita-image-store.s3.amazonaws.com/0/54439/33bd719d-dce6-4322-23f3-7289b0909b84.png)

『秘密鍵が含まれるファイルをここにドラッグしてください。』にprivkey.pemをドラッグし、『公開証明書が含まれるファイルをここにドラッグしてください』にfullcain.pemをドラッグする。

![スクリーンショット 2017-10-26 8.32.08.png](https://qiita-image-store.s3.amazonaws.com/0/54439/5e96f256-1fa6-5f88-5853-95f6c4c516f2.png)

できたら、『サービスのセキュリティ保護に使用:』で証明書を選択してください。

#おまけ
DNS認証を使ったワイルドカード取得
例: example.com, *.example.com

```
$ sudo certbot certonly --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory -d '*.example.com'
```

正引きのゾーンに追加

```
_acme-challenge.example.com.	IN	TXT xxxxxxxxxxxxx

```

確認

```
dig +noedns -t TXT _acme-challenge.example.com
```


#参考資料
+ [Let's Encrypt](https://letsencrypt.org)
+ [OSX ServerにLets' EncryptのSSL証明書を適用したメモ](https://qiita.com/do-gugan/items/2d9d101df8d4d7aa6f50)