我正在尝试确定使用Bouncy Castle,托管代码或来自C#的非托管代码对可执行文件进行代码签名的最佳方法.由于CAPICOM现已弃用,我想mssign32.dll中的一个SignerSign方法是最好的方法,如果它需要不受管理.
这个答案(/sf/answers/276656481/)似乎很接近,但它产生一个.p7m文件,虽然看起来是正确的大小,但是无法正常运行(显然在运行之前重命名为.exe) ).
问题提供者在这里提供的解决方案(用于替换signtool.exe的API /库)看起来很有前途和管理,但就像Tom Canham在下面的评论中提到的那样,"这似乎是用于签署封装消息.Authenticode - 代码 - 签署signtool所做的 - 是不同的,这就是为什么签署后EXE不会运行的原因." 当我使用提问者的解决方案或之前引用的Bouncy Castle解决方案签名时,我收到了Tom所做的相同错误.
我还没有尝试过唯一的选择(/sf/answers/450090231/),虽然看起来很有希望,但我并不认为它使用"authenticode"代码签名而不是"封闭的消息"代码签名.这个答案也有不使用现在已弃用的CAPICOM互操作方法的好处,所以我想我今天将使用这种方法报告我的结果.如果这是最好的选择,那么有人可以说出从mssign32.dll导出的SignerSign,SignerSignEx和SignerSignEx2函数之间的区别吗?我已经读过SignerSignEx2应该与Windows 8及更高版本一起使用...
长话短说,我想复制signtool.exe签署.exe文件,.pfx文件和密码的可执行文件的能力,如下所示:
signtool sign /f cert.pfx /p password application.exe
Run Code Online (Sandbox Code Playgroud)
我正在寻找使用authenticode签名以编程方式对可执行文件进行代码签名(PE,如果它很重要)的最佳选项,如果可能的话,我宁愿使用充气城堡或托管代码,尽管我会使用非托管的东西,如果它工作但不是目前已弃用.
谢谢!
我在.NET 3.0 C#应用程序中使用CAPICOM来检查exe文件上的Authenticode签名.我需要确保证书列为可信发布者.signedCode.Verify(true)如果证书尚未受信任,则使用将显示对话框,因此用户可以选择是否这样做.但是,signedCode.Verify(false)即使它不是来自受信任的发布者,也要验证签名 - 可能这只是检查证书是否有效.
如何在没有UI的情况下检查文件上的签名是否来自有效且受信任的证书?
我正在尝试确定存储在远程Windows(2k3/2k8)计算机上的证书私钥的文件名,并且遇到了一些困难.我也不熟悉微软的CryptAPI,所以我正在寻找你能提供的任何帮助.
此练习的目的是查找在远程计算机上安装了符合特定条件的私钥的证书,并确保为其私钥文件分配了正确的权限.虽然我可以在文件夹级别分配权限,但我更愿意仅在必要时在私钥文件级别分配权限(出于显而易见的原因).
这是方案,假设具有类似管理权限的服务帐户正在访问证书存储:
我使用p/invoke使用C#中的以下调用来检索远程证书存储:
[DllImport("CRYPT32",EntryPoint ="CertOpenStore",CharSet = CharSet.Unicode,SetLastError = true)] public static extern IntPtr CertOpenStore(int storeProvider,int encodingType,int hcryptProv,int flags,string pvPara);
IntPtr storeHandle = CertOpenStore(CERT_STORE_PROV_SYSTEM,0,0,CERT_SYSTEM_STORE_LOCAL_MACHINE,string.Format(@"\ {0} {1}",serverName,name));
然后,我使用CertEnumCertificatesInStore来检索我要评估的证书.
[DllImport("CRYPT32",EntryPoint ="CertEnumCertificatesInStore",CharSet = CharSet.Unicode,SetLastError = true)] public static extern IntPtr CertEnumCertificatesInStore(IntPtr storeProvider,IntPtr prevCertContext); IntPtr certCtx = IntPtr.Zero; certCtx = CertEnumCertificatesInStore(storeHandle,certCtx);
如果证书符合我的标准,我从CertEnumCertificatesInStore调用返回的IntPtr创建一个X509Certificate2实例,如:
X509Certificate2 current = new X509Certificate2(certCtx);
一旦我拥有了我感兴趣的证书的X509Certificate2实例,我就会调用CryptAcquireCertificatePrivateKey来获取私钥提供者:
[DllImport("crypt32",CharSet = CharSet.Unicode,SetLastError = true)] internal extern static bool CryptAcquireCertificatePrivateKey(IntPtr pCert,uint dwFlags,IntPtr pvReserved,ref IntPtr phCryptProv,ref int pdwKeySpec,ref bool pfCallerFreeProv);
// cert是X509Certificate2
CryptAcquireCertificatePrivateKey(cert.Handle,0,IntPtr.Zero,ref hProvider,ref _keyNumber,ref …
我有一个在浏览器中签署文本字符串的Javascript.它在Internet Explorer下使用CAPICOM,在Mozilla浏览器下使用window.crypto.签名过程后,我收到一个BASE64编码签名.
使用HTTPS我将签名和文本字符串上传到带有PHP应用程序的Web服务器.从SSL(HTTPS)我收到用户的证书.从这个证书我可以提取用户的公钥.
现在我想验证签名文本字符串的签名以及用户的证书和公钥.我试过openssl_verify PHP函数没有成功.
我总是收到一个错误:
错误:0408D077:rsa例程:FIPS_RSA_VERIFY:签名长度错误
不幸的是我无法验证签名?我无法提供演示或示例,因为它目前仅在本地网络中.
javascript php digital-certificate capicom digital-signature
capicom ×4
c# ×3
.net ×1
authenticode ×1
bouncycastle ×1
javascript ×1
php ×1
rsa ×1
winapi ×1