自己署名でクライアント証明書を作成する方法
サーバ用の証明書はLet's Encryptで無料作成することができるので良いのですが、クライアント用の証明書は作成することができません。
ですので、自己署名でクライアント証明書を作成する手順の説明をします。(オレオレ証明書)
また、作成したクライアント証明書をwebブラウザに登録できるようにするため、PKCS#12形式に変換する方法についても説明していきます。
今回は下記の環境で証明書を作成しています。
$ cat /etc/issue Ubuntu 20.04.6 LTS \n \l $ openssl version OpenSSL 1.1.1f 31 Mar 2020
作業工程
- 1.プライベートCA(認証局)秘密鍵・証明書作成
-
クライアント証明書の認証を行うために必要なCA(認証局)用の秘密鍵と証明書を下記の名前で作成します。
- CA用秘密鍵 ca.key
- CA用証明書 ca.crt
- 2.クライアント用秘密鍵・証明書署名要求(CSR)作成
-
クライアント証明書用の秘密鍵と証明書署名要求(CSR)を下記の名前で作成します。
- クライアント用秘密鍵 client.key
- クライアント用証明書署名要求(CSR) client.csr
- 3.クライアント用証明書作成
-
CA用の秘密鍵と証明書を使って、クライアント用の証明書署名要求(CSR)に署名を行いクライアント用証明書を下記の名前で作成します。
クライアント側でwebブラウザに登録できるようにクライアント証明書をPKCS#12形式に変換します。
- ライアント証明書 client.crt
- クライアント証明書をPKCS#12形式に変換 client.pfx
プライベートCA(認証局)秘密鍵・証明書作成
CA用の秘密鍵を作成し、そこからCA用証明書を作成していきます。
CA用秘密鍵作成
CA用秘密鍵をRSA4096bitのアルゴリズムで作成します。
$ openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:4096 -out ca.key
秘密鍵にパスレーズを設定したい場合
秘密鍵にパスフレーズを設定したい場合は、-aes-128-cbcといったように暗号化形式を設定することで設定することができます。
設定したパスフレーズは、CA用証明書の作成やクライアント用CSRに署名する際に入力する必要があるので、絶対に忘れないようにしてください。
秘密鍵へのパスレーズ再設定はできないので、パスフレーズを忘れてしまうと再作成するしかなくなります。
$ openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:4096 -aes-128-cbc -out ca.key Enter PEM pass phrase: #パスレーズを入力 Verifying - Enter PEM pass phrase: #パスフレーズを再入力
CA用証明書作成
作成したCA用秘密鍵を使用してCA用証明書を作成します。
証明書の有効期限を-daysで3650に指定していまが、期間を変更したい場合は値を適宜変更して下さい。
$ openssl req -new -x509 -key ca.key -days 3650 -out ca.crt
コマンドを実行すると以下の質問があるので適宜設定を行ってください。
- Country Name (2 letter code) [AU]:国名を2文字で入力 日本はJP
- State or Province Name (full name) [Some-State]:都道府県を英字入力
- Locality Name (eg, city) []:市区町村を英字入力
- Organization Name (eg, company) [Internet Widgits Pty Ltd]:組織名を英字入力
- Organizational Unit Name (eg, section) []:部署名を英字入力
- Common Name (e.g. server FQDN or YOUR name) []:コモンネーム
- Email Address []:省略可
Common Nameについて
Common NameにはプライベートCA用の証明書であることがわかる名前を設定するのが良いと思います。
作成例
私が実際に設定したときの作業ログです。
$ openssl req -new -x509 -key ca.key -days 3650 -out ca.crt 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]:Tokyo Locality Name (eg, city) []:Chiyoda Organization Name (eg, company) [Internet Widgits Pty Ltd]:server-memo.net Organizational Unit Name (eg, section) []:CA Common Name (e.g. server FQDN or YOUR name) []:CA server-memo.net Email Address []:
クライアント用秘密鍵・証明書署名要求(CSR)作成
クライアント用秘密鍵を作成し、それを使用して証明書署名要求(CSR)の作成を行います。
クライアント用秘密鍵
クライアント用の秘密鍵を作成します。
$ openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:4096 -out client.key
秘密鍵にパスフレーズを設定したい場合
CA用秘密鍵作成で説明したのと同様に、-aes-128-cbcといったように暗号化形式を設定することで、パスフレーズを設定することができます。
$ openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:4096 -aes-128-cbc -out client.key
設定したパスフレーズは、クライアント用CSRや証明書をPKCS#12形式に変換する際に入力する必要があるので、絶対に忘れないようにしてください。
クライアント用証明書署名要求(CSR)作成
証明書署名要求(CSR)を作成します。
作成したCSRにCAの秘密鍵と証明書を使って署名することで、クライアント用の証明書を作成することができます。
$ openssl req -new -key client.key -out client.csr
CA用の証明書を作成した際と同様に、以下の質問をされるので適宜設定してください。
- Country Name (2 letter code) [AU]:国名を2文字で入力 日本はJP
- State or Province Name (full name) [Some-State]:都道府県を英字入力
- Locality Name (eg, city) []:市区町村を英字入力
- Organization Name (eg, company) [Internet Widgits Pty Ltd]:組織名を英字入力
- Organizational Unit Name (eg, section) []:任意 部署名を英字入力
- Common Name (e.g. server FQDN or YOUR name) []:コモンネーム
- Email Address []:任意 省略可
- A challenge password 任意 設定の必要なし
- An optional company name 任意 設定の必要なし
Common Nameについて
クライアント証明書用のCommon Nameには、証明書の発行先がわかる名前を設定するのが良いでしょう。
具体的には個人名とか、部門・部署名を設定します。
※ちなみに、SSL/TLSサーバ証明書として使用する場合はサーバのホスト名をFQDN形式で設定します。
作成例
実際の作成例です。
Organizational Unit NameとCommon Nameですが、今回は自分自身だけが使用する予定なのでClientとしていますが、複数作成する場合は部署名や実際に証明書を使用する人の名前などにしておくと、証明書の管理がしやすくなります。
$ openssl req -new -key client.key -out 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]:Tokyo Locality Name (eg, city) []:Chiyoda Organization Name (eg, company) [Internet Widgits Pty Ltd]:server-memo.net Organizational Unit Name (eg, section) []:Client Common Name (e.g. server FQDN or YOUR name) []:Client Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
クライアント用証明書作成
証明書署名要求(CSR)にCAの秘密鍵と証明書を使用して署名し、クライアント用の証明書を作成します。
$ openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365
実際の作成例です。
$ openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365 Signature ok subject=C = JP, ST = Tokyo, L = Chiyoda, O = server-memo.net, OU = Client, CN = Client Getting CA Private Key
クライアント証明書をPKCS#12形式に変換
webブラウザにクライアント証明書を登録する場合には、作成した証明書をPKCS#12形式に変換します。
コマンドを実行すると、証明書に設定するパスワードを聞かれますので、好きなパスワードを設定してください。
ここで設定したパスワードは、クライアン側で証明書を登録する際に入力することになります。
何も入力せずにEnterキーを押下し続けると、パスワード無しになります。
$ openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt Enter Export Password: Verifying - Enter Export Password:
パスワードを忘れてしまった場合は、クライアント証明書を再度PKCS#12形式に変換することでパスワードを再設定できますので、再変換した証明書をクライアントに配布してあげてください。
Webブラウザへの登録方法
作成したPKCS#12形式の証明書をWebブラウザに登録する手順を、下記のページにまとめました。
秘密鍵のアルゴリズムでRSA形式以外を使用したい場合
秘密鍵を作成する際にRSA以外のアルゴリズムを使用したい場合は、-algorithmで別のアルゴリズムを指定してください。
ed25519を指定する場合は下記のようになります。
$ openssl genpkey -algorithm ed25519 -out ca.key
ed25519の秘密鍵で作成したPKCS#12形式の証明書はwebブラウザにインポートできませんでした
クライアント証明書用の秘密鍵を、ed25519のアルゴリズムで作成して作成した証明書は、PKCS#12形式に変換しwebブラウザでインポートしようとするとインポートすることができませんでした。
ちなみに、CA用の秘密鍵のアルゴリズムをed25519で作成しても、クライアント用の秘密鍵をRSAで作成すると問題なくインポートできました。
調べきれていないだけで、PKCS#12はed25519形式に対応していないという仕様なのでしょうか?
コメント
初心者なもので、基本的なところがわかっておりません。3点質問をさせてください。
1,自己認証SSL証明書を用いた場合、クライアントから呼び出すと「安全ではありません」の画面が表示されます。
クライアント証明書をブラウザにインポートすると、この画面が表示されなくなりますか?
2,クライアント端末が複数ある場合、1つのクライアント証明書を複数の端末にインポートしても良いのでしょうか?
3,その場合、クライアント証明書のcommon name は全端末共通の名前になると思いますが、それでも効力がありますか?
よろしくお願いいたします。
コメントありがとうございます。
ご質問いただいた件を回答させていただきます。
> 1,自己認証SSL証明書を用いた場合、クライアントから呼び出すと「安全ではありません」の画面が表示されます。
クライアント証明書をブラウザにインポートすると、この画面が表示されなくなりますか?
下記環境についてのご質問という認識で良いでしょうか?
・Webサーバを自己認証したSSL/TLS証明書でSSL化
・クライアント証明書でアクセス制限を実施
であれば、クライアント証明書をインポートしても警告の画面が表示され続けます。
警告画面を表示させたくないのであれば、下記サイトの情報がまとまっていて解りやすと思います。
https://pvision.jp/tech/2023/04/importing-self-signed-certificate-as-root-certificate/
> 2,クライアント端末が複数ある場合、1つのクライアント証明書を複数の端末にインポートしても良いのでしょうか?
インポート可能です。
> 3,その場合、クライアント証明書のcommon name は全端末共通の名前になると思いますが、それでも効力がありますか?
あります。
ですが、漏洩や紛失等の理由でクライアント証明書を無効化する必要があった場合、すべての端末に影響あるので注意して下さい。
以上、よろしくおねがいします。
tamahiko様
ご提示のサイトを参照し、自分らでも色々試しました。
サーバーにインポートした自己認証SSL証明書を、クライアントにもインポートすることで、警告が表示されなくなることを理解しました。
返答と詳細なご説明をいただき、ありがとうございました。
無事に警告が表示されなくなったようで何よりです!
コメントありがとうございます。