我创建了一个包含许多*.exe
文件的应用程序.我把它们打包成我在我网站上托管的NSIS安装程序.当我尝试下载时,Chrome会将其视为潜在恶意攻击.起初我以为它可能是我托管的URL /站点未被识别,所以我注册了Amazon S3存储并将文件移到那里.同样的问题.然后我认为打包可执行文件可能会导致这种情况,所以我试着没有.
同样的问题.
经过一些阅读后,我决定尝试签署可执行文件以及安装程序包EXE.
我创建了一个dev证书如下:
makecert
pvk2pfx
signtool"http://timestamp.verisign.com/scripts/timstamp.dll" *.exe
Run Code Online (Sandbox Code Playgroud)
仍然是恶意的...我甚至在下载后检查了exe,并确认他们有一个数字签名标签,授予它不是一个完全验证的商业证书,但我不能相信Chromes半生不熟的代码分析的唯一方法是花200美元一个签发verisign等代码签名证书的一年?
我有什么想法可以改变我正在做的事情来避免这个令人讨厌的消息?
我们最近购买了DigiCert EV代码签名证书.我们可以使用signtool.exe来签署.exe文件.但是,每次我们签署文件时,都会提示输入SafeNet eToken密码.
如何在没有用户干预的情况下通过在某处存储/缓存密码来自动执行此过程?
passwords code-signing authenticode code-signing-certificate
我有一个程序被很多人使用,他们并不总是精通计算机.我想确保不是让我的可执行文件说它来自一个不知名的作者,而是说它是由我签名的.
据我所知,这可以通过Microsoft Authenticode完成.我知道我需要一个证书才能做到这一点,并且正在以合理的价格寻找一个.我偶然发现了Microsoft Authenticode证书页面.
看起来GlobalSign拥有我需要的一切.他们的证书有什么经验,还是有更好的公司?对于第一次这样做的人有什么好的教程吗?
EV Code签名证书或Microsoft Authenticode的代码签名证书
我开发了一个免费的个人理财申请.这对我来说是一种爱好.我在我的网站上下载了它.http://moneyble.com/download/
我经常(一个月左右)发布一个新版本.所以文件的哈希值发生了变化.
当从我的网站下载文件时,浏览器会显示一条警告,指出该文件通常不会被下载并且可能存在危险.此外,在Windows 8计算机上弹出SmartScreen警告.
这两个警告都会杀死试图下载我的软件的任何新用户.
我阅读了一些有关代码签名的文章,并意识到我必须购买代码签名证书.向微软支付发布我自己软件的权利听起来很愚蠢.就像他们拥有互联网一样.但无论如何......他们制定了规则.
题:
我应该在EV代码签名证书上花500美元吗?
要么
我可以购买更便宜(100美元至200美元)的Microsoft Authenticode证书,并且仍然可以摆脱这两种警告(下载和吸吮屏幕)吗?
我的exe-s目前没有MS的声誉.我经常更新exe-s.用户群从0开始慢慢增长.
有人有现实生活吗?
虽然如何签署拉链包装仍然不知道.我也提供了我的程序的便携式安装.如果您在谷歌浏览器上下载便携式zip包 - 它会显示一条令人讨厌的消息"Moneyble.zip通常不会被下载并且可能很危险".该包中的exe已签名.但它没有帮助.IE没有这个问题.这只是Google Chrome的问题.
如果有人对如何分发便携式设备有任何建议 - 我真的很感激.
如果要检查警告,请从以下网址下载其中一个安装程序:http: //moneyble.com/download/
我们需要使用signtool.exe使用SHA1和SHA2双重签名我们的二进制文件,我们的证书支持256位SHA2.
使用Windows 8 SDK的signtool:
例如:
signtool.exe签名/ as/fd sha256/t http://timestamp.verisign.com/scripts/timstamp.dll/f"certificate.pfx"/ p XXXXXXX"file.dll"
(XXXXXXX是我们的证书密码)
因为神秘错误而失败:
SignTool错误:SignedCode :: Sign返回错误:0x80070057参数不正确.SignTool错误:尝试签名时发生错误:file.dll
在没有时间戳的情况下进行签名,单独签名为SHA1或SHA256可以正常工作,但是我们需要双重签名,并且想象没有时间戳是不行的.
我已经尝试了32位和64位版本的signtool.exe,在Win7和Win8机器上试过它,并尝试使用命令行选项,但无济于事.以前有人打过这个问题吗?
试图了解authenticode代码签名和强命名.
我是否正确地认为,如果我对引用一些dll(不是强名称)的exe进行代码签名,恶意用户可以替换我的DLL并以一种看起来像是由我签名但正在运行的方式分发应用程序他们的代码?
假设这是真的,看起来你真的不想在没有强烈命名整个事情的情况下签署.NET应用程序,否则你会让人们能够在你编写的应用程序的幌子下执行代码?
我不确定的原因是,我在网上找到的文章(包括使用SN + Authenticode的MSDN文档)似乎都没有提到这一点,这似乎是一个相当重要的理解点(如果我理解正确) ?
我们需要验证二进制文件是否使用数字签名(Authenticode)正确签名.这可以通过signtool.exe轻松实现.但是,我们需要一种自动方式来验证签名者名称和时间戳.这在使用CryptQueryObject()
API的本机C++中是可行的,如以下精彩示例所示:如何从Authenticode签名的可执行文件获取信息
然而,我们生活在一个托管的世界:)因此寻找相同问题的C#解决方案.直接的方法是pInvoke Crypt32.dll,一切都完成了.但是System.Security.Cryptography.X509Certificates
Namespace中有类似的托管API .X509Certificate2
类似乎提供了一些信息但没有时间戳.现在我们来到原始问题,我们如何才能在C Sharp中获得数字签名的时间戳?
我公司从Go Daddy 购买了驾驶员签名证书.我用它来签署一个简单的INF文件,它是我们使用微软usbser.sys的一些USB设备的驱动程序.一切似乎都在我签名的Windows 7 64位计算机上运行:如果我右键单击INF文件并选择"安装",那么我看到的第二个警告是显示正确的发布者名称的良好警告:
但是,如果我转到另一台计算机(Windows Vista 64位),右键单击INF文件,然后选择"安装",然后我收到此错误消息:
这让我觉得我的驱动程序没有正确签名,并且它在我的计算机上看起来很好的唯一原因是因为我在Go Daddy的安装过程中安装了一些root/intermediate/cross证书.我绝对希望我的用户能够看到我们是经过验证的发布者,而无需在他们的计算机上手动安装证书.
INF文件和.cat文件位于同一目录中.
有谁知道为什么会这样,以及我如何解决它?
我怀疑主要问题是我在运行时遇到此错误signtool verify /v pololu.cat
(下面有更多详细信息),我还没弄清楚原因:
SignTool错误:已处理证书链,但终止于信任提供程序不信任的根证书.
该驱动程序签名证书是从去爸爸一个新的产品,他们在几个星期前推出.我不完全确定它与代码签名证书有何不同,但价格相同.我按照Go Daddy网站上的说明下载并安装证书,但说明与现实完全不符.在步骤1中安装Microsoft Cross证书后,我看到一条红色警告消息说:
在安装证书之前,必须使用Windows Update更新根证书,或者从我们的存储库手动下载并安装根证书.
我不知道该怎么做.我确实从他们的存储库安装了一些GoDaddy根证书,但没有明显区别.
我安装了Windows驱动程序工具包(WDK)的最新版本(8.0),然后安装了适用于Windows 8的Windows软件开发工具包(SDK)的最新版本(8.0).这使我可以访问inf2cat
和signtool
实用程序.这两个套件都是在上个月内发布的,所以我们可能会遇到一些新的漏洞.
在一个新目录中,我放了三个文件:
pololu_usb_to_serial.inf
,我要签署的INF文件.它很长但很简单; 你可以在这里阅读.此INF文件是独立驱动程序; 我们的驱动程序包中不需要其他文件.这个文件基本上与我们公司多年来成功分发(未签名)的版本相同,但我必须对Inf2Cat进行一些更改才能接受它.mscvr-cross-gdroot-g2.crt
,我从Go Daddy证书库下载的.我相信这是证明微软信任"Go Daddy Root Certificate Authority - G2"的交叉证书,但我不完全确定这是否是正确的证书.sign_it.bat
,我运行的批处理文件进行签名.批处理文件只包含:
"C:\Program Files (x86)\Windows Kits\8.0\bin\x86\inf2cat" /v /driver:%~dp0 /os:XP_X86,Vista_X86,Vista_X64,7_X86,7_X64,8_X86,8_X64
"C:\Program Files (x86)\Windows Kits\8.0\bin\x86\signtool" sign …
Run Code Online (Sandbox Code Playgroud) 关于Authenticode签署UWP appxbundle文件,我面临一个相当有趣的问题.
一些背景信息:客户向我们提供了包含签名证书的SafeNet USB令牌.当然,私钥不可导出.我希望能够将此证书用于我们的自动发布版本以对包进行签名.遗憾的是,令牌需要在每个会话中输入一次PIN,因此,例如,如果构建代理重新启动,则构建将失败.我们在令牌上启用了单一登录,因此足以在会话后解锁它.
当前状态:我们可以在appxbundle上使用signtool而不会出现任何问题,因为令牌已被解锁.这种方法运行良好,但一旦重新启动机器或工作站被锁定就会中断.
经过一番搜索,我找到了这段代码.这将获取签名参数(包括令牌PIN)并调用Windows API对目标文件进行签名.我设法编译它并且它完美地用于签署安装包装器(EXE文件) - 令牌没有要求PIN并且由API调用自动解锁.
但是,当我在appxbundle文件上调用相同的代码时,调用CryptUIWizDigitalSign
失败并显示错误代码0x80080209 APPX_E_INVALID_SIP_CLIENT_DATA
.这对我来说是一个谜,因为在同一个包上调用signtool,使用相同的参数/证书可以正常工作,因此证书应该与包完全兼容.
有没有人有这样的经历?有没有办法弄清楚错误的根本原因(我的证书和捆绑包之间不兼容)?
编辑1
回应评论:
我用来调用API的代码(直接来自前面提到的SO问题)
#include <windows.h>
#include <cryptuiapi.h>
#include <iostream>
#include <string>
#pragma comment (lib, "cryptui.lib")
const std::wstring ETOKEN_BASE_CRYPT_PROV_NAME = L"eToken Base Cryptographic Provider";
std::string utf16_to_utf8(const std::wstring& str)
{
if (str.empty())
{
return "";
}
auto utf8len = ::WideCharToMultiByte(CP_UTF8, 0, str.data(), str.size(), NULL, 0, NULL, NULL);
if (utf8len == 0)
{
return "";
}
std::string utf8Str;
utf8Str.resize(utf8len);
::WideCharToMultiByte(CP_UTF8, 0, str.data(), str.size(), …
Run Code Online (Sandbox Code Playgroud) 例如,在这里阅读了.NET中的强名称后,我有以下问题:
我们有一个Authenticode代码签名证书,我们用它来签署所有EXE,DLL和MSI文件.这样做的好处是,Windows知道MSI来自可靠的来源,并且如果需要,还可以验证每个文件的真实性.
我们目前不使用.NET强名称.我已经读过,强命名文件本质上意味着它使用自签名证书进行数字签名.我对此的看法是,由受信任的证书颁发机构签名的Authenticode证书比自签名证书更有价值,该证书的真实性无论如何都无法验证,因为它们缺少根证书(我们不打算将其分发给最终用户,是我们!?).
问题:如果已使用Authenticode签名,是否还有其他强命名程序集的值?
authenticode ×10
.net ×3
code-signing ×3
windows ×3
c# ×2
certificate ×2
signtool ×2
strongname ×2
assemblies ×1
cryptography ×1
download ×1
driver ×1
executable ×1
inf ×1
passwords ×1
security ×1
sha256 ×1
signature ×1
signing ×1
uwp ×1
verisign ×1
winapi ×1