我们正在开发一个通过ClickOnce部署的应用程序。我们有一个VeriSign代码签名证书,我们用它来签署我们的应用程序(通过signtool.exe
post-build)和ClickOnce清单。我们目前有两个与签名有关的问题:
我们正在使用我们的证书签署.exe。构建我们的应用程序后,我们可以看到它已签名(例如,通过“signtool verify / pa TheExecutable.exe”)。但是在通过ClickOnce安装应用程序后,.exe不再签名。
我们正在使用我们的证书签署ClickOnce舱单。但是当我们尝试通过ClickOnce安装应用程序时,ClickOnce安装程序会显示“Unknown Publisher”。
问题#1总是发生。问题#2有时会神秘地消失,但此后不久就会回来,我们已经持续了几周了。
有什么想法吗?
答案 0 :(得分:14)
好的,解决了这个问题的1/2的谜团:ClickOnce从bin
获取应用程序清单,但从obj
获取实际的EXE。为了分发您签名的exe,您必须在obj
目录中签署该文件。
编辑:这是另一半。安装.NET 4.5 Beta会破坏ClickOnce签名/验证,即使在VS2010中也是如此。
答案 1 :(得分:7)
以下是我处理清单签名和签署exe的方法。我将它添加到我的.csproj文件的底部(在文本编辑器中编辑)。
<Target Name="AfterBuild">
<CallTarget Targets="SignOutput" />
</Target>
<Target Name="SignOutput">
<PropertyGroup>
<TsUrl>http://timestamp.comodoca.com/rfc3161</TsUrl>
</PropertyGroup>
<ItemGroup>
<SignableFiles Include="$(ProjectDir)obj\$(ConfigurationName)\myappname.exe" />
</ItemGroup>
<Exec Command="signtool.exe sign /n "My Company Name LLC" /tr $(TsUrl) "%(SignableFiles.Identity)"" />
</Target>
答案 2 :(得分:4)
那就是说,我认为我们最大的麻烦来自尝试通过Visual Studio中的设置UI来管理事物。尝试依赖MSBuild“magic”并将必要的参数传递给MSBuild并在csproj文件中进行更多控制对我有所帮助。
我不知道你的构建设置是什么样的,但是,对于我们来说,我们Jenkins运行一个Rake文件,在解决方案上调用MSBuild。这允许我们从Rake文件向MSBuild发送特定参数。
具体来说,我们会推送ApplicationVersion
,ApplicationRevision
,MinimumRequiredVersion
和OutDir
的值。至于csproj本身需要注意的事项,您需要确保设置ManifestCertificateThumbprint
,ManifestKeyFile
,GenerateManifests
和SignManifests
。我们还将默认构建目标设置为Publish
,但我不确定这些是否相关。
我无法说出为什么ClickOnce将“取消签名”您的可执行文件,可能您签署的可执行文件可能不是您认为正在ClickOnce包中打包的那个。换句话说,它可能正在构建一个新的可执行文件并将其丢弃在包中,而不是您已签名的那个。我想我必须更多地了解你的设置才能确定这个电话。
对于它的价值,如果我能再做一次,我不会把我的鸡蛋放在ClickOnce篮子里。对于那些运行Internet Explorer或者你已经安装了Chrome插件的人来说,这真的只是一次很棒的体验。这是更多的工作,但我目前正在研究模仿Chrome更新故事的解决方案。他们有一个适用于Internet Explorer用户的ClickOnce软件包,但它实际上仅用于下载安装Chrome.exe和Update.exe的Windows安装程序包。他们在the technical documentation中为奥马哈(也称为谷歌更新)提供了大量详细信息。
答案 3 :(得分:-1)
自行签署setup.exe时出现问题。我在为MSFT的P&amp; P家伙撰写ClickOnce文章时遇到了这个问题。它没有解决方法。
您的证书是否已安装在用于生成部署的用户帐户的证书库中?它是否在VS解决方案本身中指定为文件?如果它是默认值,并且您使用msbuild和mage生成部署,它是否可以签名好吗?