OpenSSLとNginxでCA/サーバー/クライアント証明書を発行し、HTTPS有効化とクライアント証明書必須ページの公開までを手順で解説。
今回はopensslを使用SSL化、client証明書の作成、SSL(この接続ではプライバシーが保護されません)の対策をしていきます。
以下のように自己証明書の「この接続ではプライバシーが保護されません」の対策
クライアント証明書の必須ページ作成
2つを実装していきます。
証明書の作成は3つあります。
ca、server,clientの3つをここでは作成します。
caは認証局、serverはnginxのSSL用、clientはクライアント証明書用です。
前の記事では自己証明書のため、 (この接続ではプライバシーが保護されません)を回避する方法が無いのですが,ブラウザでセキュリティー設定で可能ですが... ca,serverの2種類の証明書を作成することで回避することができます。また、caとclientを使うことでクライアント証明書が必須のウェブページを作成できます。
作成順番はCAをまず作成する必要がり、その後serverまたはclientを作成します。
crtファイル作成時は以下のように聞かれますが、common名のみ設定してあり、他はEnterで飛ばしています。
| Country Name | 国名 | 組織の国名 |
| State or Province Name | 組織所住所 | 「都道府県名」 |
| Locality Name | 市町村名 | 組織所住所 |
| Organization Name | 組織名 | 組織の名称 |
| Organizational Unit Name | 部署名 | 部署の名称 |
| Common Name | コモンネーム | 識別名 |
| Email Address | イーメールアドレス | 連絡先のメールアドレス |
| A challenge password | パスワード | 任意パスワード設定 |
| An optional company name | 会社名 | 任意会社名部署名の設定 |
crtファイル作成 crt作成時common名だけは分かりやすい名前を入れることを推奨します。 インポートしたcrtファイルがどれなのかが判断できるため、commonは入力することをお勧めします。
まず、大元の認証局(CA)の秘密鍵と自己署名証明書を作成します。
openssl genrsa -aes256 -out ca.key 4096
CAの秘密鍵を生成します。-out ca.key で出力ファイル名を指定
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
CAの自己署名証明書を作成します。-days 3650 で有効期間を10年に設定、-out ca.crt で出力ファイル名を指定します。
パスワードを聞かれるので、設定してください。
このCA証明書はサーバー証明書とクライアント証明書の両方に使用されます。
次に、サーバー用(nginxSSL用)の秘密鍵と証明書署名要求(CSR)、そしてCAによって署名されたサーバー証明書を作成します。
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
サーバーの証明書署名要求(CSR)を作成します。-new で新しい証明書要求を作成し、-key server.key で使用する秘密鍵を指定、-out server.csr で出力ファイル名を指定します。
エクストラファイルext crtファイルに追加の情報を与えるファイルです。 以下をコピペしserver.extファイルを作成し、DNS.1 のドメイン名を適切に設定してください。
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = domain.name.com
alt_namesはドメイン、ipを記入してください。
複数ある場合は以下のように記入します。
[alt_names]
DNS.1 = your_domain.com
DNS.2 = www.your_domain.com
IP.1 = 192.168.1.100
次にextファイルを引数に含めcrtファイルを作成します。
-extfile server.ext を追加することで、指定した拡張ファイルの内容が証明書に含まれます。
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650 -sha256 -extfile server.ext
最後に、クライアント用の秘密鍵と証明書署名要求(CSR)、そしてCAによって署名されたクライアント証明書を作成します。
openssl genrsa -out client.key 2048
クライアントの秘密鍵を生成します。
openssl req -new -key client.key -out client.csr
クライアントの証明書署名要求(CSR)を作成します。
openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
CAによってクライアント証明書に署名します。-days 3650 で有効期間を10年に設定します。
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
クライアント証明書と秘密鍵をPKCS#12形式にエクスポートします。これは、ブラウザなどでクライアント証明書をインポートする際に一般的に使用される形式です。-out client.p12 で出力ファイル名を指定します。
パスワード設定:クライアント証明書インポート時に入力を求められます。(任意)
作成したサーバー証明書と秘密鍵を使用して、NginxでSSL/TLSを有効にします。
server {
server_name domain_name.com;
listen 443 ssl;
ssl_certificate /etc/ssl/server.crt;
ssl_certificate_key /etc/ssl/server.key;
#以下はクライアント証明書の有効化
# ssl_client_certificate /etc/ssl/ca.crt;
# ssl_verify_client on;
location / {
root /var/www/html;
index index.html;
}
}
上記のserver_nameと server.crt,server.key,ca.crtは適切に設定してください。
サーバー設定終わり
上記のようにnginxを設定でserver側の設定が終わりました。 そのままでは、クライアント側でブラウザを開いてもエラーが出ます。クライアント側で証明書のインポートを行う必要がります。
次にPC側の設定を行います。 サーバー側で作成したca.crt、client.p12の2つをwindowsPCにダウンロードしてください。
このエラーは信頼されていないCAのためエラーが発生します。そのため、CA.crtをPCにインポートすれば解決します。
テスト時はブラウザのシークレットモードでテストしてください。
windows PCではca.crtファイルをインポートします。ca.crtをダブルクリックすればインポート画面が表示されます。
ブラウザで開くと赤いマークが消えています。
次にクライアント証明書の設定をしていきます。 client.p12のca.crtと同じようにインポートします。
ca.crtと違う点はインポート先で個人を選んでください。
opensslで3つの証明書の発行を行い。ssl設定とクライアント証明書が必要なウェブページの作成を行いました。オレオレ証明書だけでは解決できない。厄介な「この接続ではプライバシーが保護されていません」を回避できるので、個人や、企業内部だけのsslページの作成はcaを作ることで楽にアクセス可能になります。