サイズ: 13099
コメント:
|
サイズ: 13036
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 1: | 行 1: |
## page was renamed from SSL証明書/Let's EncryptでSSL証明書の新規作成と自動更新 ## page was renamed from SSL証明書/Let's EncryptでSSL証明書の自動更新 |
|
行 8: | 行 6: |
* しかし FreeBSD では2016年05月29日現在、従来通り、letsencrypt コマンドのまま維持されているため、その前提で話を進める。 | * ports では本家から遅く、2016年06月23日付で [[https://www.freshports.org/security/py-certbot|py-certbot]]に変更となった。 |
行 18: | 行 16: |
* 一般的には ports/security/letsencrypt.sh よりも [[https://www.freshports.org/security/py-letsencrypt|ports/security/py-letsencrypt]] を使う事例の方が多いが、今回は使わない。 | * この時 [[https://www.freshports.org/security/py-certbot|py-certbot]] のインストールは不要である。 * 一般的には ports/security/letsencrypt.sh よりも [[https://www.freshports.org/security/py-certbot|ports/security/py-certbot]] を使う事例の方が多いが、今回は使わない。 |
行 20: | 行 19: |
* ports/security/py-letsencrypt の場合、特にサーバーユースでの使用において、依存で入る ports/packages が全体の半分に至るケースがある(100packges 中 50packages など)。 | * ports/security/py-certbot の場合、特にサーバーユースでの使用において、依存で入る ports/packages が全体の半分に至るケースがある(100packges 中 50packages など)。 |
行 28: | 行 27: |
* これは本家(ports/security/py-letsencrypt)の作法とは相違があるためである。 | * これは本家(ports/security/py-certbot)の作法とは相違があるためである。 |
行 177: | 行 176: |
== Q. ports/security/letsencrypt.sh と ports/security/py-letsencrypt とどっちがいいですか? == | == Q. ports/security/letsencrypt.sh と ports/security/py-certbot とどっちがいいですか? == |
行 182: | 行 181: |
もう一つ、ports/security/letsencrypt.sh にメリットがあるとすれば、現状(py-letsencrypt は 0.5.0)では ECDSA で証明書を作成・更新するのが手間である点くらい。 | もう一つ、ports/security/letsencrypt.sh にメリットがあるとすれば、現状(py-letsencrypt は 0.5.0)では ECDSA で証明書を作成・更新するのが手間である点くらい(最新の py-certbot 0.8.1 では未検証)。 |
Let's EncryptでSSL証明書の新規作成と自動更新
Lets' EncryptによるSSL証明書の自動取得・自動更新に関するメモを残す。
- Let's Encrypt 自体、まだまだ未完成のところがあるので、今後の改善によっては本記述が間に合わないことがある。
- その場合は本家のドキュメントを確認して欲しい。
- 例えば、letsencrypt コマンドは今では certbot コマンドに変わっている。
ports では本家から遅く、2016年06月23日付で py-certbotに変更となった。
- また運用環境が極端に違うことから、FreeBSD 環境での解説のみとし、CentOS 環境での解説は行わない。
- 将来もう少し、環境差違が無くなってから解説するつもりある。
- 現時点では初期運用については差違が無いが、自動運転するにはやることが多すぎるためである。
インストール
- ports ないしは packages から、以下の ports をインストールする。
この時 py-certbot のインストールは不要である。
一般的には ports/security/letsencrypt.sh よりも ports/security/py-certbot を使う事例の方が多いが、今回は使わない。
- Python および Python モジュールに依存しないので、圧倒的に依存が少ない(それでもそこそこある)。
- ports/security/py-certbot の場合、特にサーバーユースでの使用において、依存で入る ports/packages が全体の半分に至るケースがある(100packges 中 50packages など)。
- とは言え、cURL と cURL による依存もまた少なからずある。
- 全体的には手頃なので、ports/security/letsencrypt.sh を選んだ。
- また、定期実行が設定ファイルで制御できるレベルで簡単である。
- ただ、この事情は ports メンテナの功績によるものなので:-)、他の環境でそうであるかは不明である。
準備
- いくつかのディレクトリの作成および設置ルールを決める。
- これは本家(ports/security/py-certbot)の作法とは相違があるためである。
証明書の設置場所
- ports/security/letsencrypt.sh では /usr/local/etc/letsencrypt.sh/certs/コモンネーム/ 以下のファイルが設置される。
- /usr/local/etc/letsencrypt.sh/certs/コモンネーム/cert-UNIXタイム.csr
- /usr/local/etc/letsencrypt.sh/certs/コモンネーム/cert-UNIXタイム.pem
- /usr/local/etc/letsencrypt.sh/certs/コモンネーム/chain-UNIXタイム.pem
- /usr/local/etc/letsencrypt.sh/certs/コモンネーム/fullchain-UNIXタイム.pem
- /usr/local/etc/letsencrypt.sh/certs/コモンネーム/privkey-UNIXタイム.pem
- これは本家の /usr/local/etc/letsencrypt/archive/コモンネーム/ に相当するディレクトリとなる。
- 設置場所についてはプログラム中に直接記載されているため、変更は不可能である。
- その代わり、シンボリックリンクで誘導することは可能。
- また、本家の /usr/local/etc/letsencrypt/live/コモンネーム/ に相当するディレクトリは無く、上記ディレクトリにて、直接、最新の証明書に対してシンボリックリンクが張られる。
# cd /usr/local/etc/letsencrypt.sh/certs/コモンネーム # ls -alF total 122 -rw------- 1 root wheel 436 May 29 06:02 cert-1464469337.csr -rw------- 1 root wheel 1533 May 29 06:02 cert-1464469337.pem lrwx------ 1 root wheel 19 May 29 06:02 cert.csr@ -> cert-1464469337.csr lrwx------ 1 root wheel 19 May 29 06:02 cert.pem@ -> cert-1464469337.pem -rw------- 1 root wheel 1647 May 29 06:02 chain-1464469337.pem lrwx------ 1 root wheel 20 May 29 06:02 chain.pem@ -> chain-1464469337.pem -rw------- 1 root wheel 3180 May 29 06:02 fullchain-1464469337.pem lrwx------ 1 root wheel 24 May 29 06:02 fullchain.pem@ -> fullchain-1464469337.pem -rw------- 1 root wheel 302 May 29 06:02 privkey-1464469337.pem lrwx------ 1 root wheel 22 May 29 06:02 privkey.pem@ -> privkey-1464469337.pem
- 例えば Apache では以下のように指定することになる。
SSLCertificateFile /usr/local/etc/letsencrypt.sh/certs/コモンネーム/fullchain.pem SSLCertificateKeyFile /usr/local/etc/letsencrypt.sh/certs/コモンネーム/privkey.pem
ドメイン所有者確認トークンディレクトリの指定
- ドメイン所有者確認トークンの設置場所(ディレクトリ)を決める。
- これはWebサーバー側の設定とも連動する話なので、その前提で決定する。
- 以下はアクセスログ(例)である。
66.133.109.36 - - [29/May/2016:06:02:21 +0900] "GET /.well-known/acme-challenge/チャレンジトークン HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
- デフォルトで /usr/local/etc/letsencrypt.sh/.acme-challenges となっている。
- 「WELLKNOWN」変数で指定が可能となる。
- 例えば、本手順の参考にしたサイト(後述の参考文献参照)では、以下のディレクトリに設定している。
mkdir -p /usr/local/apache/www/.well-known/acme-challenge
- この時、Apache(2.4)の設定は以下の通りである。
Alias /.well-known/ /usr/local/www/.well-known/ <Directory "/usr/local/www/.well-known/"> Options None AllowOverride None Require all granted Header add Content-Type text/plain </Directory>
アカウントキーの保存ディレクトリの指定
- アカウントキーと呼ばれるJSONとRSA秘密鍵の保存ディレクトリを指定する。
- 特に前者は /usr/local/etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/アカウント/private_key.json と同じものである。
- デフォルトで /usr/local/etc/letsencrypt.sh/private_key.{json,pem} となる。
- これら設定は「ACCOUNT_KEY_JSON」と「ACCOUNT_KEY」設定で指定が可能である。
設定ファイル
- 上記準備と合わせて、設定ファイルに記載する。いわゆるSHなので、その記法はそれに準じる。
- 設定ファイルは /usr/local/etc/letsencrypt.sh/config.sh である。
- ports の場合、config.sh.example も合わせてインストールされるので、合わせて参照して欲しいところ。
- 色々と設定する項目はあるが、下記の設定のみ使用する。
- WELLKNOWN
- ACCOUNT_KEY
- ACCOUNT_KEY_JSON
- RENEW_DAYS
- PRIVATE_KEY_RENEW
- KEY_ALGO / KEYSIZE
- CONTACT_EMAIL
- WELLKNOWN, ACCOUNT_KEY, ACCOUNT_KEY_JSONについてはすでに解説済みなので、残りについて説明する。
- RENEW_DAYS
- 有効期限残日数を指定する。今日を基準に有効期限が指定日数未満になったら更新を行う。
- なお FreeBSD では、更新頻度そのものは毎週行われる(periodic の weekly 指定)。
- PRIVATE_KEY_RENEW
- 更新する毎に秘密鍵を作り直すか否かを指定する。
- デフォルトで「yes」である(毎回作り直す)。
- 指定可能な値は「yes」か「それ以外」かしか無いので、「Yes」と書いてもNoと解釈される。
- KEY_ALGO / KEYSIZE
- SSL証明書の鍵アルゴリズム(KEY_ALGO)と鍵サイズ(KEYSIZE)を指定する。
- KEY_ALGO での選択可能な識別子は「rsa」「prime256v1」「secp384r1」。
- KEY_ALGO が「rsa」の時に限って KEYSIZE を指定する(2048, 3072, 4096)。
- CONTACT_EMAIL
- Let's Encrypt では連絡用メールアドレスの指定が必要となるので、メールアドレスを指定する。
設定ファイル例
1 alias openssl="/usr/bin/openssl"
2
3 RENEW_DAYS="30"
4 KEY_ALGO="prime256v1"
5 PRIVATE_KEY_RENEW="yes"
6 CONTACT_EMAIL="メールアドレス"
7 WELLKNOWN="/usr/local/www/data/.well-known/acme-challenge"
8 ACCOUNT_KEY="/usr/local/etc/letsencrypt.sh/private_key.pem"
9 ACCOUNT_KEY_JSON="/usr/local/etc/letsencrypt.sh/private_key.json"
コモンネームファイル
- 発行するSSL証明書のコモンネームを列挙したファイルを作成する。
- このファイル名は /usr/local/etc/letsencrypt.sh/domains.txt で指定される。
- 1行1証明書で、1カラム目はコモンネームとなり、2カラム目以降は SANs(Subject Alternative Names)を指定する。
- 以下のサンプルでは example.org, example.com の2つの証明書を作成/更新する。
example.org www.example.org example.com www.example.com wiki.example.com
- また、「example.org」のSANとして「www.example.org」が、「example.com」のSANとして「www.example.com」と「wiki.example.com」が合わせて設定される。
手動更新ないしは初回実行
- 以上の設定が完了したら、コマンドを実行する。
-c オプションは --cron と同じ意味である。
letsencrypt.sh -c
自動更新
ports/security/letsencrypt.sh では定期実行に periodic(8) を採用している。
- よって定期実行は /etc/periodic.conf ないしは /etc/periodic.conf.local ファイルにて設定を行う。
weekly_letsencrypt_enable="YES" weekly_letsencrypt_deployscript="/usr/local/etc/letsencrypt.sh/deploy.sh"
単純に更新するだけなら、weekly_letsencrypt_enable="YES" と設定するだけで良い。
- 更新した後、サーバーへの反映を行うスクリプトを weekly_letsencrypt_deployscript で指定できる。
- 指定されたファイルは、実行権限(chmod +x)も必要。
- ただし、証明書の更新が無くても実行されるので、厳密には証明書が更新されたか確認した方がいい。
- とは言え、現地時間で毎週土曜日04時05分(/etc/crontab の periodic weekly 参照のこと)に実行されるので、そのあたりはテキトーでもいいかもしれない。
letsencrypt.sh -gc は古い証明書の削除(クリーンナップ)を行う。
- わざと残しておくのであれば実行は不要である。
/usr/local/etc/letsencrypt.sh/deploy.sh 例
#/bin/sh /usr/sbin/service apache24 restart && /usr/local/bin/letsencrypt.sh -gc
よくある質問とその答え
Q. ports/security/letsencrypt.sh と ports/security/py-certbot とどっちがいいですか?
A. 目標が違うのでどっちとも言えない。 単純なサーバー構成(jail だの docker だの無し)で、そう複雑で無いSSL証明書の運用を行うなら、 python 依存が無い ports/security/letsencrypt.sh を使うのがシンプルと思われ。
もう一つ、ports/security/letsencrypt.sh にメリットがあるとすれば、現状(py-letsencrypt は 0.5.0)では ECDSA で証明書を作成・更新するのが手間である点くらい(最新の py-certbot 0.8.1 では未検証)。
Q. 下記のように所有者確認アクセスに失敗、証明書が更新されません!
66.133.109.36 - - [29/May/2016:04:45:29 +0900] "GET /.well-known/acme-challenge/チャレンジトークン HTTP/1.1" 404 268 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
A. Webサーバーの設定ミスの可能性があります! 自分は Alias /.well-known/ /usr/local/www/.well-knownと最後に「/」を入れ忘れていました! このケースでは Alias の第一、第二引数ともに最後に「/」を含める必要がある。
他にも良くありそうなのが、設定した後にサーバー再起動(ないしは再読み込み)を忘れていたなどが考えられる。
あとリカバリとして、更新に失敗して残ってるCSRや秘密鍵を削除するのに letsencrypt.sh -gc を実施すること。