オレオレ証明書とnginx

オレオレ証明書は使っていいのか?

  • 暗号化されてるの?
    • 暗号化はされている。しかし、通信相手が、秘密を守ってくれる相手(攻撃者ではない)であることが前提。
  • 使っていいの?
    • 相手の断定は難しい(実在証明が難しい)が使いますか?の答えが答え。

Docker操作とnginx設定

事前確認
docker container run -d -p 8080:80 --name nginx nginx
docker  exec -it  xxxxxxxxxxxxxx /bin/bash
exit
docker stop xxxxxxxxxxxxxx

docker  exec -it  nginx /bin/bash  -c 'ls -1 /etc/nginx/conf.d/*'
docker  exec -it  nginx /bin/bash  -c 'nginx -v'

docker-compose.yml

cat <<'EOF' > docker-compose.yml
version: "3"
services:
  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "8080:80"
      - "8081:443"
    volumes:
      - ./:/etc/nginx/conf.d
EOF

default.conf

cat <<'EOF' > default.conf
server {
    listen 443 ssl;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    
    #ssl on;
    ssl_certificate_key /etc/nginx/conf.d/server.key; # private key
    ssl_certificate     /etc/nginx/conf.d/server.crt; # ore-ore crt
}

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
EOF

docker up

docker compose up -d

curl http://localhost:8080
curl https://localhost:8081

docker restart

docker compose restart

docker down

docker compose down

オレオレ証明書(CRT(SSLサーバー証明書))を作成する。

秘密鍵CSR(証明書署名要求)、CRT(SSLサーバー証明書)作成

秘密鍵を作成した上で、

自分の秘密鍵を用いて証明書署名要求(CSR: Certificate Signing Request)を作成します。

# @ サーバー

# 秘密鍵:pem鍵の保存形式
openssl genrsa -out server.key 2048

# CSR(証明書署名要求):証明書署名リクエスト 証明書持ち主の情報が含まれています。例えば、ドメイン名、国、メールアドレスなど
# 秘密鍵から作成するため本人しか作れない
openssl req -new -key server.key -out server.csr

次に、第三者にお墨付きをもらう。ここでは自分でお墨付きをつけるため、オレオレ証明書となる。

サーバの管理者が発行した証明書署名要求(CSR)に対して、認証局(CA)がCAの秘密鍵で署名を行ったものが証明書(CRT)です。

# @ 認証局

# CRT(SSLサーバー証明書):証明書
# →自分で作ったので、自己署名証明書(オレオレ証明書)
openssl x509 -days 3650 -req -signkey server.key -in server.csr -out server.crt

ブラウザ(curl)でアクセスすると、Webサーバー側が、自己署名証明書(オレオレ証明書)を使用しているため以下出力される。危険性を理解して、閲覧することも可能。

curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

警告無視も可能

curl -k https://localhost:8081

本格的にオレオレ認証局を作成し、オレオレ認証局がサーバの証明書に署名する手順を紹介します。オレオレ認証局ルート証明書をクライアントにインストールすることでブラウザが警告なしでアクセスすることができるようになります。

一旦ここまで。

オレオレ認証局作成と、オレオレ認証局ルート証明書をクライアントにインストールするのは、参考にしたサイトで、実施しているので、とほほのOpenSSL入門 - とほほのWWW入門を参照する。

ちなみに続きは

@認証局
@Webサーバー
  • サーバーの秘密鍵を作成、サーバーのCSR証明書署名要求の作成
@認証局
  • openssl caコマンドを使って、[サーバーのCSR証明書署名要求]を取り込んで、署名する。WebサーバーのCRT署名証明書を作ってあげる。
@Webサーバ
@ブラウザ
  • オレオレ認証局の証明書.pem の拡張子を.cerに変更し、ブラウザに取り込む:これで警告なしでアクセス可能となる。
    • 持っている証明書と、Webサーバーからダウンロードしてきた証明書が同じか?→同じであれば、本人と判断。お墨付きをもらっているか確認。秘密鍵から作成しているので、本人以外あり得ない。

警告が出るのはどういうことか?

ブラウザ視点

ブラウザが持っている認証局の公開鍵を使って電子署名を復号し、デジタル証明書のハッシュ値を計算したものと比較する。別の人の秘密鍵を使って作成したので、合致しない。お墨付きが無い、知らない人のものであるとわかり、安全性を担保できないため、警告画面が出る。通信は暗号化されている。通信する相手が、攻撃者かもしれない。

オレオレ証明書について

相手の断定は難しい(実在証明が難しい)、受け入れてしまうことで、教育面でも、いろいろ問題が起こる。

結論として、第三者のお墨付きが必要。ブラウザと別経路で、証明書を取り入れ、検証することが必要。

ref.

Env.

~/  docker  exec -it  nginx /bin/bash  -c 'nginx -v'
nginx version: nginx/1.25.5
~/ 