コード署名の信頼性

コード署名とは
何ですか?

コード署名とは

ソフトウェアのバイナリまたはファイルにデジタル署名を付与するプロセスのことをコード署名と言います。このデジタル署名により、ソフトウェアの作成者または発行者の本人性が検証され、ファイルが署名後に変更または改ざんされていないことが保証されます。コード署名は、ソフトウェアを受領した人へコードが信頼できるものであるというお墨付きを与えるものであり、悪意をもってシステムやデータを危殆化しようとする企てに対抗する上で極めて重要な役割を果たします。

コード署名のユースケースは、社内/社外で使用するソフトウェア、パッチや修正プログラム、テスト、IoT デバイスの製品開発、コンピューティング環境、モバイルアプリなどです。コード署名はコードとソフトウェアだけでなく、アプリケーション、ファームウェア、ファイル、メッセージ、XML、スクリプト、コンテナ、イメージなどにも適用されます。

コード署名の仕組みはどうなっているのですか?

コード署名には、他の PKI (公開鍵基盤)テクノロジーと同じように、公開鍵/秘密鍵ペア、CA(認証局)、電子証明書が関与します。ソフトウェアの発行者は、ソフトウェアに署名する際、そのソフトウェア、コード署名証明書、デジタル署名を含むバインドパッケージを作成します。コード署名証明書には、発行者の ID および公開鍵のほか、ID が CA によって検証済みであることを裏付ける CA の署名が含まれています。デジタル署名とは、発行者の秘密鍵で署名されたハッシュ値です。ソフトウェアが配布されると、ユーザーエージェントは証明書の有効性と完全性をチェック(ソフトウェアが署名後に改ざんされていないかを判定)します。ユーザーエージェントは証明書に含まれている公開鍵を使用して、デジタル署名からハッシュ値を取り出します。そして、デジタル署名のハッシュ値を、ソフトウェアから計算したばかりのハッシュ値と比較します。ハッシュ値が一致すれば、ソフトウェアが改ざんされていないことがお客様またはユーザーに証明されます。秘密鍵の管理は、コード署名において重要なセキュリティ要素です。鍵が盗まれたり、管理が不適切だったりすると、サイバー犯罪者はその鍵を使って悪意あるコードに署名し、開発者または客先のシステムにアップデートとして配布できてしまいます。

コード署名はなぜ必要なのですか?

コード署名は、マルウェアの拡散を防ぐため、Java、Microsoft などの主要なソフトウェアプラットフォームで必須になっています。また、改ざんされたコード、あるいは不明な発行元のコードがお客様またはユーザーにダウンロードされないようにするためのセキュリティのベストプラクティスでもあります。コード署名は、あなたの組織が実際に発行したコードまたはソフトウェアと、あなたの組織が発行したかのように見せかけてパッケージ化されたコードを判別します。さらに、ソフトウェアが一般に公開された場合、ソフトウェアが署名されていなければ、ユーザーにセキュリティ警告ラベルが表示されることもあります。社内で使用するために設計開発されるコードの場合、コード署名は説明責任と管理性を高めます。

どのような種類のソフトウェアに署名できますか?

あらゆる種類のバイナリまたはファイルに署名できます。例を以下に挙げます。

• Web サイトからダウンロード可能なソフトウェアアプリケーション

• 社内向け IT アプリケーション

• モバイルアプリケーション

• XML ファイル

• スクリプト

• ソフトウェアイメージ

• コンテナ

• ドライバおよびユーティリティ

• ファームウェア

コード署名を行うにはどのような手順が必要ですか?

まず、ソフトウェア発行者が公開鍵/秘密鍵ペアを生成します。そして、証明書署名要求(CSR)を公開鍵ともに認証局(CA)に提出してコード署名証明書を取得します。CA は発行者の身元を確認し、CSR を認証します。認証に成功すると、CA はコード署名証明書を発行します。この証明書には、発行者の ID、公開鍵、CA の署名が含まれます。この CA の署名は重要です。証明書の持ち主の身元について信頼できる第三者が太鼓判を押しているようなものだからです。コード署名証明書は、発行者の本人性だけでなく、ソフトウェアの完全性の裏付けにもなります。ソフトウェアの発行者は、ソフトウェアに署名する際、そのソフトウェア、コード署名証明書、デジタル署名を含むバインドパッケージを作成します。

このデジタル署名には、以下の手順も必要になります。 

  1. ハッシュアルゴリズムを用いて、ハッシュ値(ソフトウェア固有の暗号表現)を生成します。
  2. 発行者の秘密鍵と署名アルゴリズムを使用してハッシュ値に署名します。

コード署名は、手作業で行うことも、継続的インテグレーション/継続的デリバリー(CI/CD)プロセスなどのソフトウェア開発ライフサイクルの一部として自動化することもできます。