BASIC認証では不安なのでNginxでクライアント証明書を使った認証のやり方のメモ

NginxとOpenSSLが必要です。

Cloudflareを使用している場合は動かないので注意してください。

作成するファイル

  • ca.crt <– Nginxの設定に使う
  • ca.key
  • ca.csr
  • ca.srl
  • client.crt
  • client.csr
  • client.key
  • client.pfx <–クライアントにインストールするファイル

1. 作業ディレクトリの作成

適当なディレクトリを作成します。

rootユーザーで作業します。

cd /etc/nginx
mkdir client_cert
cd client_cert

2. CA

2-1. CAの鍵を作成

openssl genrsa 4096 > ca.key
[email protected]:/etc/nginx/client_cert# openssl genrsa 4096 > ca.key
Generating RSA private key, 4096 bit long modulus (2 primes)
.....................................................................++++
....................................................................................++++
e is 65537 (0x010001)

[email protected]:/etc/nginx/client_cert# ls
ca.key

2-2. CSRの作成

openssl req -new -key ca.key > ca.csr

Organization Nameは必ず設定します。

Common Nameは必ず空にします。

それ以外は任意で入力してください。

[email protected]:/etc/nginx/client_cert# openssl req -new -key ca.key > ca.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) [AU]:JP
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Server
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

[email protected]:/etc/nginx/client_cert# ls
ca.csr  ca.key

2-3. CAの証明書を作成

openssl x509 -days 3650 -req -signkey ca.key < ca.csr > ca.crt
[email protected]:/etc/nginx/client_cert# openssl x509 -days 3650 -req -signkey ca.key < ca.csr > ca.crt
Signature ok
subject=C = JP, ST = Some-State, O = Server
Getting Private key

[email protected]:/etc/nginx/client_cert# ls
ca.crt  ca.csr  ca.key

2-4. シリアル番号の設定

echo 01 > ca.srl

3. クライアント

3-1. クライアントの鍵を作成

openssl genrsa 4096 > client.key
[email protected]:/etc/nginx/client_cert# openssl genrsa 4096 > client.key
Generating RSA private key, 4096 bit long modulus (2 primes)
...................................................................................................++++
........................................................................................................................++++
e is 65537 (0x010001)

[email protected]:/etc/nginx/client_cert# ls
ca.crt  ca.csr  ca.key  ca.srl  client.key

3-2. CSRの作成

openssl req -new -key client.key > client.csr

Organization Name必ずCAと違うものを設定してください。

Common Nameは必ず空にします。

それ以外は任意で入力してください。

[email protected]:/etc/nginx/client_cert# openssl req -new -key client.key > client.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) [AU]:JP
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Client
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

[email protected]:/etc/nginx/client_cert# ls
ca.crt  ca.csr  ca.key  ca.srl  client.csr  client.key

3-3. CSRを署名

openssl x509 -req -days 3650 -CA ca.crt -CAkey ca.key < client.csr > client.crt
[email protected]:/etc/nginx/client_cert# openssl x509 -req -days 3650 -CA ca.crt -CAkey ca.key < client.csr > client.crt
Signature ok
subject=C = JP, ST = Some-State, O = Client
Getting CA Private Key

[email protected]:/etc/nginx/client_cert# ls
ca.crt  ca.csr  ca.key  ca.srl  client.crt  client.csr  client.key

4. PFXの作成

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

インポートする際に使うパスワードを求められますが空のままでも大丈夫です。

[email protected]:/etc/nginx/client_cert# openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt -certfile ca.crt
Enter Export Password:
Verifying - Enter Export Password:

[email protected]:/etc/nginx/client_cert# ls
ca.crt  ca.csr  ca.key  ca.srl  client.crt  client.csr  client.key  client.pfx

5. Nginxの設定

ssl_client_certificateca.crtを指定

ssl_verify_clientでクライアント証明書による認証を有効化

server {
        :
        ssl_verify_client on;
        ssl_client_certificate /etc/nginx/client_cert/ca.crt;
        :
}

Nginxを再起動して反映させます。

sudo systemctl restart nginx

これでアクセスした場合クライアントに証明書をインストールしていないので、400 Bad Requestが表示されます。

6. クライアントの設定

先ほど作成したclient.pfxを何らかの方法でクライアント側に転送し、インストールします。

クライアント証明書のインストール方法はOSやブラウザによって違うので省略します。

PKCS12形式の証明書をインポートする方法(Google Chrome)

PKCS12形式の証明書をインポートする方法(Mozilla Firefox)

4. PFXの作成でパスワードを設定した場合は、インポート時に求められるので入力します。

設定していない場合は空のまま進めます。

7. アクセスできることを確認する

アクセスすると次のような表示が出るのでインストールした証明書を選択すると、アクセスができます。

auth-cert