Main Logo
hero-background.jpg

OpenSSLでクライアント証明書を設定する方法(Ubuntu/Nginx対応)

openssl,nginxで証明書必須SSL対応ウェブページの公開

OpenSSLとNginxでCA/サーバー/クライアント証明書を発行し、HTTPS有効化とクライアント証明書必須ページの公開までを手順で解説。


opensslでクライアント証明書作成方法。

今回はopensslを使用SSL化、client証明書の作成、SSL(この接続ではプライバシーが保護されません)の対策をしていきます。

以下のように自己証明書の「この接続ではプライバシーが保護されません」の対策

openssl-crt-authority-error

クライアント証明書の必須ページ作成

openssl-crt-cr-require openssl-crt-certificate-need

2つを実装していきます。

環境

  • Ubuntu 22.04.5 LTS
  • nginx/1.18.0
  • OpenSSL 3.0.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証明書の作成

まず、大元の認証局(CA)の秘密鍵と自己署名証明書を作成します。

KEYファイル作成
openssl genrsa -aes256 -out ca.key 4096

CAの秘密鍵を生成します。-out ca.key で出力ファイル名を指定

CRTファイル作成
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

CAの自己署名証明書を作成します。-days 3650 で有効期間を10年に設定、-out ca.crt で出力ファイル名を指定します。 パスワードを聞かれるので、設定してください。

このCA証明書はサーバー証明書とクライアント証明書の両方に使用されます。

サーバー証明書の作成

次に、サーバー用(nginxSSL用)の秘密鍵と証明書署名要求(CSR)、そしてCAによって署名されたサーバー証明書を作成します。

KEYファイル作成
openssl genrsa -out server.key 2048
CSRファイル作成
openssl req -new -key server.key -out server.csr

サーバーの証明書署名要求(CSR)を作成します。-new で新しい証明書要求を作成し、-key server.key で使用する秘密鍵を指定、-out server.csr で出力ファイル名を指定します。

extfileの作成

追加ファイル

エクストラファイルext crtファイルに追加の情報を与えるファイルです。 以下をコピペしserver.extファイルを作成し、DNS.1 のドメイン名を適切に設定してください。

server.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = domain.name.com
alt_names

alt_namesはドメイン、ipを記入してください。
複数ある場合は以下のように記入します。

[alt_names]
DNS.1 = your_domain.com
DNS.2 = www.your_domain.com
IP.1 = 192.168.1.100
CRTファイル作成

次に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によって署名されたクライアント証明書を作成します。

KEYファイル作成
openssl genrsa -out client.key 2048

クライアントの秘密鍵を生成します。

CSRファイル作成
openssl req -new -key client.key -out client.csr

クライアントの証明書署名要求(CSR)を作成します。

CRTファイル作成
openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt

CAによってクライアント証明書に署名します。-days 3650 で有効期間を10年に設定します。

12形式にエクスポート
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12

クライアント証明書と秘密鍵をPKCS#12形式にエクスポートします。これは、ブラウザなどでクライアント証明書をインポートする際に一般的に使用される形式です。-out client.p12 で出力ファイル名を指定します。 

パスワード設定:クライアント証明書インポート時に入力を求められます。(任意)

NginxでのSSL設定

作成したサーバー証明書と秘密鍵を使用して、NginxでSSL/TLSを有効にします。

nginx.conf
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にダウンロードしてください。

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

openssl-crt-authority-error

このエラーは信頼されていないCAのためエラーが発生します。そのため、CA.crtをPCにインポートすれば解決します。

テストの際

テスト時はブラウザのシークレットモードでテストしてください。

対策方法

windows PCではca.crtファイルをインポートします。ca.crtをダブルクリックすればインポート画面が表示されます。

openssl-crt-import-ca1 openssl-crt-import-ca2 openssl-crt-import-ca3

ブラウザで開くと赤いマークが消えています。

openssl-crt-import-ca-end

クライアント証明書が必須なウェブページ

次にクライアント証明書の設定をしていきます。 client.p12のca.crtと同じようにインポートします。

ca.crtと違う点はインポート先で個人を選んでください。

openssl-crt-import-client1 openssl-crt-import-client2 openssl-crt-import-client3 openssl-crt-import-client4

まとめ

opensslで3つの証明書の発行を行い。ssl設定とクライアント証明書が必要なウェブページの作成を行いました。オレオレ証明書だけでは解決できない。厄介な「この接続ではプライバシーが保護されていません」を回避できるので、個人や、企業内部だけのsslページの作成はcaを作ることで楽にアクセス可能になります。

関連記事

コメントを読み込み中...