(2018.2) ページが長くなったので分割。
実際にルートCA, 中間CAを作ったりするのはこちら; 2 tierプライベート認証局を作る
公開鍵基盤 (PKI) は, 認証局をツリー状に考えて, 頂点の Root CA から「信頼の輪」を繋いでいきます。
Root CAとIssuing CAを分離すると、Issuing CAにセキュリティ上の欠陥があっても、そこだけ対処すればよい。
CAを2段にする "2 tier" CA Hierarchy と "3 tier" がある。
Infrastructure Saturday 2011 - Understanding PKI and Certificate Services
2 Tier CA Hierarchy:
3 Tier CA Hierarchy:
認証局は、証明書を発行したり、下位の認証局の信頼性を保証したり, ソフトウェア (プログラム) が改竄されていないことを保証したりします。いずれも、対象物に対して、認証局の秘密鍵で署名 (sign) することです。
正しい証明書 (certificate) は、信頼させたい公開鍵 (public key) に対して, 信頼できる認証局が自身の秘密鍵によって署名 (sign) したものです。ルート認証局の発行する「ルート証明書」は、特別に、ルート認証局の公開鍵を自身の秘密鍵で署名しています -- 自己署名証明書。
ルートCAの証明書、中間CAの証明書、目的の証明書、と段数が増えても、順にルート証明書に向かってたどることで、信頼できるか確認 (検証; verify) できます。
https://www.blubgoo.com/create-your-own-chain-of-trust/ [リンク切れ]
一方, オレオレ認証局は、信頼できない認証局です。「信頼できない」とは、信頼できるルート認証局まで信頼の輪 (Chain of Trust) をつなげることができない認証局です。
オレオレ認証局が発行する証明書は,「オレオレ証明書」と呼ばれたりします。その証明書を受け取った人は、検証 (認証パスを辿ること) ができません。
まぁ、現実世界ではたまに, ルート認証局がその運用の不備などによって「信頼できない」となって、大騒ぎになったりしますが。
(2018.2) この節追加.
Fedora 26 Linux だと, ca-certificates
パッケージに, ルート証明書のファイルがあります。
man 8 update-ca-trust で、内容の説明があります。
/etc/pki/ca-trust/extracted/
以下に、ルート証明書が格納されています.
過去との互換性のため, シンボリックリンクが張られています.
/etc/ssl/certs/
は, /etc/pki/tls/certs/
へのシンボリックリンクです。/etc/ssl/
はもはや古いです。
/etc/pki/
以下も, シンボリックリンクで互換性を取っています. これらを使って構いません。
ファイル名 | 実体 | |
---|---|---|
tls/certs/ca-bundle.crt
| ca-trust/extracted/pem/tls-ca-bundle.pem
| |
tls/certs/ca-bundle.trust.crt
| ca-trust/extracted/openssl/ca-bundle.trust.crt
| |
java/cacerts
| ca-trust/extracted/java/cacerts
| |
tls/cert.pem
| ca-trust/extracted/pem/tls-ca-bundle.pem
| これはもはや古い. |
/etc/pki/tls/misc/CA
スクリプト(2018.2) /etc/pki/tls/misc/CA
というファイルは, もはやありません. Fedora 26 Linux では, openssl-perl パッケージに分離され, /usr/bin/CA.pl
に移動しました。コマンドの挙動は最新のものに更新しました。
オプションを与えないと, そうでもない。/etc/pki/tls/openssl.cnf
ファイルが設定として使われます。CA.pl
にデフォルト値がハードコードされている。
名前が変わった. SSLEAY_CONFIG
環境変数"OPENSSL_CONFIG"
環境変数に自分の設定ファイルを与えて、挙動を変えます。ものすごく分かりにくい。
CA.plスクリプトのコマンド一覧を示す。詳しくは man 1 CA.pl
次のコマンドと同じ;
$OPENSSL req $OPENSSL_CONFIG -new -x509 -keyout newkey.pem -out newcert.pem \ -days 365
カレントディレクトリに作られる。newkey.pem
は秘密鍵、newcert.pem
は証明書。
できあがる証明書は次のようになっており、Root CAになる。
X509v3 Basic Constraints: critical CA:TRUE
オプションを何も与えないと, 何でもありの証明書で、実験用に使うようなものになる。本番では使えない。
新規に作る場合は, 内部では、2 steps で、自分あての証明書署名要求とそれに対する署名で, 証明書が作られる。
$OPENSSL req $OPENSSL_CONFIG -new -keyout ${CATOP}/private/cakey.pem \ -out ${CATOP}/careq.pem $OPENSSL ca $OPENSSL_CONFIG -create_serial -out ${CATOP}/cacert.pem -days 1095 \ -batch \ -keyfile ${CATOP}/private/cakey.pem -selfsign \ -extensions v3_ca \ -infiles ${CATOP}/careq.pem
ただし, {$CATOP}
は /etc/pki/CA
.
最終的に /etc/pki/CA/
以下に, 秘密鍵の PEM ファイル (private/cakey.pem
) と証明書ファイル (cacert.pem
) が作られる.
-extensions v3_ca オプションがミソで, /etc/pki/tls/openssl.cnf
ファイルの [v3_ca]
セクションの内容が利用される。
$OPENSSL ca $OPENSSL_CONFIG -policy policy_anything -out newcert.pem \ -infiles newreq.pem
opensslコマンドの -keyfile オプションが指定されていないため、CA の秘密鍵の場所は OPENSSL_CONFIG
環境変数で指定する。
署名され, 生成された証明書が newcert.pem
として出力される。
$OPENSSL ca $OPENSSL_CONFIG -policy policy_anything -out newcert.pem \ -extensions v3_ca -infiles newreq.pem
-signcertコマンドは, 署名要求 (CSR) の代わりに, 自己署名証明書を用いるもの。意味ないので, 使うことはない.
$OPENSSL req $OPENSSL_CONFIG -new -keyout newkey.pem -out newreq.pem -days 365
newkey.pem
) と, 証明書署名要求 (CSR) を作る。-newreq コマンドと違い, 秘密鍵のパスフレーズが設定されない。
次と同じ:
$OPENSSL req $OPENSSL_CONFIG -new -nodes -keyout newkey.pem -out newreq.pem \ -days 365
クライアント証明書を作るときに使う。証明書をもらってから -pkcs12 コマンドと組み合わせる。
.pfxファイルは, クライアント認証のために, クライアント側に秘密鍵・証明書ペアをインストールするために用いられる。
コード署名 (code signing) するためにストアに格納しておくためにも、いったん .pfxファイルにする。
引数として証明書の名前を与える. 省略したときは "My Certificate".
$ CA.pl -pkcs12 証明書の名前
次と同じ:
$OPENSSL pkcs12 -in newcert.pem -inkey newkey.pem -certfile ${CATOP}/cacert.pem \ -out newcert.p12 -export -name "$CNAME"
OPENSSL_CONFIG
環境変数は参照しない。
$OPENSSL ca $OPENSSL_CONFIG -gencrl -out ${CATOP}/crl/crl.pem
newcert.pem
を, 引数を与えたときはそれらのファイルを順次検証する.
次と同じ:
$OPENSSL verify -CAfile ${CATOP}/cacert.pem $file
OPENSSL_CONFIG
環境変数は参照しない。
試しに、先ほど作った自己署名証明書を検証してみる;
$ /etc/pki/tls/misc/CA -verify newcert.pem newcert.pem: C = XX, L = Default City, O = Default Company Ltd error 18 at 0 depth lookup:self signed certificate OK
error 18 ... X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: self signed certificate.
(2018.2)
証明書は, 用途を限定するようにします。詳しくは man 5 x509v3_config
RFC 5280 Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile
次のうち一つ以上を指定;
CA (Root CA, 中間CAいずれも) は, この値は critical
にすること。CAは, digitalSignature, keyCertSign, cRLSign
. 逆に, CA 以外では keyCertSign
または cRLSign
は含めてはいけない.
値 | bit |
---|---|
digitalSignature | 0 |
nonRepudiation | 1 |
keyEncipherment | 2 |
dataEncipherment | 3 |
keyAgreement | 4 |
keyCertSign | 5 |
cRLSign | 6 |
encipherOnly | 7 |
decipherOnly | 8 |
目的 (purpose) を記載. CA では指定しない。●そうでもないなー●●
Value | Meaning | |
---|---|---|
serverAuth | SSL/TLS Web Server Authentication. | |
clientAuth | SSL/TLS Web Client Authentication. | |
codeSigning | Code signing. | |
emailProtection | E-mail Protection (S/MIME). | |
timeStamping | Trusted Timestamping | |
OCSPSigning | OCSP Signing | ここまでRFC 5280 |
ipsecIKE | ipsec Internet Key Exchange | 1.3.6.1.5.5.7.3.17 RFC 4945 |
msCodeInd | Microsoft / Software Publishing / Individual Code Signing (authenticode) | 1.3.6.1.4.1.311.2.1.21 |
msCodeCom | Microsoft / Software Publishing / Commercial Code Signing (authenticode) | 1.3.6.1.4.1.311.2.1.22 |
msCTLSign | Microsoft / Crypto 2.0 / Trust List Signing | 1.3.6.1.4.1.311.10.3.1 |
msEFS | Microsoft / Crypto 2.0 / Encrypted File System | 1.3.6.1.4.1.311.10.3.4 |
See Object IDs associated with Microsoft cryptography
もはや古い. 使わない.
Netscape Cert Type (nsCertType) は, basicConstraints
, keyUsage
, Extended Key Usage (extendedKeyUsage
) で代替されている。
取れる値:
client, server, email, objsign, reserved, sslCA, emailCA, objCA