nginx でオレオレ証明書を持っている人だけにアクセス制限をする。しかも警告を出さない

スポンサーリンク

先日nginx でオレオレ証明書を持っている人だけにアクセス制限をする on Docker

ってぇ記事を書いたんだが、これだと、

この接続ではプライバシーが保護されません

ってぇ画面が表示されてしまっていた↓

これを回避したい。

つまり、以下の2点を両方満たしたものを用意する。

  • 用意したクライアント証明書をインストールした端末のみがアクセスできる(アクセス制限
  • オレオレ証明書(自己署名証明書)だけど、Webブラウザでアクセスした際に警告が出ない。信頼された証明書として扱われる

 

 

手順の概要

以下の2つの記事を両方実施する。

 

 

  • 用意したクライアント証明書をインストールした端末のみがアクセスできる(アクセス制限
  • オレオレ証明書(自己署名証明書)だけど、Webブラウザでアクセスした際に警告が出ない。信頼された証明書として扱われる
    • これの手順がGist

 

自分が行った手順

ほぼ、上記2記事のコピペです。

 

前準備

cd /etc/nginx/

クライアント証明書用フォルダ作成

mkdir client_certificates

サーバー証明書用フォルダ作成

mkdir server_certificates

 

用意したクライアント証明書をインストールした端末のみがアクセスできる(アクセス制限) やり方

クライアント証明書用フォルダへ

cd /etc/nginx/client_certificates/

 

1-1. CAの鍵を作成

openssl genrsa -des3 -out ca.key 4096

 

1-2. CA 証明書を作成

openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

 

2-1. クライアント証明書用の鍵

openssl genrsa -des3 -out user.key 4096

 

2-2. 署名

openssl req -new -key user.key -out user.csr

Please enter the following ‘extra’ attributes ~
から始まる、

  • Password
  • company name

は、空でいい。

 

 

2-2. CSRを署名

(証明書の作成)

※Organization Name は 1-2 手順で設定した、モノとは異なるものにする

openssl x509 -req -days 3650 -in user.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out user.crt

 

2-3. PKCS #12 (PFX)の作成

openssl pkcs12 -export -out user.pfx -inkey user.key -in user.crt -certfile ca.crt

 

PFXを自分のWindows PCにインストールする。

Qiitaのやり方

の通りにやって、できた。

 

オレオレ証明書(自己署名証明書)だけど、Webブラウザでアクセスした際に警告が出ない。信頼された証明書として扱われる やり方

サーバー証明書用フォルダへ移動

cd /etc/nginx/server_certificates/

 

 

サーバー用の秘密鍵を作成する

openssl genrsa -out localhost.key 2048

 

CAに向けた証明書署名要求を作成する。

openssl req -new -key localhost.key -out localhost.csr

DN/パスコードは適当に設定しておく。

 

 

自己署名サーバー証明書を作成

openssl x509 -days 3650 -in localhost.csr -out oreore.crt -req -signkey localhost.key

 

自己署名サーバー証明書をp12、pemに変換

openssl pkcs12 -export -inkey localhost.key -in oreore.crt -out oreore.p12
openssl pkcs12 -in oreore.p12 -out oreore.pem

 

CA証明書の秘密鍵を作成する

openssl pkcs12 -in oreore.p12 -nodes -out oreore-ca.key -nocerts

 

CA証明書、CA秘密鍵、証明書署名要求を用いてサーバー証明書を作成する

openssl x509 -req -in localhost.csr -CA oreore.pem -CAkey oreore-ca.key -CAcreateserial -out oreore.crt -days 3650 -sha256 -extensions SAN -extfile <(printf "
[SAN]
subjectAltName=@alt_names
basicConstraints=CA:FALSE
[alt_names]
DNS.1=localhost
IP.1=172.24.0.2
IP.2=127.0.0.1")


ここで、’172.24.0.2′ の部分は設置するサーバーのIPアドレスである。 localhostと127.0.0.1もサーバーローカルからの確認用に追加しておく。

 

証明書の内容を確認する

openssl x509 -in oreore.crt -text -noout

ここで以下のセクションが出ていることを確認。

X509v3 extensions:
    X509v3 Subject Alternative Name:
        DNS:localhost, IP Address:172.24.0.2, IP Address:127.0.0.1

 


httpsサーバー側ではここで作成したlocalhost.keyとoreore.crtを組み込む。 後は、このoreore.crtをクライアント端末に信用させればよい。

 

crtをクライアント端末に信用させる(インストール|インポート)する Windowsの場合

oreore.crtをクライアント端末に信用させればよい。

とあるが、具体的に行った手順。

 

  1. サーバーから「oreore.crt」をダウンロードしてくる
    1. 今回の場合、dockerで構築したnginxで作業したので以下のコマンドでダウンロードした。
      1. docker cp nginx:/etc/nginx/client_certificates/ca.crt .

  1. Windowsマシンで、「oreore.crt」をダブルクリックする

 

 

  1. 「証明書のインストール(I)…」を選択する

 

  1. 「保存場所」が、「現在のユーザー(C)」になっていることを確認
  2. 「次へ(N)」を選択

 

 

  1. 「証明書をすべて次のストアに配置する(P)」のラジをボタンを選択する
  2. 「証明書ストア:」で、「参照(R)…」を選択する

  1. 「信頼されたルート証明機関」を選択する
  2. 「OK」を選択する

 

 

  1. 「証明書ストア:」の内容が「信頼されたルート証明機関」になっていることを確認する
  2. 「次へ(N)」を選択する

  1. 「完了(F)」を選択する

  1. 自分が用意した証明書であることを確認し「はい(Y)」を選択する

 

 

 

  1. 「OK」を選択する
  2. もう一個の画面も「OK」を選択する

 

 

nginxの設定ファイル

上記の通り。

ssl_client_certificate "/etc/nginx/client_certificates/ca.crt";

この一箇所は、クライアント証明書を指定。(Qiitaの記事で作成したやつ)

 

ssl_certificate "/etc/nginx/server_certificates/oreore.crt";
ssl_certificate_key "/etc/nginx/server_certificates/localhost.key";

この二箇所は、サーバー証明書を指定。(Gistの記事で作成したやつ)

 

 

nginxの再起動

 

ここでなぜかdockerのnginxコンテナで行った場合、nginxが落ちてしまう(どっか設定に不具合あるかも?)。

その為、再度nginxコンテナを起動させて、さらにnginxコンテナの中に入ってnginxサービスを起動させる。

あたくしの場合、docker-compose で管理してたので、以下で起動。(Dockerホストで実施)

 

docker-compose nginx up -d

 

コンテナへ潜入

docker-compose exec nginx bash

docker-composeじゃなく、dockerの場合、以下で。

docker exec -it nginx bash

 

nginxサービス起動(コンテナ内で実施)

service nginx start

 

pfxファイルをローカルのWindowsへコピー(Dockerホストで実施)

(dockerは、WSL2内で起動させております)

docker cp nginx:/etc/nginx/client_certificates/user.pfx .

わからんかった部分のメモ

 

証明書要求とは

  • CSRのこと。
    • CSRとは
      • CSRとは、サーバ証明書を発行するための署名要求(Certificate Signing Request)
        https://jp.globalsign.com/support/ssl/certificates/about-csr.html

        • CSRの内容
          • 公開鍵
          • ディスティングイッシュネーム
            • 組織名や組織の所在地などの情報
        • CSRの目的
          • 認証局に証明書を要求するために必要な材料

 

 

CAとは

認証局のこと。

世界の信頼できる認証局の情報がWindowsなどにはデフォルトでインストールされている。

今回はオレオレ証明書発行したので、自分で認証局を作った形。

オレオレ証明書をPCに信頼させるには2通りのやり方がある。

 

  • 自分で作った証明書をPCに信頼させる
  • 自分で作った認証局をPCに信頼させる
    • 以後、自分で作った認証局で署名された(発行された)証明書は自分のPCで信頼されるようになる

 

PFXとは

PKCS#12は、多くの暗号化オブジェクトを1つのファイルとして保存するためのアーカイブファイル形式

 

x509とは

公開鍵証明書の標準フォーマット

 

des3とは

暗号化方式

 

SANとは

「Subject Alternative Name」の略称で、「サブジェクトの別名」という意味です。
 

 

x509.v3のsubjectAltName拡張を用いてIPをホスト名の代わりに使用し、任意のIPアドレスに立てたサーバーを真正なものとして扱えるようにする。

さっきのGist記事

 

 

 

 

コメント