はじめに
目的
証明書には、「SSL/TLS証明書」と「コードサイニング証明書」があります。
(厳密にはもっと沢山の種類の証明書があると思われる。)
「SSL/TLS証明書」はHTTPSなどの通信に使用されます。「コードサイニング証明書」はソフトウェアなどのデジタル署名に使用されます。
ここで疑問に思ったのが、「SSL/TLS証明書」でソフトウェアに署名できるのか?ということです。
証明書含めPKI(公開鍵暗号基盤)は「X.509」という標準仕様で定義されているらしい。
ということで、「X.509」で「SSL/TLS証明書」と「コードサイニング証明書」の仕様や要件がちゃんと決まっているならば、「SSL/TLS証明書」でソフトウェアに署名は出来ない気がする。
しかし、デジタル署名というのは対象(この場合はソフトウェア)のハッシュ値を秘密鍵で暗号化したものなので、そんな要件が厳しくなさそうで、「SSL/TLS証明書」でソフトウェアに署名することも出来なくはない気がする。
実際にやってみる
ドメインとSSL/TLS証明書の取得
ドメインは0円で購入しました、「SSL/TLS証明書」は「Let's Encrypt」で取得しました。
以下は「Let's Encrypt」で取得したファイルの一覧です。
# ls -l /etc/letsencrypt/live/www.ssltlstest2.xyz total 4 lrwxrwxrwx. 1 root root 43 Feb 17 11:00 cert.pem -> ../../archive/www.ssltlstest2.xyz/cert1.pem lrwxrwxrwx. 1 root root 44 Feb 17 11:00 chain.pem -> ../../archive/www.ssltlstest2.xyz/chain1.pem lrwxrwxrwx. 1 root root 48 Feb 17 11:00 fullchain.pem -> ../../archive/www.ssltlstest2.xyz/fullchain1.pem lrwxrwxrwx. 1 root root 46 Feb 17 11:00 privkey.pem -> ../../archive/www.ssltlstest2.xyz/privkey1.pem
結果と考察
結果
「条件を満たす証明書がない( No certificates were found that met all the given criteria.)」と表示され、署名を付与することはできませんでした。また、「After EKU filter, 0 certs were left.」とあるので、「拡張キー使用法(Extend Key Usage)」のチェックで、証明書が条件を満たしていないと判断されたみたいです。
考察
ざっと調べた感じだと、証明書には「キー使用法(Key Usage)」と「拡張キー使用法(Extended Key Usage)」という項目があるらしい。
左は今回取得した「SSL/TLS証明書」で、「キー使用法=Digital Signature, Key Encipherment (a0)」「拡張キー使用法=サーバー認証 (1.3.6.1.5.5.7.3.1)/クライアント認証 (1.3.6.1.5.5.7.3.2)」となっている。
右はChromeのデジタル署名に使われているGoogleの「コードサイニング証明書」で、「キー使用法=Digital Signature (80)」「拡張キー使用法=コード署名 (1.3.6.1.5.5.7.3.3)」となっている
ということで、「証明書は使用方法が限定されている(認証局が指定している)」と理解しました。
X.509の「キー使用法(Key Usage)」「拡張キー使用法(Extended Key Usage)」の記載は以下の通り。
- キー使用法(Key Usage):https://www.rfc-editor.org/rfc/rfc5280#section-4.2.1.3
- 拡張キー使用法(Extended Key Usage):https://www.rfc-editor.org/rfc/rfc5280#section-4.2.1.12