Windowsネイティブアプリにコードサイニング証明書をつける

[SENSYN ROBOTICS（センシンロボティクス） Advent Calendar 2019](https://qiita.com/advent-calendar/2019/sensyn-robotics) の 8日目 担当の @Chitama です。
センシンロボティクス という会社で Webやアプリを担当しています。


今回は、Windowsネイティブアプリで必要になるコードサイニング証明書の付与についてまとめてみました。

## 検証環境
- Windows 10
- Internet Explorer 11

# コードサイニング証明書とは
コードサイニング証明書 (Codesigning) とは、オンラインで配布するソフトやプログラムにコード署名をして、ソフトウェアの開発元/配布元を明確にさせることで、コンテンツの完全性を証明するためのものです。


### なぜ、コードサイニング証明書をつける必要があるのか？
こんな画面をみたことはありませんか？
<img width="300px" alt="trends" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91552/9b369ab8-1242-70e3-92d1-ddb7c250d7dc.png">
この機能は、[Microsoft SmartScreen](https://support.microsoft.com/ja-jp/help/17443/windows-internet-explorer-smartscreen-faq) というWindowsに最初から入っている標準セキュリティ機能で、Webからダウンロードしたアプリケーションの配布元が`わからないから危険かもしれないけど大丈夫？`という警告です。
この警告が表示される原因は主に次の2つです。

- 危険なサイトにアクセスしたり、危険なアプリケーションをインストールしようとしたりしている
- Webサイトやアプリケーションの安全性を調べるためのデータベースに接続できない

`危険なアプリケーション`と検知されないためにコードサインング証明書をアプリケーションにつけるわけです。

# 設定の流れ
1.コードサイニング証明書のタイプを選ぶ
 　　↓
2. コードサイニング証明書の会社を選ぶ
　　↓
3. コードサイニング証明書を購入する
　　↓
4. コードサイニング証明書を申請する
　　↓
5. コードサイニング証明書をアプリケーションに付与する


## 所要時間
今回選択したコモドジャパンでは、購入からアプリへの証明付与まで`1週間`ほどでできました。
ただし、会社の実在証明として帝国データバンクもしくは東京商工リサーチ（ダンレポ）の登録している場合です。

購入して、営業時間内であればすぐに申請方法のメールが届く。(1日)
申請して、申請受領のメールが届く。(2日~３日)
申請結果が届く。(2日~4日)

実際、水曜日の午後に申請して、次の週の水曜日の真夜中に申請通過のメールが届きました。
[参考：【徹底比較】帝国データバンクと東京商工リサーチは何が違う？どっちの情報が正しい？](https://tousan-lab.com/tips/tdb-tsr-difference/)

## 1. コードサイニング証明書のタイプを選ぶ
コードサイニング証明書には通常のコードサイニング証明書とEVコードサイニング証明書があります。

| 署名有無 | SmartScreen | 
|:-----:|:----|:----|
| 署名なし | 警告あり。 [詳細情報] から [実行] ボタンが表示できる |
| 通常コードサイニング | 警告あり。 [実行] ボタンの表示あり。 |
| EVコードサイニング | 初回から警告なし。ドライバーへの更新がある場合は必須。  |

今回は、次の理由で通常タイプとしました。

- ドライバーへの変更ない
- EVコード署名が高い（通常コードサイニングの約3倍）
- 通常コード署名でも10数回のダウンロード実績を稼げは警告が出なくなる

## 2. コードサイニング証明書の会社を選ぶ
今回は次の優先度で製品を選定しました。
① セキュリティレベル
② 価格
③ サポート体制
④ 実在確認の手間

複数の会社へ相見積や営業さんにヒアリングしたりした結果、 <font color="Crimson">価格によるセキュリティレベルに差はありません。</font>
一番安くて価格と日本語対応可能な[コモドジャパン](https://comodo.jp/products/codesign.html)に決めました。
申請後の実在確認としてコールバックと呼ばれる電話がかかってきます。
英語での電話対応は不安だったので日本語でのコールバックはポイントでした。


コモドジャパンのコードサイニングは次のような仕様です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91552/df628cc4-42ab-5d7b-0218-6760a0b06ab3.png)
[参照：コモドジャパン](https://comodo.jp/products/codesign.html)

ここで、`SmartScreen 即時解除` が非対応になっているので、疑問に思った方もいるかと思います。
`SmartScreenが非対応`ではなく、 `SmartScreenの即時解除が非対応`ということで、ファイルのダウンロード実績が少ないときに、`SmartScreen`の警告が表示されます。
これは10数回ダウンロードすれば解消されるので、問題ないのです。


## 3. コードサイニング証明書を購入する
[コモドジャパン](https://comodo.jp/products/codesign.html)では、アカウントを作ってWebのマイページから購入できます。
営業時間内に購入すれば、1時間以内にコモドジャパンから申請に関するメールが届きます。
`件名： 【COMODO　JAPANより】コードサイニングのご注文について　注文番号：xxxxxx`

- 価格:¥ 21,000円(税別)～
  - （年額）5年だと1万円off 94,200円(税別)～



## 4. コードサイニング証明書の申請する
購入完了メールに添付されたマニュアルにしたがって申請します。
注意ポイントは2つ。

- 申請で利用したPC端末でしかコードサイニング証明書の付与はできない
- 申請で利用するブラウザは、Internet Explorerのみ

申請の流れは次のとおりです。

1.コモドジャパンに、申請と書類の提出
　http://comodo.jp/support/codesign_2nd_val.html
　　↓
2.Webから申請後、国内審査を実施
　　↓
3.国内審査が無事通過したあと、本部の認証局側で審査を実施
　　↓
4.認証局側の審査が通過すると、コモドジャパンから最終審査(コールバック)が通知される
　　↓
5.最終審査が終了後、認証局(本部)より、申請時に入力されたメールアドレス宛に `コレクションコード` 送付される



## 5. コードサイニング証明書をアプリケーションに付与する
申請したPC端末で`コレクションコード` 送付されたメールに記載されているリンクを開いて証明書をインストールします。
インストールしたPFX (証明書と秘密鍵) を、`SignTool`を使ってEXEファイルに署名します。

```shell

# PCに保存・接続されている最適な証明書を使用してファイルに自動的に署名
signtool sign /a TargetApp.exe
# パスワードで保護された PFX ファイルを指定してファイルにデジタル署名
signtool sign /f MyCert.pfx /p MyPassword TargetApp.exe
# ファイルにデジタル署名してタイム スタンプを付与
signtool sign /f MyCert.pfx /t http://timestamp.sectigo.com/authenticode TargetApp.exe
# PCに保存・接続されている固有の証明書名 (例 ”My Company Certificate”) を指定してファイルに署名
signtool sign /n "My Company Certificate" TargetApp.exe
# ActiveX コントロールをユーザがインストールする際に表示させる情報として予め作成したURLを指定
Signtool sign /f MyCert.pfx /d: "TargetControlApp" /du http://www.example.com/MyControl/info.html TargetControlApp.exe
# デジタル署名済みのファイルにタイムスタンプを付与
signtool timestamp /t http://timestamp.verisign.com/scripts/timstamp.dll TargetApp.exe
# ファイルが署名済みであることを確認
signtool verify TargetApp.exe
# カタログで署名されている可能性があるシステムファイル確認
signtool verify /a SystemFile.dll
```

#### 注意点
- Win10よりGUIは廃止になったので、コマンドラインで作成します。
- `SmartScreenの即時解除が非対応` なので、アプリをダウンロードさせたいサイトからダウンロードを10回ほど繰り返して、警告がでないように実績を上げておきます。

## まとめ
- 最新のまとまった情報が少なかったです。
- 申請は英語のサイトでしたが、マニュアルが送付されるので問題はありませんでした。
- 何かあっても、問い合わせの返信が翌営業日にはくるので、サポートも十分でした。



9日目は [SENSYN DRONE HUB](https://www.sensyn-robotics.com/solution/sensyndronehub) 担当の @nakayamaatsushi  さんです✨