モジュールの電子署名 #1 – 電子証明書と電子署名

今年(2021年)に入り、今までモジュールの電子署名に使用していたタイムスタンプサーバーが使えなくなりました。タイムスタンプサーバーの切り替えの投稿をしようとしましたが、まずは、モジュールの電子署名についての投稿です。

モジュールの電子署名

モジュールの電子署名とは、モジュールファイル(ソフトウェア)に対して電子署名することをさします。コードサイニングとも呼ばれます。

Windowsでは、かなり昔から、モジュールファイルに対して電子署名をすること(コード署名)が利用されてきました。

コード署名の導入当初は、モジュールファイルとは実行ファイルぐらいでした。しかし、現在ではモジュールへの電子署名の利用範囲が広がっており、代表的な署名対象は下記のものがあります。

  • 実行ファイル(exe/com/dll/ax/ocx/cpl/sysなど)
  • 構成ファイル(catなど)
  • スクリプトファイル(ps1/psm1/ps1xml/vbs/js/vbe/jseなど)
  • デスクトップアプリ インストーラー ファイル(msi/msp/mstなど)
  • アプリ パッケージ ファイル(appx/appxbundle/msixなど)
  • ライブラリー パッケージ ファイル(nupkgなど)

モジュールに電子署名をすると、以下の点が明確になります。

  • モジュールの作成者(署名者)
  • モジュールの作成時(署名時)からモジュールが改変されていないこと

モジュールの作成者

作成者がわかることは、セキュリティの面からも重要です。

作成者がわからない(信頼できない作成者の)モジュールファイルをWindows PCにインストールしたり、実行したりすることは、ウィルスに感染することにもつながるためです。モジュールを利用するユーザーは、ソフトウェアを実行するかどうかの判断材料として作成者の情報を利用できます。

モジュールの改ざん検出

モジュールが改変されていないことがわかることもセキュリティやアプリの正常動作の面で重要です。

ファイルが壊れていると、それを使ってインストールしたり、実行したりしたときの正常動作は期待できません。また、ファイルが偶然壊れたのではなく、悪意のある改ざんの場合は、マルウェア(malware、不正かつ有害に動作させる意図で作成された悪意のあるソフトウェアや悪質なコードの総称でコンピュータウイルスやワームなどが含まれます)の混入なども考えられます。

モジュールの改ざん検出ができるとこれらを防ぐことができます。

電子証明書と電子署名

「電子証明書(デジタル証明書)」と「電子署名(デジタル署名)」は、同じ意味ではなく、異なる意味を表わし、別の用語です。

しかし、電子証明書と電子署名を混同することが多いため、まずは、「電子証明書」と「電子署名」について説明します。

電子証明書

電子証明書は、インターネットや電子の世界で持ち主の情報を正しく証明する電子データです。現実世界におけるパスポートや印鑑証明書のような「身分証明書」です。

電子証明書には、その利用用途が定義されており、一例をあげると以下の用途があります。

  • WEBサーバー用証明書 (SSLサーバー証明書、ウェブサイトの所有者の情報、送信データの暗号化)
  • デバイス用証明書 (デバイスに対する証明書、ユーザが正規の利用者であることを認証)
  • 電子メール用証明書 (S/MIME用証明書、電子メール用の送信主の身元保証やメールの暗号化・改ざんを防止)
  • ソフトウェア用証明書 (コードサイニング証明書、身元保証・暗号化・改ざんを防止)
  • 電子文書用証明書 (身元保証・暗号化・改ざんを防止)

などがあります。

SSLサーバー証明書は、主にWEBブラウザーなどでサーバーとWEBブラウザー間の暗号化通信(httpsなど)に使われます。それ以外の証明書も身元保証・暗号化・改ざんを防止などを目的として利用されます。

「ソフトウェア用証明書」が、コードサイニング証明書といわれるもので、モジュールに電子署名するために使われます。

電子証明書は、PKI(公開鍵基盤)の仕組みが利用されているため、身分情報以外に公開鍵と秘密鍵を含みます。電子証明書の身分情報部分と公開鍵は一般公開する情報です。しかし、秘密鍵の部分は、本人しか知りえない情報として扱う必要があり、公開してはいけません。電子証明書を入手したときは、秘密鍵は、厳重管理する必要があります。秘密鍵が漏れた場合、秘密鍵を入手した人が対応する証明書を使って署名をできることになり、なりすましなどの問題が発生します。

電子署名

電子署名は、身分を証明された人がした電子的な署名です。紙文書におけるサインや印鑑の押印に相当するものです。電子文書・ソフトウェアに電子署名を行うことで間違いなくその文書・ソフトウェアが署名者本人が作成(もしくは、モジュールを確認して署名)したものであることと、署名時点から内容が改ざんされていないことを証明します。

