--- title: "コード署名したのに SmartScreen の警告が消えない理由。署名は「実績の入れ物」" description: "コード署名すれば「WindowsによってPCが保護されました」は消える、と思っていた。消えません。署名は警告を消す魔法ではなく、実績を証明書に紐づけて次の版へ持ち越すための入れ物です。署名直後の画面、更新したときの実績の行方、いつ消えるかの目安を Microsoft の公式ドキュメントで確かめます。" url: https://ryuuneko.com/blog/code-signing-still-warns published: 2026-09-12 20:46:41.92526 updated: 2026-09-12 20:47:36.757366 --- 「コード署名すれば、あの青い警告は消えるんでしょ?」 消えません。署名した直後の exe を配っても、「WindowsによってPCが保護されました」は同じように出ます。変わるのは 1 か所、「発行元」に名前が出るようになることだけです。 署名は警告を消す魔法ではなく、**実績を証明書に紐づけて、次の版へ持ち越すための入れ物**です。この記事では、署名した直後の画面、更新したときに実績がどうなるか、いつ消えるかの目安を、Microsoft の公式ドキュメントに当たりながら整理します。証明書の取り方や、証明書に入る名前の話は、別の記事に分けます。 この記事は、個人開発者が配布時によく踏む場面を、小さなツールを配った例として再現したものです。発行元の名前や友達からの報告は架空で、SmartScreen の挙動は 2026 年 8 月時点の Microsoft のドキュメントで確かめています。前提になる「なぜ警告が出るのか」は [「WindowsによってPCが保護されました」が自作アプリで出る理由](/blog/smartscreen-warning-own-app) で。 ![署名しても警告は出る。変わるのは発行元の名前が出ること。実績が証明書に紐づいて次の版へ持ち越せるのが署名の効果、という全体図](/blog/uploads/code-signing-still-warns-overview.svg) --- ## 署名した直後の画面は、こうなる 前に警告が出たので、署名してもらった。それでも配ったら、また青い画面。 ``` Microsoft Defender SmartScreen WindowsによってPCが保護されました Microsoft Defender SmartScreen は認識されないアプリの起動を停止しました。 発行元: KURONEKO DEV ``` 前と 1 か所だけ違います。「発行元」に名前が出ている。Microsoft の開発者向けドキュメントの表でも、有効な証明書で署名した場合の挙動は「評判が積まれるまでは認識されないアプリとして警告が出る。検証済みの発行元名は表示される」とされています(出典 2)。 消えたわけではない。配った人の名前が出るようになった。それが署名の直接の効果です。 ### 打ったのは 1 行 ``` signtool sign /fd SHA256 /tr http://timestamp.example /td SHA256 /a tidy-text.exe Successfully signed: tidy-text.exe ``` 思ったより短い。ただし署名に使う秘密鍵は、規格でハードウェアの中に置くことが決められていて(出典 3)、トークンから取り出せません。ファイルとして貸し借りするものではないので、署名するのは鍵を持っている人です。 ちなみに 1 回目はこけました。 ``` SignTool Error: No certificates were found that met all the given criteria. ``` トークンは差してあったのに、それを使う道具を入れていなかった。差せば動くわけではないです。 ### `/tr` のタイムスタンプは要る AI に言われて付けた `/tr` は、署名した時刻を第三者が記録するタイムスタンプです。Microsoft のドキュメントは常に付けるよう書いていて、無いと証明書の期限が切れた時点で署名が無効になり、未署名と同じ扱いになります(出典 4)。付けておけば、期限内に署名したことが残る。AI の 1 行は正しかった。 --- ## 署名は警告を消さない。では何のためにあるのか 元をたどると分かります。箱で売っていたころは、ブランドと店が信用の担保でした。ネットで配ると、それが無い。誰が作ったかも、途中で書き換えられていないかも、ネットは保証してくれません(出典 5)。だから署名で、配った人と改変の有無を示すようになった。 そして SmartScreen は、実績の積まれる先を 2 つ持っています。ファイルそのものと、発行元の証明書です。ファイルの実績は中身が変わると消えますが、証明書の実績は残る。既に評判のある発行元から出た新しいプログラムは、その発行元のコード署名証明書から評判を引き継ぐ、と書かれています(出典 1)。 だから「入れ物」です。実績がゼロなら、署名していても「知らない」と言われる。効いてくるのは、ここからです。 ### 署名が証明しているのは 2 つだけ | 分かること | 分からないこと | |---|---| | 誰が署名したか | 中身が安全かどうか | | 署名のあとで書き換えられていないか | 作った人が信用できるかどうか | デジタル署名は、ファイルの配布者を特定し、署名後に中身が変更されていないことを保証するものです(出典 5)。中身がいいものかは見ていない。悪いものに署名することもできる。署名は「安全の証明」ではなく、何かあったときに「たどれる」ようにするものです。 --- ## 更新したら、実績はどうなるか ここが署名の効くところです。 署名が無い場合、誤字を 1 つ直して出し直すと、ハッシュが変わって別のファイル扱いになり、積んだ実績はそこで切れてゼロからやり直しになります。Microsoft のドキュメントも、署名されていないファイルの評判は新しい版ごとにゼロから積み直しで、同じ発行元の身元で署名されていない限り前の版から引き継げない、と書いています(出典 2)。 ![署名なしは更新のたびに実績がゼロに戻る。署名ありなら実績は発行元に残り、次の版に持ち越せる。ただし持ち越せるのは実績が積まれてから、という仕組みの図](/blog/uploads/code-signing-still-warns-carryover.svg) | 状態 | 出る警告 | 更新したら | |---|---|---| | 署名なし | 「認識されないアプリ」 | 実績はゼロに戻る | | 署名あり・実績なし | 同じ警告(発行元は出る) | 実績は発行元に残る | | 署名あり・実績あり | 出なくなることがある | 持ち越せる | 署名した直後は真ん中です。警告は左と同じに見えますが、更新したときの挙動が違う。右へ動くには、待つしかありません。 ### いつ消えるのか Microsoft のドキュメントは、ファイルのハッシュに十分なダウンロード履歴が積まれると警告は出なくなる、正確なしきい値は無いが、数週間と、幅広い利用者からの数百件のクリーンなインストールがかかることがある、と書いています(出典 2)。手動で審査に出す窓口は無く、評判はダウンロード量から自然に積み上がるものだ、とも。 先に配っている知り合いからの報告(架空の例)はこうでした。 > 1 週目: まだ出る。名前は出てる。「詳細情報」から実行はできた > 1 か月: まだ出る。使う人は少しずつ増えた > 数か月: 出なくなった ここで正直に言うと、友達に配る数では、数百件には届きません。部で配る分には、ずっと真ん中のまま。署名で買えたのは、名前が出ることだけでした。これは失敗ではなく、入れ物ができたところです。ただ、溜まる当てが無いなら、署名しないのも選択のうちです。 --- ## 結局どうするか - **Windows に 1 本配るだけなら、署名しなくていい**。してもしなくても警告は出る。発行元が空欄になるだけ。案内を先に書く([前の記事](/blog/smartscreen-warning-own-app) の「配る側に、今できること」) - **続けて出すなら署名する**。同じ発行元に実績が積まれる先ができる。ただし届く数が要る。途中で発行元を変えると、また最初から - **消える時期は当てにしない**。目安は数週間・数百件で、決まった数字は無い Mac は事情が違います。署名が無いと、利用者が設定を開いて明示的に許可する形になります(出典 6)。Mac の話は別の記事で。 ### 証明書には、取った人の本名が入る 配ったファイルから、誰でも証明書を開いて見られます。そこには取った人の法的な名前と、国・地域が必ず入ります(出典 7)。規格上、個人でも取れないわけではありませんが、本名が出る前提で決めることになる。団体で取れるなら団体で取る手があり、その場合はその団体が実在することの確認が要ります。この話は長くなるので、別の記事に分けます。 --- ## まとめ - コード署名しても「WindowsによってPCが保護されました」は消えない。変わるのは発行元に名前が出ること - 署名が証明するのは、誰が署名したかと、署名後に書き換えられていないかの 2 つ。安全の証明ではない - 署名は実績の入れ物。同じ発行元で署名し続ければ、次の版に実績を持ち越せる。署名が無いと更新のたびにゼロから - 消えるまでは待つしかない。目安は数週間・数百件で、届かない規模ならずっと真ん中のまま - タイムスタンプ(`/tr`)は必ず付ける。無いと証明書の期限切れで署名ごと無効になる 自作アプリを配って警告に出会うまでの流れは [AIで10分、アプリは作れた。問題は、その後だった](/blog/ai-app-in-10-minutes-then-what) で。 ※ この記事は 2026 年 8 月時点の Microsoft・CA/Browser Forum・Apple の公式ドキュメントをもとにしています。証明書の種類・値段・認証局ごとの運用は扱っていません。どれも変わります。 ## 動画版 同じ題材を、YouTube「黒猫開発部」では 2 人の会話で扱っています。動画は署名直後の画面と更新したときの挙動を実物で追う向け、この記事は仕組みと出典を文章で確かめる向けです。 - 黒猫開発部 No.005「署名したのに、まだ警告が出る」(2026-09-29 公開予定) - [チャンネル: 黒猫開発部](https://www.youtube.com/@黒猫開発部) ## 出典 1. [Microsoft IEBlog — SmartScreen Application Reputation in IE9](https://learn.microsoft.com/en-us/archive/blogs/ie/smartscreen-application-reputation-in-ie9) — "A new program from an existing publisher with an established reputation inherits the publisher's reputation from that publisher's code signing certificate." 2. [Microsoft Learn — SmartScreen reputation for Windows app developers](https://learn.microsoft.com/en-us/windows/apps/package-and-deploy/smartscreen-reputation) — "Even when signed, a newly created binary could still show a SmartScreen warning until its hash or publisher certificate accumulates sufficient evidence of positive reputation." / "Valid Certificate (OV/EV) — Warning — app flagged as unrecognized until reputation accumulates; verified publisher name is displayed" / "When a file is not signed, SmartScreen reputation must build for each new version of your files, starting with zero reputation. Reputation cannot transfer from previous versions unless both were signed using the same publisher identity." / "There is no exact threshold, but it can take several weeks and hundreds of clean installs from a wide audience." / "There is no need (or mechanism) to manually submit a file for SmartScreen reputation review for consumer endpoints. Reputation builds organically through download volume." 3. [CA/Browser Forum — Baseline Requirements for Code Signing v3.7 §6.2.7.4.1](https://cabforum.org/uploads/Baseline-Requirements-for-the-Issuance-and-Management-of-Code-Signing.v3.7.pdf) — "Subscriber Private Keys for Code Signing Certificates SHALL be protected … in a Hardware Crypto Module with a unit design form factor certified as conforming to at least FIPS 140-2 Level 2 or Common Criteria EAL 4+" 4. [Microsoft Learn — Time Stamping Authenticode Signatures](https://learn.microsoft.com/en-us/windows/win32/seccrypto/time-stamping-authenticode-signatures) — "Always time-stamp your Authenticode signatures. Without a time stamp, the signature becomes invalid when the signing certificate expires, and Windows will treat the binary as unsigned." 5. [Microsoft Learn — Cryptography Tools](https://learn.microsoft.com/en-us/windows/win32/seccrypto/cryptography-tools) — "Packaged software uses branding and trusted sales outlets to assure users of its integrity, but these guarantees are not available when code is transmitted on the Internet." / "A digital signature attached to a file positively identifies the distributor of that file and ensures that the contents of the file were not changed after the signature was created." 6. [Apple — 確認されていない開発元の Mac App を開く](https://support.apple.com/guide/mac-help/open-a-mac-app-from-an-unidentified-developer-mh40616/mac) — システム設定 → プライバシーとセキュリティ → 「このまま開く」で開ける。"overriding these settings is the most common way that a Mac gets infected with malware." 7. [CA/Browser Forum — Baseline Requirements for Code Signing v3.7 §7.1.4.2](https://cabforum.org/uploads/Baseline-Requirements-for-the-Issuance-and-Management-of-Code-Signing.v3.7.pdf) — `subject:commonName` Required, "MUST contain the Subject's legal name" / `subject:countryName` Required / `subject:localityName` と `subject:stateOrProvinceName` はどちらかが Required / `subject:streetAddress` は Optional / "Individual Applicant: An Applicant who is a natural person and requests a Certificate that will list the Applicant's legal name as the Certificate's Subject."