- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用ClickOnce应用程序在Azure DevOps中进行CI/CD。使用托管代理时,如何在构建过程中安全地提供我的代码签名证书?
注意我知道您可以按照Visual studio team services deploymen/buildt certificate error的建议使用脚本。但是,这种方法并不安全。证书将被加载到托管代理正在运行的帐户的证书存储中。这将允许代理以及其他Azure DevOps帐户潜在地访问和使用证书。
最佳答案
该问题的解决方案是重写内置任务SignFile。有趣的是,SignFile任务使用了Microsoft.Build.Tasks.Deployment.ManifestUtilities.SecurityUtilities.SignFile
中的内置函数,该函数具有两个重载,一个重载使用指纹,另一个重载使用文件和密码。
然后的解决方案是创建一个新任务,该任务可以引用其他重载。由于我们无法更改调用SignFile,因此我们需要维护相同的签名,并将适当的变量放在环境变量中。在这种情况下,“CertificateFile”和“CertificatePassword”。
然后在覆盖的SignFile中引用这两个。我要做的是创建一个新的目标文件(filesign.targets)并将代码放置在那里。 checkin 到我的存储库中,并从主项目文件中引用了它。<Import Project="filesign.targets" />
这样,我们还可以将 key 文件保存在Azure key 保管库中,在构建时加载它们,并为该构建提供唯一的密码。
目标文件包含新的FileSign任务:
<?xml version="1.0" encoding="Windows-1252"?>
<!--
***********************************************************************************************
Microsoft.VisualStudio.Tools.Office.targets
WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
created a backup copy. Incorrect changes to this file will make it
impossible to load or build your projects from the command-line or the IDE.
This file defines the steps in the standard build process specific for Visual Studio Tools for
Office projects.
Copyright (C) Microsoft Corporation. All rights reserved.
***********************************************************************************************
-->
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="SignFile" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
<ParameterGroup>
<SigningTarget Required="true" ParameterType="Microsoft.Build.Framework.ITaskItem" />
<CertificateThumbprint ParameterType="System.String" />
<TargetFrameworkVersion ParameterType="System.String" />
<TimestampUrl ParameterType="System.String" />
<CertificateFile ParameterType="System.String" />
<CertificatePassword ParameterType="System.String" />
</ParameterGroup>
<Task>
<Reference Include="mscorlib" />
<Reference Include="Microsoft.Build.Tasks.Core" />
<Using Namespace="System" />
<Code Type="Fragment" Language="cs">
<![CDATA[
var EnvCertFile = System.Environment.GetEnvironmentVariable("CertificateFile");
Log.LogMessage("CertFile:!!" + EnvCertFile);
if (string.IsNullOrWhiteSpace(CertificateFile) && string.IsNullOrWhiteSpace(EnvCertFile)) {
var signFile = new Microsoft.Build.Tasks.SignFile();
signFile.CertificateThumbprint = CertificateThumbprint;
signFile.SigningTarget = SigningTarget;
signFile.TargetFrameworkVersion = TargetFrameworkVersion;
signFile.TimestampUrl = TimestampUrl;
return signFile.Execute();
} else {
var certificate = string.IsNullOrWhiteSpace(CertificateFile) ? EnvCertFile : CertificateFile;
var EnvCertPassword = System.Environment.GetEnvironmentVariable("CertificatePassword");
var certificatePassword = string.IsNullOrWhiteSpace(CertificatePassword) ? EnvCertPassword : CertificatePassword;
var testString = new System.Security.SecureString();
// Use the AppendChar method to add each char value to the secure string.
if (!string.IsNullOrWhiteSpace(certificatePassword))
foreach (char ch in certificatePassword)
testString.AppendChar(ch);
Microsoft.Build.Tasks.Deployment.ManifestUtilities.SecurityUtilities.SignFile(certificate, testString,
TimestampUrl == null ? null : new Uri(TimestampUrl),
SigningTarget.ItemSpec);
return true;
}
]]>
</Code>
</Task>
</UsingTask>
</Project>
关于azure-devops - 在Azure DevOps管道中安全签署ClickOnce应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53291017/
我有一个使用 ClickOnce 部署的 WinForms 应用程序。在应用程序项目中,我将一些文件标记为“内容”,它们在“发布”设置的“应用程序文件”对话框中也标记为“数据文件”。我还有一些标记为“
理想情况下,调用 setup.exe 时根本不会弹出任何窗口,但最好是让用户不必在安装先决条件和其他选项时单击“确定”。甚至可以使用 ClickOnce ? 最佳答案 附加文件 附加组件(文件和 DL
我部署了一个新版本的 ClickOnce 应用程序 我在测试客户端机器上打开我的 ClickOnce 应用程序 不提供升级 我关闭我的 ClickOnce 应用程序并重新打开它,现在提供升级 为什么我
我们部署了一个名为“Its Our App”的 Winforms 应用程序。 人们将其称为 IOA。我想保留快捷方式的全名,但我看到许多用户在键盘上按下 Windows 键,输入 IOA,然后奇怪地说
好的,我有一个 Windows Forms使用 ClickOnce 发布的应用程序到http://MyDevComputer1/DevPublishFolder/ ,所以部署链接是 http://My
.NET ClickOnce 应用程序被部署到 C:\Documents and Settings\\Local Settings\Apps\2.0 的子文件夹中。在开发过程中,我们倾向于进行大量的小
自 ClickOnce每个配置文件而不是每台计算机安装,有没有办法同时从多个配置文件卸载单个 ClickOnce 客户端应用程序? 我们有一个 ClickOnce 应用程序,我们希望使用标准 MSI
对于不同的环境,我们有多个具有不同配置文件的相同程序集的部署。我们将这些打包成具有不同部署标识(Program_ENV1、Program_ENV2 等)的单独 ClickOnce 部署。 应用程序标识
我有一个简单的 WinForms 应用程序,我正在使用 ClickOnce 在内部部署它。主应用程序有一个依赖程序集,该程序集有一些 xml 模板文件在构建属性中标记为“内容”和“始终复制”,但是如果
有没有办法在不提示用户的情况下安装 ClickOnce 应用程序?我说的是用户第一次运行应用程序时得到的“运行/不运行”。 似乎有一些线索here但我相信这是关于跳过“海拔”(UAC)和安全提示,而不
我有一个 ClickOnce 应用程序,在它安装到客户端机器上后,它第一次启动时会创建文件夹 X、Y 和 Z。 现在,当用户开始使用应用程序时,他/她会在这些文件夹中创建各种文件。稍后应用程序的新版本
有没有一种方法(hacky 可以)允许用户返回到 ClickOnce 的先前版本网络部署的应用程序? 我查看了文档和API,似乎没有办法。您可以选择性地选择是否要更新,但一旦更新,似乎就无法返回。 最
我了解 ClickOnce 应用程序可以自动更新。但是,Microsoft 提供的选项并不是我想要的。 如果我在应用程序启动前检查版本,启动会比较慢。 如果我在应用程序启动后检查版本,直到下次启动时我
在我的 ClickOnce c# 应用程序中,如何判断用户是否刚刚更新了应用程序?我愿意在用户下载更新后显示发行说明或更改日志。 我知道如何以编程方式(拼写?)检测更新是否可用,并手动执行更新。那时我
为我的 ClickOnce 应用程序的用户提供降级到以前版本的方法的推荐方法是什么? (以防新版本不能在他们的机器上运行) 最佳答案 在 ClickOnce 部署设置中,将最低要求版本保留为旧版本。这
我了解 ClickOnce 应用程序可以自动更新。但是,Microsoft 提供的选项并不是我想要的。 如果我在应用程序启动前检查版本,启动会比较慢。 如果我在应用程序启动后检查版本,直到下次启动时我
众所周知,当我们双击已安装的 clickonce 应用程序时,会弹出一个“clickonce 屏幕”,上面写着“正在验证系统要求”。然后如果服务器中有更新版本,clickonce 更新本地安装的版本,
我即将部署一个 ClickOnce 应用程序供内部使用。我将亲自将应用程序分发给一组受信任的用户。我知道可以对 ClickOnce list 进行签名,但是当用户信任来源时是否需要签名? 不签署 li
我们非常接近以 ClickOnce 部署的形式发布我们的第一个产品,但是有几个烦人的问题我似乎无法解决...... 我知道在 ClickOnce 部署 list 中,ClickOnce 需要 Wind
我正在为客户端开发一个 Windows .NET 4 桌面应用程序,并且正在考虑使用 ClickOnce从客户的网站部署它。我还计划从他们的网站部署应用程序版本升级。 我已经阅读了 StackOver
我是一名优秀的程序员,十分优秀!