先日nginx でオレオレ証明書を持っている人だけにアクセス制限をする on Docker
ってぇ記事を書いたんだが、これだと、
この接続ではプライバシーが保護されません
ってぇ画面が表示されてしまっていた↓
これを回避したい。
つまり、以下の2点を両方満たしたものを用意する。
- 用意したクライアント証明書をインストールした端末のみがアクセスできる(アクセス制限)
- オレオレ証明書(自己署名証明書)だけど、Webブラウザでアクセスした際に警告が出ない。信頼された証明書として扱われる
手順の概要
以下の2つの記事を両方実施する。
- 用意したクライアント証明書をインストールした端末のみがアクセスできる(アクセス制限)
- これの手順がQiita(先日の記事でも参照した)
- オレオレ証明書(自己署名証明書)だけど、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にインストールする。
の通りにやって、できた。
オレオレ証明書(自己署名証明書)だけど、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をクライアント端末に信用させればよい。
とあるが、具体的に行った手順。
- サーバーから「oreore.crt」をダウンロードしてくる
- 今回の場合、dockerで構築したnginxで作業したので以下のコマンドでダウンロードした。
- docker cp nginx:/etc/nginx/client_certificates/ca.crt .
- 今回の場合、dockerで構築したnginxで作業したので以下のコマンドでダウンロードした。
↓
- Windowsマシンで、「oreore.crt」をダブルクリックする
↓
- 「証明書のインストール(I)…」を選択する
↓
- 「保存場所」が、「現在のユーザー(C)」になっていることを確認
- 「次へ(N)」を選択
↓
- 「証明書をすべて次のストアに配置する(P)」のラジをボタンを選択する
- 「証明書ストア:」で、「参照(R)…」を選択する
↓
- 「信頼されたルート証明機関」を選択する
- 「OK」を選択する
↓
- 「証明書ストア:」の内容が「信頼されたルート証明機関」になっていることを確認する
- 「次へ(N)」を選択する
↓
- 「完了(F)」を選択する
↓
- 自分が用意した証明書であることを確認し「はい(Y)」を選択する
↓
- 「OK」を選択する
- もう一個の画面も「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の目的
- 認証局に証明書を要求するために必要な材料
- CSRの内容
- CSRとは、サーバ証明書を発行するための署名要求(Certificate Signing Request)
- CSRとは
CAとは
認証局のこと。
世界の信頼できる認証局の情報がWindowsなどにはデフォルトでインストールされている。
今回はオレオレ証明書発行したので、自分で認証局を作った形。
オレオレ証明書をPCに信頼させるには2通りのやり方がある。
- 自分で作った証明書をPCに信頼させる
- 自分で作った認証局をPCに信頼させる
- 以後、自分で作った認証局で署名された(発行された)証明書は自分のPCで信頼されるようになる
PFXとは
PKCS#12は、多くの暗号化オブジェクトを1つのファイルとして保存するためのアーカイブファイル形式
x509とは
公開鍵証明書の標準フォーマット
des3とは
暗号化方式
SANとは
「Subject Alternative Name」の略称で、「サブジェクトの別名」という意味です。
SANについて教えてください | GMOグローバルサイン サポート
x509.v3のsubjectAltName拡張を用いてIPをホスト名の代わりに使用し、任意のIPアドレスに立てたサーバーを真正なものとして扱えるようにする。
コメント