電子署名では、身分を証明するために、電子証明書(秘密鍵付)を使います。電子証明書に含まれる秘密鍵を使って、文書・ソフトウェアに電子署名します。そのため、電子署名には電子証明書が必須です。

電子署名を検証するときは、公開されている電子証明書(秘密鍵は含まない、公開鍵のみ)を使います。

コードサイニング用電子証明書

モジュールへ署名する用途の電子証明書(コードサイニング電子証明書)は電子証明書発行業者から購入します。電子証明書発行業者は、パブリックな認証局(CA:Certification Authority)となります。

パブリックな認証局の役割の一つは有効な電子証明書を発行することであり、申請者の身元を確認し、電子証明書を発行する機関となります。

電子証明書は、その証明書の単独では有効性を判断できません。有効性を正しく判断できるように複数の電子証明書間で証明書チェーンが構成されています。

例えば、3階層の証明書チェーンであれば、

ルート証明書 → 中間証明書 → コードサイニング証明書

の形で証明書チェーンが構成されます。購入したコードサイニング証明書のルート証明書はWindowsにあらかじめインストールされています。

Windowsにあらかじめインストールされているルート証明書への証明書チェーンが構成されていることが、有効な証明書として判定されるための条件です。

パブリックな認証局から購入する証明書は、Windowsにインストールされているルート証明書(発行局証明書)に対して証明書チェーンが構成されています。そのため、すべてのWindows上で有効な証明書として扱われます。

パブリックな認証局から購入せず、そのPCでのみ有効な証明書を作成することもできます。いわゆる自己署名証明書(オレオレ証明書)です。

しかし、自己署名証明書(オレオレ証明書)では、証明書チェーンが「自己署名証明書のみ」の1階層となります。ルート証明書に相当する部分が自身の証明書になります。そのような自己署名証明書(パブリックな認証局のルート証明書をのぞく)は、Windowsにルート証明書としてインストールされていることはなく、Windowsは有効な証明書として認識しません。

なお、その証明書を、ルート証明書として、手動でWindowsにインストールすれば、有効な証明書として認識されます。ただし、ルート証明書として手動でインストールしたWindowsでのみ有効として判断されるだけで、すべてのWindowsで有効として判断されることはありません。

コード署名は、他のPCで電子署名が有効であると判断されることを目的としてモジュールに電子署名をします。そのたため、自己署名証明書では意味がありません。

パブリックな認証局のルート証明書も、自己署名証明書です。これら証明書は、マイクロソフトが承認したものはWindowsのルート証明書としてすべてのWindowsにインストールされています。

コードサイニング用電子証明書の入手先

コードサイニング証明書は、セクティゴ(旧社名COMODO)DegiCertGlobalSignなどの認証局からから購入できます。

例として3つの認証局の2021年1月時点での例を挙げます。

有効年数セクティゴ(旧社名COMODO)DigiCertGlobalSign
1年間21,000円90,000円57,000円
2年間39,000円162,000円108,000円
3年間58,000円252,000円156,000円
4年間76,200円
5年間94,200円
発行対象法人・個人事業主・個人法人法人
コードサイニング証明書の価格例(2021年1月時点)

認証局は上記の3つ以外にもたくさんあります。ここでは、私が使っているCOMODOと、代表的なDigiCert、GlobalSignを挙げました。

この表を見てわかるように、認証局によって、コードサイニング証明書の発行価格に違いがあります。

個人事業主や個人によるコードサイニング証明書の入手

ところで、個人事業主や個人がコードサイニング証明書を購入することはできるのでしょうか?

答えは「購入でる」です。

コードサイニング証明書を扱っている認証局は数多くありますが、多くの認証局は、発行先を法人に限定しています。しかし、よく探すと、個人事業主や個人にコードサイニング証明書を発行している認証局は存在します。

上記の表にあげた3つの認証局では、セクティゴ(旧社名COMODO)が、個人事業主や個人にもコードサイニング証明書を発行しています。もちろん、発行してもらうためには、身分証明書などを提出する必要があります。さら探せば、セクティゴ(旧社名COMODO)以外にもあるかもしれません。

セクティゴ(旧社名COMODO)のコードサイニング証明書の価格は、代表的な認証局よりも安めです。個人事業主や個人がコードサイニング証明書を入手したい場合は、購入先としてセクティゴ(旧社名COMODO)を検討してもよいと思います。

コードサイニング証明書の種類

コードサイニング証明書の種類には2種類あります。

  • コードサイニング証明書
  • コードサイニングEV証明書

の2種類です。前者の「コードサイニング証明書」は、従来からあるコードサイニング証明書です。後者の「コードサイニングEV証明書」は、近年、追加された種類のコードサイニング証明書です。「コードサイニングEV証明書」は、EV証明書が利用されます。近年では、SSLサーバー証明書でもEV証明書が使われるようになりましたが、それと同様です。

