キーマテリアル作成
はじめに
ITで安全な通信を行うために,「秘密鍵」と「証明書」を組み合わせた「デジタル署名」が使われています。「証明書」の中に「署名」や「公開鍵」が含まれています。大まかには,次の流れでデータ送受信を行います。
- 送信者は秘密鍵を使ってデータを暗号化し,それに証明書を添付して,送信する。
- 受信者は証明書の中にある署名などを検証し,正当な送信者であるかどうかを確認してから,公開鍵を使ってデータを復号化する。なお,受信者は証明書を検証する際に,証明書の正当性や失効有無を証明局(CA)のrepositoryに問い合わせる。
ここでは,CentOS7でOpenSSLを使って,Hyperledger Fabric CA 1.3.0向けのキー・マテリアル(秘密鍵,CSR,証明書)を作成する方法を紹介します。
証明書発行の体制
- 最上位のCAがルートCAであり,その下に多数の中間CAがある
- ルートCAの一つとして,「Digital Signature Trust Co.」がある
- 中間CAから,Webサーバ向けや,中間CA向けのサーバ証明書を発行する
関連用語
- 証明局(CA = Certificate Authority)
- 証明書を発行する機関
- 最上位がルートCAであり,中間CAに移譲され,中間CAから証明書を発行することが多い
- CAの他に,登録局(RA),リポジトリがあるが,ここではまとめてCAと表記
- 証明書(Certificate)
- CAの署名,サーバの署名,公開鍵などで構成されるファイル
- 暗号化したデータを送信する時に,証明書を添付する
- 同じ秘密鍵からは、同じ公開鍵を含むCSRが作られるので、一度,証明書を発行してもらったら,同じ秘密鍵から再度CSRを作らないこと
- 秘密鍵(Private Key)
- データを暗号化するために使う
- 公開鍵(Public Key)
- データを復号化するために使う
- CSR
- CAに証明書を発行してもらうために必要な署名要求(Certificate Signing Request)
- CSRファイルには,公開鍵や運営者の情報(組織名や組織の所在地など)が含まれる
- キー・マテリアル
- 秘密鍵,CSR,証明書など,デジタル証明に必要なものをまとめて,キーマテリアルと呼ぶ
- CRL
- 証明書失効リスト
- 秘密鍵が漏洩・失念された場合,CAに申請すれば失効リストに登録される
作業ディレクトリを作成
$ mkdir keys
$ cd keys
利用可能な曲線を確認
$ openssl ecparam -list_curves
ECC秘密鍵を作成
$ openssl ecparam -name prime256v1 -genkey -out private.pem
秘密鍵が破損していないことの確認
$ openssl ecparam -check -noout -in private.pem
CSRを作成
$ openssl req -new -sha256 \
-key private.pem \
-out csr.pem \
-subj "/C=JP/ST=Tokyo/L=Ota-ku/O=Example Company/OU=Example Service/CN=xxx.example.com"
CSR内容確認
$ openssl req -text -noout -in csr.pem
CA構築
ルートCAの環境を構築する。
$ sudo touch /etc/pki/CA/index.txt
$ sudo su
# sudo echo '1000' > /etc/pki/CA/serial
$ exit
$ openssl ecparam -name prime256v1 -genkey -out cakey.pem
$ openssl req -new -x509 -sha256 -extensions v3_ca \
-key cakey.pem \
-out cacert.pem \
-days 1095 \
-subj "/C=JP/ST=Tokyo/L=Bunkyo-ku/O=UTokyo/OU=ZTokyo CA/CN=ZTokyo CA"
$ sudo mv -f cakey.pem /etc/pki/CA/private/
$ sudo mv -f cacert.pem /etc/pki/CA/
CSRに署名し、証明書を作成(オレオレ署名)
「openssl.cnfの設定項目」に説明があるが、/etc/pki/tls/openssl.cnfのpolicy_matchサブセクションは、デフォルトでcountryName、stateOrProvinceName、organizationNameの3つが「match」となっている。つまり、条件が厳しく、同じ国、同じ都市、同じ組織でなければ、証明書を発行できない。
policy_matchサブセクションだと証明書を発行できないので、「-policy policy_anything」オプションを指定して、緩い条件で証明書を発行する。
$ sudo openssl ca -extensions v3_ca -policy policy_anything \
-in csr.pem \
-out cert.pem
$ sudo chown $USER:$USER cert.pem
find /etc/pki/CA/ | sed -e "s/[^-][^\/]*\// |/g" -e "s/|([^ ])/|-\1/"
証明書の内容を確認
$ openssl x509 -text -noout -in cert.pem
公開鍵のモジュラスを確認
- ECDSAなら「Wrong Algorithm type」が出力される
$ openssl x509 -modulus -noout -in csr.pem
Modulus=Wrong Algorithm type
あとで勉強すること
-
CA 構築のための OpenSSL の設定
- openssl.confの説明あり
- opensslによるWebサーバの証明書のチェック