Let'Encrypt発行の証明書を使って中間CAを作るとどうなるのか。
Let'Encrypt発行の証明書は、次の用途に使える。
openssl x509 -purpose -noout < cert.pem Certificate purposes: SSL client : Yes SSL client CA : No SSL server : Yes SSL server CA : No Netscape SSL server : Yes Netscape SSL server CA : No S/MIME signing : No S/MIME signing CA : No S/MIME encryption : No S/MIME encryption CA : No CRL signing : No CRL signing CA : No Any Purpose : Yes Any Purpose CA : Yes OCSP helper : Yes OCSP helper CA : No Time Stamp signing : No Time Stamp signing CA : No
openssl x509 -purpose
で見る限りxxx CA no
が並んでいる。Any Purpose CA : Yes
がYESなので、ワンちゃん使えるかも?みたいな気持ちになって、試してみようと思う。*1
認証局を作る。
前回に中間CAを作ったりして証明書を作る手順は理解できたので、Let'Encryptの鍵と証明書で試してみることができる。
認証局のディレクトリを整える。
mkdir MyCA cd MyCA mkdir ./newcerts mkdir ./requests touch index.txt echo 00 > serial echo 00 > crlnumber
認証局用の設定を作る
cat /etc/ssl/openssl.cnf \ | sed -n '/\[ ca \]/,$p' \ | sed '/\[ tsa/,$d' \ | sed -e '/^keyUsage = nonRepudiation/s|^|# |' \ | sed -e '/keyUsage = cRLSign/s|^# ||' \ | sed -e 's|365|3600|' \ | sed -e 's|\./demoCA|\.|' \ > myCA.openssl.cnf
Let'Encryptから鍵と証明書を取り出す。
sudo cp /etc/letsencrypt/live/${DOMAIN}/privkey.pem ./ sudo cp /etc/letsencrypt/live/${DOMAIN}/cert.pem ./ sudo cp /etc/letsencrypt/live/${DOMAIN}/chain.pem ./ sudo chown takuya:takuya privkey.pem sudo chown takuya:takuya cert.pem sudo chown takuya:takuya chain.pem
証明書を発行する
任意の公開鍵を作り署名リクエストを作る。
openssl genrsa > server.priv.key openssl req -new \ -subj "/C=JP/ST=Kyoto/L=Kyoto City/O=acid/CN=raspi3.lan" \ -key server.priv.key \ > server.csr
Let'Encryptの秘密鍵で任意の証明書に署名する。
openssl ca -policy policy_anything \ -in server.csr \ -keyfile privkey.pem \ -cert cert.pem \ -config myCA.openssl.cnf
署名して出来た証明書を取り出す。
openssl x509 -text < newcerts/00.pem openssl x509 < newcerts/00.pem > server.crt.pem
検証のために証明書チェーンを作る。
cat cert.pem chain.pem > full.pem
検証する。
openssl verify -verbose -CAfile full.pem server.crt.pem
検証結果。
CN = xxxx.mydomain.com error 24 at 1 depth lookup: invalid CA certificate C = US, O = Let's Encrypt, CN = R3 error 25 at 2 depth lookup: path length constraint exceeded O = Digital Signature Trust Co., CN = DST Root CA X3 error 10 at 4 depth lookup: certificate has expired CN = xxxx.mydomain.com error 32 at 1 depth lookup: key usage does not include certificate signing error server.crt.pem: verification failed
こうなる。
key usage does not include certificate signing
利用不可の証明書が出来た
予想通りの結果でした。証明書を作成する手前でRejectされるかと思ったが、証明書の発行は出来ている。証明書を通用させようとして検証するとエラーになる。なるほどね。
使えないとわかった。
証明書自体は作れるが、証明書を利用時に検証されて、エラーになる。
SAN値にルーターのIPとか入れてローカルアドレスをHTTPS化できたら嬉しかったんだけど。無理なようです。残念。
参考資料
https://serverfault.com/questions/111625/openssl-x509-purpose-flag-any-purpose-what-is-this
The Any Purpose : Yes and Any Purpose CA : Yes lines from the openssl x509 -purpose are special. It is openssl specific and represents what the certificate will be validated for when used with ancient software versions that do not check for extensions.
certificate — OpenSSL x509目的フラグ「任意の目的」これは何ですか?
'「任意の目的」設定は、何でも通過させ、チェックをまったく実行しないものです。もともとは、他に選択肢がなく、結果に耐えられる場合に壊れた証明書を使用する方法としてそこに置かれていました...それ以来、「任意の目的」が設定されている場合でも、コードでCAチェックが必須になっています。したがって、実際にその証明書をCAとして使用しようとすると、拒否されます。
*1:といってもAny Purposeは歴史的経緯で残ってるだけで使えるものではないのだけれど