XXX.vsto からマニフェストを読み取っているときに例外が発生しました。マニフェストが無効であるか、ファイルを開くことができなかった可能性があります。

エクセルのアドインにデジタル証明書で署名を付けて「身元不明」から脱却しようとしたのですが、こんなエラーが出るわけです。


開発環境は以下の通り。
  • VS2010
  • 対象のフレームワークは .NET framework3.5
  • EXCEL2007用のテンプレートから作成
デバッグすると、下記のエラーが出る。
file:///C:/XXX/bin/Debug/ExcelAddIn_vs2010_fw35_excel2007.vsto からマニフェストを読み取っているときに例外が発生しました。マニフェストが無効であるか、ファイルを開くことができなかった可能性があります。
---> System.Deployment.Application.InvalidDeploymentException: マニフェストの XML 署名が無効です。
---> System.Security.Cryptography.CryptographicException: 指定された署名アルゴリズムの SignatureDescription を作成できませんでした。
プロジェクトの「発行」でクリックワンスのセットアップを作って実行してみると、やはり同じようなエラーが出る。



エラーの解決方法

デジタル証明書の署名アルゴリズムが「sha256RSA」というもので、それが.NET framework3.5(以下FX3.5)では対応できていないらしくて、エラーが起きているようだ。

ためしに、対象のフレームワークを .NET framework4.0 に変えて実行するとエラーは出なくなる。最近の証明書で署名したクリックワンスのセットアップを作るときは、対象のフレームワークを.NET framework4.0にしないといけないようだ。

しかし

めでたしめでたし、と言いたいところだがFX3.5をFX4.0に切り替えると、リボンのあたりがエラーになってビルドできなくなる。クラスが変わったようで、書き換えが必要となってしまう。

しかも、開発しているエクセルアドインはEXCEL2007以降を対象としているのだが、VS2013ではEXCEL2007用のアドインのテンプレートが無い。EXCEL2010と2013用のテンプレートしかなくて、VS2013を使えない。ということで、VS2010を使い続けないといけない。


今回いろいろ調べたのだけど、悲しいことによくわからない。


このページの真ん中あたりに、暗号、Suite B のサポートという項目があって、SHA-256に対応したと書いてある。FX3.5の機能説明なのだけど、ならば、なぜクリックワンスのセットアップはエラーになるのだろうか?


このページはFX3.5の暗号機能の説明ページだが、ここにもSHA-256に対応と書いてある。またしても、どういうこと?


署名のアルゴリズムがSHA-2に変わった理由が説明されている。つい最近のことだったのね。クリックワンスのセットアップの動作についても説明されていて、大変ありがたい。引用すると、、、
 ClickOnce は独自に署名の検証を行っており、(中略)、インストーラーが動作するクライアントに搭載されている .NET Framework のバージョンに依存して対応状況が異なります。
  • NET Framework 4.x (CLR4) 系では、.NET Framework 4.5 以降で対応しています。
  • NET Framework 2.0/3.0/3.5 (CLR2) は現在対応しておりません。今後修正等で対応するかどうかも未定です。ただし、同じ環境に.NET Framework 4.6 など最新バージョンの .NET Framework がサイド バイ サイドでインストールされていれば、ClickOnce ローダーはそちらを使って署名の検証をするため、SHA-2 署名の検証は行えるようになります。
セットアップするパソコンにFX4.5以上があればOKらしい。それでは、VS2010でFX3.5を対象に作ったクリックワンスがエラーになるのは、どうしてなのだろう?


このページに、「クリックワンスでFX4.0でも動くようになった」と書いてあるような気がする。英語だからよくわからないが、FX4.5が無いパソコンでもFX4.0があれば、署名の検証ができるようにしたと書いてあるように思う。

VS2010はどうなんでしょうか?

*追記 5/1


