サイトにSSL設定(nginx)し、オレオレ証明書を発行する
サイトにSSL設定する
server { listen 443; server_name example.jp; ssl on; ssl_certificate /etc/nginx/cert.pem; ssl_certificate_key /etc/nginx/cert.key; }
server { listen 80; listen 443 ssl; server_name example.jp; ssl_certificate /etc/nginx/cert.pem; }
- この時、
ssl on
と書かない。書くと80に対してもsslをonしてしまうから。
その他、SSL関連はserverディレクティブに対して以下ができる。
- 使用するSSLのバージョンを指定できる
- 書き方:ssl_protocols SSLv3 TLSv1;
- 暗号スイート: 複数の暗号技術の組み合わせを指定できる。
- 書き方:ssl_ciphers HIGH:!aNULL:!MD5;
- 暗号スイート利用時、サーバーが使いたい暗号スイートを優先して使う
- 書き方:ssl_prefer_server_ciphers on;
- SSLセッションキャッシュ(サーバー負荷を減らす)を指定できる
- 書き方:ssl_session_cache shared:SSL:10m;
(キャッシュサイズ10M)
- 書き方:ssl_session_timeout 10m;
(タイムアウト10分)
オレオレ証明書とは
要するに 「認証」も自分が担当するという事.
用語
- .csr: 認証局に署名をリクエストする為のファイル(証明書署名要求CSR: Certificate Signing Request)
- 中にはSignature Algorithm(確かにこれは私が要求(または発行)するファイルです)が書かれているSignature Algorithm: sha1WithRSAEncryption
- 確認するにはcsrファイルをテキストとして開く。例:$ openssl req -text < server.csr
- .crt: サーバー証明書。飛んできたcsrに対して、自身が持ってる秘密鍵で署名してcrtを発行し、要求者に返す
- .key: 秘密鍵。認証局が持ってる。オレオレの場合は自分が持ってる
- Let's Encrypt: 無料でサーバー証明書発行してくれる所
- 証明書有効期限は90日だが、多くはレンタルサーバーなどが自動更新してくれる
csrファイル内には Signature Algorithmが1つ(要求者のサイン) crtファイル内には 2つ、(要求者 + その要求に対して発行者のサイン) 書かれている。 crtにはIssuer(どの認証局が署名したか)が書かれている(オレオレの場合はsubjectと同じ内容が入る)
証明書発行の手順
- 秘密鍵(server.key)をgenerateする
さくらVPSでLet's Encryptを設定
設定を進められるように、一応先にさくら側のfirewallの443接続を許可しておく
Let's Encryptから証明書得る為に使うtool
certbot-auto
をDLする- curlやって
$ curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
-o
はファイルとして保存、の意味- curlとwgetは何が違うのか。基本一緒だけどoptionが違う
- chmodしておく
$ chmod 700 /usr/bin/certbot-auto
- curlやって
- DLした
certbot-auto
を使って、Let's Encryptに証明書を作成してもらう$ sudo certbot-auto certonly --webroot -w /var/www/html/195cm.tokyo -d 195cm.tokyo --email sadaka556@gmail.com
- 規約に同意するか?の質問が来る。agree.
- IMPORTANT NOTES: Congratulations! になれば処理完了
ls -l /etc/letsencrypt/live/
以下にpemファイルができているはず- 一般ユーザーでログインしてる時、この
/etc/letsencrypt/live/
にcdしようとして$ sudo cd /etc/letsencrypt/live/
しようとしてもできない。- sudoは一回きりrootで実行するコマンドで、cdは「移動」なので、権限必要なフォルダに移動する時は、移動後もroot権限でないといけないから、実質できないという事。その時は
$ su -
とかする。
- sudoは一回きりrootで実行するコマンドで、cdは「移動」なので、権限必要なフォルダに移動する時は、移動後もroot権限でないといけないから、実質できないという事。その時は
- 一般ユーザーでログインしてる時、この
- pemファイルがあるのを確認したら、sites-available のファイルを編集する
$ sudo vi /etc/nginx/sites-available/195cm.tokyo
- 編集後 reload
$ systemctl reload nginx
- ブラウザ確認、OK。
- 期限が3ヶ月後になってるのが分かる
- しかし、この処理後、
http://195cm.tokyo
にアクセスするとhttp://www.195cm.tokyo
というようにwww付きにリダイレクトされるようになった。 - 443からのアクセスしか受け付けなくなったからだろうか、80も追加してみる。
- 80追加後、
http://195cm.tokyo
にアクセスしてもhttp://www.195cm.tokyo
へリダイレクトされなくなった。 - この時、まだSSL設定していない
www.195cm.tokyo
にhttpsでアクセスするとどうなるかhttps://www.195cm.tokyo
https://195cm.tokyo
に転送された 設定が存在しなければうまい具合に処理してくれるのかな。 (※追記: 一番上のserverディレクティブの内容が実行されるっぽい)
- 編集後 reload
オレオレ証明書を作る
Let's Encryptってオレオレじゃないよね??
非SSL :http://195cm.tokyo SSL : https://www.195cm.tokyo オレオレSSL : https://www1.195cm.tokyo
としたい。が、すでにhttps://195cm.tokyo
でLet's EncryptでSSL発行してしまった。
Let's EncryptのSSLを失効させる
なので/etc/nginx/sites-available/
の設定をコメントアウトするが、その後もアクセスできてしまうことがたまにあるので、気持ち悪いから完全に証明書失効させてみる。
- revoke で失効させられるみたい
$ certbot-auto revoke --cert-path=/etc/letsencrypt/archive/195cm.tokyo/cert1.pem
- 他にも、
fullchain1.pem
やprivkey1.pem
も同様にrevokeして、最後$ certbot-auto delete -d 195cm.tokyo
しないといけないと思ったが、最初のコマンド1つで全部やってくれたっぽい。 - これで証明書は失効した(と思う)
- 他にも、
このあと、www.195cm.tokyo
の方で、Let's EncryptのSSL取り直した。が、、、
- https://www.195cm.tokyo
でつなげるようにはできたが、、
- http://www.195cm.tokyo
でつなぐと、195cm.tokyo
の方のページが表示されてしまう、、
- 行き場がないアクセスは`/etc/nginx/sites-available/`内の一番上にあるserverディレクティブの内容が効くっぽい
- `www.195cm.tokyo`を、httpsしか受けない設定にしている状態で、`http://www.195cm.tokyo`にアクセスすると、一番上に書いているserverディレクティブのrootである`/var/www/html/www1.195cm.tokyo`が読まれた
やっとここからオレオレ証明書作成
オレオレSSLのURL : https://www1.195cm.tokyo
秘密鍵や証明書リクエストなどはどこのフォルダにいれるのか。
とりあえず、例にあるようにetc
配下に入れた
$ openssl genrsa 2048 > /etc/nginx/conf.d/ssl.key/server.key $ openssl req -new -key /etc/nginx/conf.d/ssl.key/server.key > /etc/nginx/conf.d/ssl.csr/server.csr $ openssl x509 -days 3650 -req -signkey /etc/nginx/conf.d/ssl.key/server.key < /etc/nginx/conf.d/ssl.csr/server.csr > /etc/nginx/conf.d/ssl.crt/server.crt
そして
/etc/nginx/sites-available/
の該当箇所に以下を記述するがエラー書き方変わった?以下のようにするとエラー消えた(ssl_certificate の所)
- オレオレSSL URL : `https://www1.195cm.tokyo`にブラウザでアクセスすると、、 - **この証明書は有効ではありません。**( **ホスト名が一致しません**) と表示された。
- **全く偽装できてないではないか**。これであってるのかな? - あ、自分のmacに[avast](https://www.avast.co.jp/free-mac-security)いれてた。これを停止して再度アクセスしてみる。 - **自己署名ルート証明書**。**この証明書は第三者によって検証されていません**。と表示された。ちょっとは偽装できた?
以上で完了。