自己署名証明書を使ってHTTPSでNginxWebサーバにアクセスしてみる
なぜか仕事でオレオレ証明書を作って適用させないといけなくなったので、
手順メモがてらに
1. Nginx準備
nginx インストール
# dnf install -y nginx
証明書用ディレクトリ作成
# mkdir /etc/nginx/ssl
# cd /etc/nginx/ssl
2. SSL証明書準備
SSL 秘密鍵(.key)作成
# openssl genrsa 2048 > server.key
証明書署名要求(.csr)作成
※CSR : Certificate Signing Request
# openssl req -new -key server.key -out /etc/nginx/tls/server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:sbtkzks@gamil.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
テキトーに入力します。
全部空でもたぶん大丈夫
(オレオレ)証明書(.crt)作成
# openssl x509 -days 3650 -req -signkey server.key -in server.csr -out server.crt
Nginxでは server.key と server.crt を設定ファイルに読み込ませることになります。
3. 再びNginx設定
# vi /etc/nginx/conf.d/ssl.conf
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
}
- 設定反映
# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# nginx -s reload
4. サーバにアクセスしてみる
https://[serverのIPアドレス]
にアクセス!
↑アドレスバーのびっくりマークをクリック
証明書が無効といわれてますね
↑詳細をクリック
伏せちゃってますが、発行者と発行先が同じ(=自分で署名してる)で、有効期限も先ほど設定した3650日になってます
SSLの適用自体はできているといっていいでしょう
↑「詳細設定」から無理やりアクセスを試みます
Nginxデフォルトのページが出たので一応OK
これにて確認完了です
5. 軽く整理
クライアントがサーバにアクセスする際、つまり、ブラウザで特定のWebページにアクセスしようとするとき、
クライアントがアクセスしようとしているページと、実際のアクセス先のページが一致している
必要がありますよね
例えば、Amazonで買い物しようとしてAmazonのページ開いたら、それはAmazonが提供するAmazonのEcサイトでないといけない
わけですね
何を当たり前のことを って感じがしますが、
これがもしかすると、Amazonにそっくり似せて作られたフィッシングサイトである可能性もある
わけですね
そんなとき、このWebページ(を提供するサーバ)が、本当にそのページの管理者が提供しているものですよと証明するのがサーバ証明書
ですね
ではどうやって証明書が正しいかを検証するのかというと、
ブラウザにインストールされているroot証明書の中に
アクセス先のサーバの証明書発行者が入っている
必要があります
root証明書というのは基本的にPCやスマホの生産時にすでにインストールされた状態で販売されているようです
認証局はこのroot証明書に含まれています
適当にいろんなページで証明書詳細ページを見てみると、
いろいろな証明書認証局が確認できます。(DigiCert , Rapid SSL, Amazon,,,)
上記の証明書詳細画面で、発行者が認証局です
今回オレオレ発行したので、発行者がopensslコマンドを実行したサーバのホスト名になってるかと思います。
もちろん、自分のサーバがroot認証局リストに含まれているはずもなく
このサイトが安全ではないと認識されたわけですね
6. 次のステップ
Let's Encrypt の Certbot は無料でサーバ証明書を発行してくれます
自動更新の手順なども調べたらいくらでも出てくるので
そのうちやってみようと思います