FX4.6では、ClickOnceの動作が変わったようだ。
これまでは、SHA-256 証明書を使用して .NET Framework 4 以前のバージョンをターゲットとする ClickOnce アプリは、ターゲット システム上に .NET Framework 4.5 以降のバージョンが存在しなければなりませんでした。 そのため、存在しない場合はエラーが発生しました。 この変更により、その依存関係がなくなったので、.NET Framework 4 以前のバージョンをターゲットとする ClickOnce アプリの署名にSAH-256 証明書が使用できるようになりました。
ということは、FX4.6が入っているパソコンでは、クリックワンスのセットアップはエラーなしで動くということかな。

しかし、FX4.6を入れたWindowsServer2008R2では、FX3.5をターゲットとしたクリックワンスを実行すると、署名関係のエラーが出てしまった。書いてあることと違うぞ。上の記述はFX3.5は対象外なのか?

デスクトップアプリ(FX3.5をターゲット)のクリックワンスを作って試してみたら、こちらはエラーが出ずに動いた。どうも、エクセルアドイン(FX3.5をターゲット)のクリックワンスだとエラーになるみたい。やっかいだ。

ということで、今のところ、FX4.0をターゲットにしてエクセルアドインを作るしか、sha256の署名のエラーを避ける手は見つかっていない。

*追記 5/3

いくつか実験をしてみた。
  • vs2010でFX3.5をターゲットにしたエクセルアドインのクリックワンスをsha256の証明書で署名して作る。それをWindows10で実行してみる。Windows10にはFX4.6が入っているので、署名のエラーは出ないはず?
    →結果は、同じエラーが出た。
  • 同じ作成条件で、必須コンポーネントを「Windowsインストーラ3.1」を「4.5」に変えてみた。インストーラが新しくなればなにか変わるかも。
    →結果は、同じエラーが出た。

うーん。

*追記 5/14

実験をしてみた。
  • vs2010でFX4.0をターゲットにしたエクセルアドインのクリックワンスをsha256の証明書で署名して作る。それをWindowsServer2012で実行してみる。
    →エラーは出なかった。
やはり、FX3.5をターゲットにして作ったクリックワンスは、sha256の証明書は使えないようだ。

*さらに追記 5/14

vs2010でFX3.5をターゲットに作ったクリックワンスを、sha256の証明書で再署名する実験をしてみた。

クリックワンスには、再署名するべきファイルが2つある。

  • 発行\Application Files\addinName_N_N_N_N\addinName.dll.manifest
  • 発行\addinName.vsto
最初のがアプリケーションマニフェストで、2番目のが配置マニフェストというらしい。

そこで以下のようなBATファイルを作って実行する。mageは署名をするコマンドで、Windowsによっては別のフォルダにあるかもしれない。
set mage="C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\mage"
set pfx=C:\Users\t-sawada\Desktop\XXX.pfx
set pw=-Password XXX
set addinName=ExcelAddIn_vs2010_fw35_excel2007
set appDir=Application Files\%addinName%_1_0_0_6
set maFile=%addinName%.dll.manifest
set publicDir=C:\Users\t-sawada\Desktop\発行
cd %publicDir%\%appDir%
%mage% -sign %maFile%  -CertFile %pfx% %pw% -a sha256rsa
cd %publicDir%
%mage% -update %addinName%.vsto -appmanifest "%appDir%\%maFile%" -CertFile %pfx%  %pw% -a sha256rsa
実験の結果は以下の通り:
  • vs2010でFX3.5をターゲットにしたエクセルアドインのクリックワンスをsha256の証明書で署名して作る。それを、sha256の証明書で再署名する。
    →エラーが出た。
再署名したらエラーは出なくなるかもという期待が少しあったのだが、残念、エラーでした。

ということで、これまでの結論は、sha256の証明書で署名するときは、.NET Framework4 以上をターゲットにしよう。FX4.0はサポートが終わっているので、サポートされているフレームワークを対象とするのがよさそう、という感じ。

コメント

このブログの人気の投稿

varchar をデータ型 numeric に変換中に、算術オーバーフロー エラーが発生しました。