24

職場で、クライアントがインストールしようとしたときに例外をスローしていた ClickOnce アプリケーションがありました。

  • ファイルからのマニフェストの読み取り中に例外が発生しました:/FILEPATH: マニフェストが有効でないか、ファイルを開くことができませんでした。

    マニフェスト XML 署名が無効です。

    指定された署名アルゴリズムの SignatureDescription を作成できませんでした。

これを解決するために、別の証明書ファイルを使用することになりましたが、問題なく機能しました (マニフェストを辞任しました)。

しかし、アプリケーションを開発者のマシン (アプリケーションを使用していない開発者でさえも) にインストールするとうまくいくのに、なぜクライアントのマシンではうまくいかないのか理解できません。

証明書がどのように作成されたか、または ClickOnce パッケージについては、多くの情報がありません。これは、証明書を作成した人が亡くなっており、それに関するドキュメントを残していないためです。

使用されていた証明書にはパスワードがなく、通常のユーザーには管理者権限がありません。

スタック オーバーフローの質問Manifest XML signature is not validから、 .NET Framework 4.5 でプロジェクトと証明書を作成し、アプリケーションを .NET Framework 4.0 で実行するように設定したときに問題が発生した可能性があると推測できます。署名アルゴリズムを変更します。しかし、それは開発者にとってもうまくいかないはずだと思います。

あなたが私に与えることができるどんな洞察も大歓迎です.

4

3 に答える 3

26

更新: これは、Visual Studio 2013 Update 3 の時点で修正されています。そのバージョンの VS 以降からアプリを公開してみてください。

以前の回答:

これは、開発者のマシンには .NET 4.5 がインストールされていたのに対し、クライアントのマシンには .NET 4.0 しかインストールされていなかったためです。.NET 4.0 クライアント マシンは SHA-1 を想定しているためマニフェストを読み取ることができませんが、.NET 4.5 開発者マシンは可能です。

追加のコンテキストについては、このブログ投稿を参照してください。

この変更は、マニフェストに署名するために NetFX4.5 でレガシー証明書 (SHA-1) をデフォルトとして使用するのをやめ、代わりに、NetFx4.0 ランタイムによって認識されない新しいバージョン (SHA-256) を使用するという事実によるものです。したがって、マニフェストの解析中に、4.0 ランタイムは無効なマニフェストを訴えます。レガシ フレームワークの場合、ターゲット ランタイムを持たないボックスで ClickOnce アプリを実行しようとすると、ClickOnce は、「このアプリを実行するには xxxx.xx ランタイムが必要です」というメッセージをユーザーに表示します。しかし、.NET 4.5 以降では、.NET 4.0 のみがインストールされているボックスで 4.5 ClickOnce アプリを実行すると、マニフェストが無効であるというメッセージが表示されます。この問題を解決するには、ターゲット システムに .Net Framework 4.5 をインストールする必要があります。

SHA-2 証明書の代わりに SHA-1 証明書を使用してマニフェストに署名してみてください。

于 2013-05-16T05:22:39.643 に答える
13

同様の問題がありました..NET 4.0以降のマシンで動作することを意図した.NET 4.0アプリケーションがあります。コード署名証明書の有効期限が切れたため、新しいものを購入し、Sha1 が廃止される予定であるため、Sha256 のものを受け取りました。私たちのビルド マシンには .NET 4.5 がインストールされているので、フレームワーク アセンブリはすべてそのマシンで更新されます。

新しい証明書に移行すると、次のエラーが .NET 4.0 マシンでのみ表示されるようになったことに気付きました。

* Activation of http://localhost/publish/Test.application resulted in exception. Following failure messages were detected:
    + Exception reading manifest from http://localhost/publish/Test.application: the manifest may not be valid or the file could not be opened.
    + Manifest XML signature is not valid.
    + SignatureDescription could not be created for the signature algorithm supplied.

少し調査した結果、このスレッドやその他のスレッドが見つかり、.NET 4.5 へのアップグレードが提案されましたが、これは私たちにとって有効な解決策ではありません。クライアントに .NET フレームワークの更新を強制したくありません (~20% はまだ使用しています)。 .NET 4.0)。私たちが思いついた解決策は次のとおりです。

  • .NET 4.0 のみがインストールされているマシンでマニフェストに署名する
  • mage.exe を使用する代わりに、次の PowerShell スクリプトで署名します。
function SignFile($filePath, $timeStampUri, $certThumbprint)
{
    #Add-Type System.Security

    $x509Store = New-Object -TypeName ([System.Security.Cryptography.X509Certificates.X509Store]) -ArgumentList ([System.Security.Cryptography.X509Certificates.StoreName]::My),([System.Security.Cryptography.X509Certificates. StoreLocation]::CurrentUser)
    試す
    {
        $x509Store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadOnly)
        $x509Certificate2Collection = $x509Store.Certificates.Find([System.Security.Cryptography.X509Certificates.X509FindType]::FindByThumbprint, $certThumbprint, $false);
        もし ($x509Certificate2Collection.Count -eq 1)
        {
            $cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]@($x509Certificate2Collection)[0]

            # これにより、SHA256 の代わりに SHA1 の使用が強制されます
            $cert.SignatureAlgorithm.FriendlyName = ""

            Add-Type -AssemblyName "Microsoft.Build.Tasks.v4.0"

            [Microsoft.Build.Tasks.Deployment.ManifestUtilities.SecurityUtilities]::SignFile($cert, $timeStampUri, $filePath)
        }
    }
    最後に
    {
        $x509Store.Close();
    }
}

編集:私は実際にこのコマンドレットを使用してマニフェスト ファイルに署名します: https://gist.github.com/nedyalkov/a563dd4fb04d21cb91dc

この情報が誰かの時間と労力を節約してくれることを願っています!

于 2014-01-13T21:58:34.157 に答える