-
Notifications
You must be signed in to change notification settings - Fork 0
MS_Assembly
.NET Framework においてアセンブリとは、コンパイルされたコード ライブラリ(EXE、DLL)。
- 配置
- バージョン管理
- セキュリティ管理
の単位となる。
移行メモ(誤記): 原文の「NET Framework」は
.NET Framework の先頭ピリオド脱字と判断し修正した。
補足(本ページの位置づけ): 本ページは
コンポーネント技術の系譜(COM → .NET アセンブリ)の文脈で、
署名とセキュリティ管理の単位としてのアセンブリを扱っている。アセンブリの構造(マニフェスト、メタデータ、IL)や
参照解決の話は .NETアセンブリ を参照。【アセンブリが「単位」であるもの】 配置 … EXE / DLL としてまとめて配る バージョン … AssemblyVersion はアセンブリ単位([.NETアセンブリのバージョン情報](MS_DotNetAssemblyVersion)) 型の境界 … internal はアセンブリ内から見える セキュリティ… 署名・信頼の単位(本ページ)
- アセンブリ署名をすることにより厳密名
(アセンブリのハッシュを秘密鍵で暗号化した値と復号化のための公開鍵)を
持つ状態になる。 - 厳密名は、アセンブリの偽装攻撃を防ぐコード・アクセス・セキュリティや、
アセンブリ名称の一意性を保証し GAC から対象のアセンブリを検索するなどの機能で使用される。
補足(厳密名は「同一性」であって「真正性」ではない): 誤解が多い点なので
整理しておく。厳密名(Strong Name)は、
できること できないこと アセンブリ ID を一意にする(名前 + バージョン + カルチャ + 公開鍵トークン) 発行元が誰かを証明する 同じ ID の別物を GAC に混在させない 改ざんされていないと信頼できる形で保証する バインドを厳密に固定する 「偽装攻撃を防ぐ」という原文の記述は、
**「別のアセンブリが同じ名前で成りすますのを防ぐ」**という意味では正しいが、
証明書のような第三者による発行元の保証は無い
(公開鍵ペアは誰でも自由に作れる)。発行元を証明したいなら、**Authenticode によるデジタル署名**を
併用する必要がある。この 2 つは目的が異なる。
厳密名 Authenticode 署名 目的 ID の一意性・バインドの固定 発行元の証明・改ざん検出 鍵 自分で生成( sn -k)CA が発行した証明書 検証 ランタイム OS / SmartScreen タイムスタンプ なし あり(証明書失効後も有効)
補足(.NET Core 以降の扱い/最新化): 厳密名の役割は、
.NET Core 以降で大きく縮小している。
.NET Framework .NET Core / .NET GAC あり(厳密名が必須) 廃止(アプリごとに配置) 署名の検証 ロード時に検証する 検証しない(ID の一部として見るだけ) バージョン バインド 厳密( bindingRedirectが必要)緩やか( deps.jsonが解決)部分信頼(CAS) あり 廃止 つまり、.NET Core 以降では厳密名はセキュリティ機構ではなく、
単なる ID の一部である
(署名の検証をしないため、改ざん検出の役には立たない)。それでも厳密名を付ける理由は、主に次の 2 つに限られる。
- 厳密名付きアセンブリから参照されるライブラリを作る場合
(.NET Framework では、厳密名付きは厳密名付きしか参照できない)InternalsVisibleToで公開鍵を指定する場合新規に .NET 用のライブラリを作るだけなら、
厳密名は必須ではない。改ざん検出が要るなら Authenticode を使う。
- 通常のデジタル署名を行うことも可能。
- ClickOnceなどの技術で必要になる。
補足(Authenticode の実務): 配布物に対する
デジタル署名(Authenticode)は、現在も次の場面で必要になる。
場面 理由 ClickOnce マニフェストの署名が必須(自己署名も可だが警告が出る) インストーラー(MSI / EXE) SmartScreen の警告を減らす ドライバー 署名が無いと読み込まれない PowerShell スクリプト 実行ポリシーが AllSignedの場合要点:
- タイムスタンプを必ず付ける(
signtool /tr)。
付けないと、証明書の有効期限切れと同時に署名が無効になる。- EV コード署名証明書は SmartScreen の評価が即座に得られるが、
ハードウェア トークン(HSM)での鍵保管が要求される。- 署名対象はアセンブリそのもの(厳密名と違い、後付けできる)。
- アセンブリ (.NET)
https://learn.microsoft.com/ja-jp/dotnet/standard/assembly/ - 厳密な名前付きアセンブリ
https://learn.microsoft.com/ja-jp/dotnet/standard/assembly/strong-named - 厳密な名前付きアセンブリを作成して使用する
https://learn.microsoft.com/ja-jp/dotnet/standard/assembly/create-use-strong-named - 厳密な名前付きアセンブリに関する既知の問題(.NET Core)
https://learn.microsoft.com/ja-jp/dotnet/standard/library-guidance/strong-naming
Tags: 移行, Windows, .NET開発
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。