SSL証明書を無料で発行!という言葉につられてやってみました。
Let's Encrypt、無料って最高。
個人用のサーバーで個人用のドメインによるテスト。
CentOS7、Apache2.4という環境。
まずは
How it workを見てチャレンジ
# git clone https://github.com/letsencrypt/letsencrypt
# cd ./letsencrypt
# ./letsencrypt-auto --help
# ./letsencrypt-auto certonly --standalone -d 登録したいドメイン
これで登録完了。
--standaloneオプションだとGUIでメールアドレスの入力などを求められたりする。
GUIではメアドの入力や規約確認などを行います。
80番ポートが空いてないと、途中で失敗します。
systemctl stop httpdなどとしてデーモンを止めておくか
./--http-01-port 8080オプション設定でポートを変えておく必要がありそう。
私はNAT的に上手く通らず、素直に停止しました。
登録完了後はhttpd.confにSSL設定確認。
opensslとかは
./letsencrypt-auto --helpをたたいた時に勝手に入る。
apacheだと/etc/httpd/conf.d/ssl.confとかで設定
SSLCertificateFile /etc/letsencrypt/live/登録したドメイン/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/登録したドメイン/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/登録したドメイン/chain.pem
終わったらリロード。https://登録したいドメイン/にアクセスして動作確認。
# systemctl reload httpd
はまったところ
--webrootで更新自動化をやってみた。
# ./letsencrypt-auto certonly --webroot -d 登録したドメイン --webroot-path HTTPDのドキュメントルート --renew-by-default --debug
Traceback (most recent call last):
File "/root/.local/share/letsencrypt/bin/letsencrypt", line 11, in <module>
sys.exit(main())
File "/root/.local/share/letsencrypt/lib/python2.7/site-packages/letsencrypt/cli.py", line 1454, in main
return args.func(args, config, plugins)
File "/root/.local/share/letsencrypt/lib/python2.7/site-packages/letsencrypt/cli.py", line 639, in obtain_cert
_auth_from_domains(le_client, config, domains)
File "/root/.local/share/letsencrypt/lib/python2.7/site-packages/letsencrypt/cli.py", line 405, in _auth_from_domains
new_certr, new_chain, new_key, _ = le_client.obtain_certificate(domains)
File "/root/.local/share/letsencrypt/lib/python2.7/site-packages/letsencrypt/client.py", line 266, in obtain_certificate
return self._obtain_certificate(domains, csr) + (key, csr)
File "/root/.local/share/letsencrypt/lib/python2.7/site-packages/letsencrypt/client.py", line 224, in _obtain_certificate
authzr = self.auth_handler.get_authorizations(domains)
File "/root/.local/share/letsencrypt/lib/python2.7/site-packages/letsencrypt/auth_handler.py", line 84, in get_authorizations
self._respond(cont_resp, dv_resp, best_effort)
File "/root/.local/share/letsencrypt/lib/python2.7/site-packages/letsencrypt/auth_handler.py", line 142, in _respond
self._poll_challenges(chall_update, best_effort)
File "/root/.local/share/letsencrypt/lib/python2.7/site-packages/letsencrypt/auth_handler.py", line 204, in _poll_challenges
raise errors.FailedChallenges(all_failed_achalls)
FailedChallenges: Failed authorization procedure. *********.com (http-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: Error parsing key authorization file: Invalid key authorization: 1 parts
IMPORTANT NOTES:
- The following errors were reported by the server:
Domain: 登録したドメイン
Type: urn:acme:error:unauthorized
Detail: Error parsing key authorization file: Invalid key
authorization: 1 parts
こんなエラーで怒られる。
Document Root/.well-known/acme-challenge/なパスが出来ており、
ここにアクセスが来て何か確認してるっぽい。
66.133.109.36 - - [03/Feb/2016:17:12:29 +0900] "GET /.well-known/acme-challenge/E_BM-w0gntstIOrD7as7pIBwI5zSGSLq6Xr28yCdJt0 HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
こんなのがくる。
どうやら HTTP STATUS 200で返してしまうのが問題のよう。
Wordpressもそうじゃないかな?と思うのですが、.htaccessやhttpd.confの設定ファイルで、mod_rewriteやScriptAliasなどによってパスの変更設定等をしていると、実際にはないのに404以外のステータスが返ります。
恐らくAllow denyによる403やLocationによる302などでも同じで、404が返らないとだめなのではないかと思う。
RewriteEngine On
RewriteBase /wp/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wp/index.php [L]
上記のような設定(サンプル)を下記の1行を追加で回避。
RewriteEngine On
RewriteBase /wp/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.well-known/
RewriteRule . /wp/index.php [L]
もう一度コマンドを叩いて、更新されることを確認
# letsencrypt-auto certonly --webroot -d 登録したドメイン --webroot-path HTTPDのドキュメントルート --renew-by-default --debug
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/登録したドメイン/fullchain.pem. Your cert will expire
on 2016-05-03. To obtain a new version of the certificate in the
future, simply run Let's Encrypt again.
- If you like Let's Encrypt, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
# cd /
# cd /etc/letsencrypt/archive/登録したドメイン/
# ls -l
合計 32
-rw-r--r-- 1 root root 1777 2月 2 16:30 cert1.pem
-rw-r--r-- 1 root root 1777 2月 3 17:12 cert2.pem
-rw-r--r-- 1 root root 1675 2月 2 16:30 chain1.pem
-rw-r--r-- 1 root root 1675 2月 3 17:12 chain2.pem
-rw-r--r-- 1 root root 3452 2月 2 16:30 fullchain1.pem
-rw-r--r-- 1 root root 3452 2月 3 17:12 fullchain2.pem
-rw-r--r-- 1 root root 1704 2月 2 16:30 privkey1.pem
-rw-r--r-- 1 root root 1704 2月 3 17:12 privkey2.pem
※/etc/letsencrypt/live/登録したドメイン/****.pemは /etc/letsencrypt/archive/*****2.pemなどへのリンク
cronなどで下記の設定をして終了。
0 5 1 * * /Path/to/letsencrypt-auto certonly --webroot -d 登録したドメイン --webroot-path HTTPDのドキュメントルート --renew-by-default --debug >> /var/log/letsencrypt/letsencrypt.log && /bin/systemctl reload httpd
こちらのサイトが大変参考になりました。
そのうちサービスにも適用したい。
[1回]