SSLサーバー証明書における通常証明書とEV証明書

通常の証明書

従来からあるSSLサーバー証明書では、ドメイン名やIPアドレスに対して電子証明書を発行します。電子証明書を発行するにあたり、ドメインの所有者であることのチェックはされていましたが、所有者や運営者が具体的に誰であるかはチェックされていませんでした。そのため、電子証明書には、ドメイン名は保存されていますが、ドメインの運営者情報は保存されていません。

EV証明書

SSLサーバーEV証明書でも、ドメイン名やIPアドレスに対して電子証明書を発行します。しかし、電子証明書を発行するにあたり、ドメインの所有者であることのチェックだけでなく、所有者が具体的に誰であるかのチェックもしてから発行されます。電子証明書には、ドメインの運営者情報も保存されています。

コードサイニング証明書における通常証明書とEV証明書

通常の証明書

従来からあるコードサイニング証明書では、法人や個人事業主や個人に対して電子証明書を発行します。証明書を発行するにあたり、法人や個人事業主や個人の身分、および、実在することが、現実世界の身分証明書と電話によるコールバックなどで厳密にチェックされます。電子証明書には、法人や個人事業主や個人の名前だけでなく、所在地などの情報も保存されています。

発行にあたって、発行先の身分や実在することがチェックされることから分かるように、SSLサーバー証明書の通常の証明書より、発行基準が厳しいです。SSLサーバー証明書のEV証明書に近い発行基準にとなります。

通常の証明書の場合、証明書の秘密鍵は、通常はファイル(または準ずる手段)として提供されるため、バックアップを取ることや、複数のPCにインストールすることが可能です。

通常の証明書の場合、法人だけでなく、個人事業主や個人にも発行している認証局があります。

EV証明書

コードサイニングのEV証明書では、法人や個人事業主に対して電子証明書を発行します。個人に対しては、発行されないようです。証明書を発行するにあたり、法人や個人事業主の身分、および、実在することが、現実世界の身分証明書と電話によるコールバックなどで厳密にチェックされます。電子証明書には、法人や個人の名前だけでなく、所在地・管轄・組織形態などの情報も保存されています。

EV証明書の場合、証明書の秘密鍵は、ファイルとしては提供されず、ハードウェアトークンに書き込まれ、提供されます。そのため、証明書の秘密鍵のバックアップを取ることや、複数のPCにインストールすることはできません。署名作業をするPCにハードウェアトークンを接続して利用します。

コードサイニング証明書の通常証明書とEV証明書のWindows上での挙動の違い

通常の証明書もEV証明書もコード署名に利用する証明書として利用できます。二つの種類の証明書を使ったコード署名で、Windows上では挙動の違いはあるのでしょうか?

答えは「あります」になります。

大きく影響するのは、Windowsのスマートスクリーン(Microsoft Defender SmartScreen)の機能に対してです。

Microsoft Defender SmartScreen

SmartScreenは、Internet Explorer8以降またはWindows8・Windows RT以降にてソフトウェアの信頼性を評価するシステムです。この評価システムの内容にしたがって、評価が確立されていないソフトウェアをダウンロードする場合、または、インストールする場合、または、実行する場合に、警告またはブロックし、ユーザを危険性の高いソフトウェアから守ります。

EV証明書を利用して署名されたソフトウェアは、発行元の評価が確立していない場合でもSmartScreenにブロックされなくなります。

通常の証明書を利用して署名されたソフトウェアは、評価システムによって、評価が確立するまでは、警告が表示されます。

Windowsのバージョンによって警告の具体的な表示内容は異なりますが、Windows 10 1803では、以下のような表示がされます。 

Windows Defender SmartScreenの詳細表示

EV証明書を使った署名であれば、この画面が表示されることはありません。

なお、この警告が表示された場合の対処方法は、本サイトの記事が参考になります。

当サイト(nishy software)でのコード署名の利用状況

nishy softwareが作成し、公開しているソフトウェアは例外なくnishy softwareのコードサイニング証明書で電子署名しています。

対象は、当サイトで配布しているソフトウェアだけでなく、nuget.org、github、Microsoft storeなどで公開しているソフトウェアやパッケージを含みます。

具体的にはnishy softwareで作成した以下のモジュールなどです。

  • インストーラー(msi/exeなど)
  • インストーラーがインストールするモジュール(exe/dllなど)
  • zipファイルに含まれているモジュール(exe/dllなど)
  • nugetパッケージファイル(nupkg)
  • nugetパッケージに含まれているモジュール(exe/dllなど)

nishy softwareが作成し、提供するモジュールを入手し、利用する場合は、モジュールが改ざんされていないかを電子署名で確認することができます。


以上、今回は、Windowsにおけるコード署名に関する投稿でした。

“モジュールの電子署名 #1 – 電子証明書と電子署名” への2件の返信

コメントを残す