AWSのcentos+nginxでオレオレ証明書〜クライアント証明書+Let'sEncryptに証明してもらうまで
2日ぐらい作業をしたのですが、結構無駄に時間を食ってしまったので詰まりポイント等をメモしていきます
1.各証明書系を作る
4番以降はApacheの設定の話なのでスルーします。
2.作った証明書をnginxに設定する。
/etc/nginx/nginx.confを直します。
server { listen 443 ssl; # ssl on; ではなく、listen に書くのが推奨 server_name domein名を書く!; # server certificate sl_certificate /etc/pki/CA/certs/ドメイン名.crt; # サーバのSSL証明書。 # server privatae key # ssl_certificate_key /etc/pki/CA/private/ドメイン名.key; # サーバの秘密鍵。 ssl_verify_client on; # クライアント認証 # ssl_verify_depth 10; # 中間CA を使う場合のみ # CA certificate ssl_client_certificate /etc/pki/CA/cacert.pem; # プライベートCAの証明書 }
正直、どのファイルをどこに置けば良いのか全然分からないので最初にそこで詰みました。
どれがなんのファイルか理解しないと行けませんね
あと、reloadしたらエラーになって動かないこともあるので事前にチェックができます。
# which nginx /sbin/nginx # /sbin/nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful #
3.Let'sencryptで証明書を無銭で証明してもらおう
オレオレ証明だとchromeさんがこんな感じにエラーを吐きます。(画像は参考です)
ちなみに長野県のサイトは未だに証明書系がおかしいのですが、いつ直るのでしょう・・
とにかくサーバーの証明書をちゃんとしたものにするためにlet'sencryptというものを入れます。
これをやるとレッツエンクリプトさんが認めたサーバーだからOKとchromeさんも怒らないみたいです。
基本的な手順書はこちら tkuchiki.hatenablog.com
4.証明書をnginxさんに教えて上げよう
confをこんな感じに設定を直しましょう。
server { listen 443 ssl; # ssl on; ではなく、listen に書くのが推奨 server_name ドメイン名; # server certificate ssl_certificate /etc/letsencrypt/live/ドメイン名/fullchain.pem; # let's encrypt ★ここを変更 # server privatae key ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem; # let's encrypt ★ここを変更 ssl_verify_client on; # クライアント認証 # CA certificate ssl_client_certificate /etc/pki/CA/cacert.pem; # プライベートCAの証明書 }
詰まったポイント
1 t2.microだとメモリーが足りなくて落ちる
./certbot-auto certonly –webroot -w /usr/share/nginx/html -d your.domain –agree-tos -m your@email.address –debug をやった際にmemoryが足りないぞと怒られます。 しかし、それ以外にもgccのインストールで失敗してるとかpip のバージョン上げろとか色々出てるので混乱するんですよね (エラーログはすみません、残ってません)
対策) メモリーを増やそう! swapというのを使えばいいみたいです。 oh-sky.hatenablog.com
2.IP制限をかけていたのでLet'sencryptさんが自分のEC2に繋げられずにエラー
koty.hatenablog.com こちらに書かれてるとおりです
アクセス元の66.133.109.36 は固定されたIPのようなので、次回からはこのIP指定でアクセス制限しても良いかもしれない。
書かれているとおりセキュリティグループに上記を追加したら上手くいきました。
3.well-knownに繋がらない
let'sencryptは/usr/share/nginx/html 配下に .well-known/acme-challenge/ランダム文字列
で何かを作りますがここにアクセス出来なくて困っていたようです。
なのでnginxさんにこちらのlocationを作って上げないと行けませんでした。
server { listen 80; # ssl on; ではなく、listen に書くのが推奨 server_name ドメイン名; location ~ /.well-known { root /usr/share/nginx/html; } }
これを追加します。 正しいのかどうかはよく分かりません(^_^;)
4.chromeだけエラーを出し続ける(T_T)
上記の設定でsafariやfirefoxでは証明書系の警告がなくなりましたがなぜかchromeだけで続けるんですよ!
プライベートブラウズしても!
多分の回答)nginxに中間証明書はないぞ!
# ssl_verify_depth 10; # 中間CA を使う場合のみ
手順書にこういう話があったので上記の1〜3で困ったときに中間証明書の設定をonにしたりoffにしてみたりしてました。
が、よくわかりませんがこの設定がonになってるとchromeさんだけ証明書を更新してくれず?エラーを出し続けます。
これを切ってnginxをreloadすることで無事chromeでも証明書の警告がでなくなりました。
これでひとまずクライアント証明書ができて、クライアント証明書を持った人が警告なしでサイトを開けるようになりました!
問題は期間が短いのでこいつを延ばしてやる必要があります。。(以下次号)