Let's Encryptを使用したSSL導入メモ


## メモ
Let's Encryptを使用したSSL導入メモです。

## CentOS6.xのlibcurlが古くてcurl: (35) SSL connect errorが発生する件
CentOS6.xのyumでインストール出来るlibcurlは古く、'curl: (35) SSL connect error'が発生してしまいます。
libcurlをアップデートするんですが、ソースから入れるのは嫌だったので、別のリポジトリを使用します。

```bash:
rpm -ivh http://www.city-fan.org/ftp/contrib/yum-repo/city-fan.org-release-2-1.rhel6.noarch.rpm
vim /etc/yum.repos.d/city-fan.org.repo
```

デフォルトでenabled=0になっているので1にしておきましょう。

```
[city-fan.org]
name=city-fan.org repository for Red Hat Enterprise Linux (and clones) $releasever ($basearch)
#baseurl=http://mirror.city-fan.org/ftp/contrib/yum-repo/rhel$releasever/$basearch
mirrorlist=http://mirror.city-fan.org/ftp/contrib/yum-repo/mirrorlist-rhel$releasever
#enabled=0
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-city-fan.org
```

--enablerepo=city-fan.org をつけてlibcurlをアップデートします。

```bash:
yum update --enablerepo=city-fan.org libcurl
```

参考ページ
https://knowledge.sakura.ad.jp/5573/

---

## <font color="Red">certbot-auto のセットアップ（旧certbot記事）※古い情報となります</font>

「certbot-auto」は Let’s Encrypt が提供しているツールであり、Let’s Encrypt と通信するエージェント（クライアント）です。2016年5月より以前は letsencrbot と呼ばれていました。このツールは Let’s Encrypt から証明書を取得し、サーバの HTTPS を有効化する機能があります（自動有効化はオプションで、現在 Apache のみ対応）。~~オープンソースのツールとして GitHub で公開・開発されており、様々なディストリビューション上で動作します。ここでは最新版の certbot-auto を取得します。セットアップには、次のコマンドを実行します。~~

~~curl -k https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto~~
~~chmod 700 /usr/bin/certbot-auto~~



### 旧certbotパッケージの削除
certbot-autoおよびCertbotのOSパッケージを削除します。 
apt、dnf、yumなどのOSのパッケージマネージャーを使用してcertbotパッケージをインストールしている場合は、snap版certbotをインストールする前にそれらを削除して、certbotコマンドを実行するときに、OSのパッケージマネージャーからのインストール版ではなくsnap版が使用されるようにする必要があります。 

これを行うための正確なコマンドはOSによって異なりますが、一般的な例はsudo apt-get remove certbot、sudo dnf remove certbot、またはsudo yum remove certbotです。 

