たれながし.info

とあるITエンジニアの備忘録

SSL/TLS証明書でソフトウェアに署名できるか試してみる

はじめに

目的

証明書には、「SSL/TLS証明書」と「コードサイニング証明書」があります。
(厳密にはもっと沢山の種類の証明書があると思われる。)

SSL/TLS証明書」はHTTPSなどの通信に使用されます。「コードサイニング証明書」はソフトウェアなどのデジタル署名に使用されます。

ここで疑問に思ったのが、SSL/TLS証明書」でソフトウェアに署名できるのか?ということです。

証明書含めPKI公開鍵暗号基盤)は「X.509」という標準仕様で定義されているらしい。
ということで、「X.509」で「SSL/TLS証明書」と「コードサイニング証明書」の仕様や要件がちゃんと決まっているならば、「SSL/TLS証明書」でソフトウェアに署名は出来ない気がする。
しかし、デジタル署名というのは対象(この場合はソフトウェア)のハッシュ値秘密鍵で暗号化したものなので、そんな要件が厳しくなさそうで、「SSL/TLS証明書」でソフトウェアに署名することも出来なくはない気がする。

ということで、「SSL/TLS証明書」を取得してソフトウェアにデジタル署名出来るのか?試してみる。

ちなみに

逆である、「コードサイニング証明書」を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


ソフトウェアへのデジタル署名

取得した証明書と秘密鍵を、OpenSSLで「PKCS#12(pfx)形式」に変換する

openssl pkcs12 -export -inkey privkey.pem -in cert.pem -out cert.pfx

Windows SDKに付属する「SignTool.exe」を使って
Windows標準の計算機(calc.exe)にデジタル署名の付与を試みました。

signtool.exe sign /f cert.pfx /fd SHA256 /debug calc.exe

結果と考察

結果

「条件を満たす証明書がない( 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)」の記載は以下の通り。