それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Let'Encrypt発行証明書を使って中間CAを作るとどうなるのか。

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は歴史的経緯で残ってるだけで使えるものではないのだけれど