以前にcertbot-autoスクリプトを使用してcertbotを使用したことがある場合は、[こちら](https://certbot.eff.org/docs/uninstall.html)の手順に従ってインストールを削除する必要もあります。 

github版を/usr/binにcloneしている場合は、単純にcertbotディレクトリを削除します。 

```bash:
$ sudo rm -rf /usr/bin/certbot
```


### snap版certbot
「Let's Encrypt」の証明書の作成ツールであるcertbotのプログラムが刷新され、従来のgithubからcloneしたものを実行していた環境では証明書の作成・更新が行えなくなっています。
旧版を使用している場合、ログに以下のようなメッセージが出力されるようになっているはずです。 

```bash:
Your system is not supported by certbot-auto anymore. Certbot will no longer receive updates. Please visit https://certbot.eff.org/ to check for other alternatives.
```

新しいcertbotはsnapでインストールするように変更されています。そこでこの記事ではgithub版certbotをsnap版に移行する手順を記載いたします。 

[引用元](https://certbot.eff.org/lets-encrypt/centosrhel7-apache)


### snapdをインストール
sudo権限を持つユーザーでWebサイトを実行しているサーバーにSSHで接続します。 
snapdをインストールします。 次のコマンドを使用してEPELリポジトリをCentOS7システムに追加します。 

```bash:
$ sudo yum install epel-release
```

CentOSにEPELリポジトリを追加後、snapdパッケージをインストールします。 

```bash:
$ sudo yum install snapd
```

インストールしたら、メインのsnap通信ソケットを管理するsystemdユニットを有効にします。

```bash:
$ sudo systemctl enable --now snapd.socket
```

従来のsnapサポートを有効にするには、以下を実行して/var/lib/snapd/snapの/snapへのシンボリックリンクを作成します。 ログアウトして再度ログインするか、システムを再起動して、snapのパスが正しく更新されていることを確認します。
 
```bash:
$ sudo ln -s /var/lib/snapd/snap /snap
```

snapdのバージョンが最新であることを確認します。 コマンドラインで次の手順を実行して、最新バージョンのsnapdを使用していることを確認します。 

```bash:
$ sudo snap install core
$ sudo snap refresh core
```

[引用元](https://snapcraft.io/docs/installing-snap-on-centos)


### certbotのインストール
コマンドラインで次のコマンドを実行して、certbotをインストールします。

```bash:
$ sudo snap install --classic certbot
```


### certbotコマンドの準備
certbotコマンドを準備します。
コマンドラインで次のコマンドを実行して、certbotコマンドを実行できるようにします。

```bash:
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
```

以下のように/snap/bin/certbotへのシンボリックリンクが作成されているはずです。

```bash:
$ sudo ls -la /usr/bin/certbot
lrwxrwxrwx 1 root root 17 Jan 18 18:32 /usr/bin/certbot -> /snap/bin/certbot

$ sudo ls -la /snap/bin/certbot
lrwxrwxrwx 1 root root 13 Jan 18 18:31 /snap/bin/certbot -> /usr/bin/snap
```

以下のcertbotコマンドでバージョンが表示されることを確認します。 

```bash:
$ sudo certbot --version
certbot 1.11.0
```




## SSL証明書取得手順


証明書の操作に関する様々なコマンドを実行できます。

```bash:
certbot-auto certonly \         # 証明書の作成
    --webroot \                   # 既存のウェブサーバを使うモードを選択
    -w /usr/share/nginx/html \    # ドキュメント・ルートのパス
    -d secure.zem.jp \            # 認証するドメイン名
    --email <メール>@<アドレス>     # メールアドレス登録（証明書期限切れの通知用）
```

ワイルドカードで一度に登録できるDNS-01方式と、別個に登録できるhttp-01方式があります。DNSの方は認証コードをドメインのTXTレコードに登録する必要があり、更新のたびに別の認証コードの登録が必要となります。そのためさくらのクラウドなどスクリプトでTXTを更新できる環境でないと更新ができません。VPSはhttp-01方式となります。


DNS-01チャレンジタイプ方式

```bash:
certbot-auto certonly --manual -d *.ドメイン --email メールアドレス --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory
```

http-01チャレンジタイプ方式

```bash:
certbot-auto certonly --webroot -w 公開ディレクトリ -d ドメイン --email メールアドレス
```

認証

```bash:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N
```

---

## 自動化

Let's Encryptは３ヶ月しか有効期限がないので、自動更新するとよい。更新のためのコマンドをcronする。 まず、下記のコマンドが正常に動作し、証明書が更新されるかをテスト。

```bash:
sudo /usr/bin/certbot-auto renew --post-hook "/etc/init.d/httpd graceful"
```

renewは、すべての証明書を更新するコマンド。--post-hookオプションで指定したコマンドは、renew後に実行される。ただし、renewは期限が迫らないうちは、実行がスキップされ、その場合はpost-hookも実行されない。いまは証明書を発行したばかりなので、下記のように表示されれば、問題なし。

```bash:
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/test.example.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/test.example.com/fullchain.pem (skipped)
No renewals were attempted.
No hooks were run.
```

OKなら、cronに登録する。 /etc/crontabで例：毎週火曜23時59分に実施

```bash:
59 23 * * 2 root /usr/bin/certbot-auto renew --post-hook "/etc/init.d/httpd graceful" >/dev/null 2>&1
```

---


## 失効

すでに認証通っているドメインから失効するには下記で設定。

```bash:
certbot-auto revoke --cert-path=/etc/letsencrypt/live/失効対象ドメイン/fullchain.pem
```

---

## 証明書設定

下記に各証明書ができるのでそれをサーバ側で読むようにする。

```
/etc/letsencrypt/live/ドメイン/
```

### certbotの動作確認
certbotが機能していることを確認します。
サイトが正しく設定されていることを確認するには、ブラウザでhttps://自サイトのドメイン/にアクセスし、URLバーで鍵のアイコンを探します。 


### cronの登録・修正
cronの登録・修正を行います。
単純にcronにcertbot renewを登録するだけで証明書は更新されますが、以下の例では、証明書の更新後に再起動が必要なサービスを--renew-hookオプションで再起動させるようにします。またログへの出力および管理者へのメール送信も実施するようにします。 
```sh
$ certbot renew --renew-hook "systemctl restart httpd" --renew-hook "systemctl restart postfix" --renew-hook "systemctl restart dovecot" --renew-hook "service vsftpd restart" --renew-hook "systemctl restart webmin" -q >> /var/log/certbot-renew.log | mail -s "CERTBOT Renewals" admin@hoge.com < /var/log/certbot-renew.log
```