使用pfx进行C#代码签名

4
我觉得这不应该很难,但我试了很多方法,却没有一种方法能够让我成功。我正在尝试使用.pfx文件为WPF程序集签名。如果我使用原始文件,会弹出“无法找到用于解密的证书和私钥”错误。如果我导入密钥并取消勾选“如有可能,包括证书路径中的所有证书”,那么似乎可以工作。然而,当我构建时,会出现“错误1:无法导入以下密钥文件:my_key.pfx。密钥文件可能受到密码保护。要更正,请再次尝试导入证书或手动使用以下密钥容器名称将证书安装到Strong Name CSP中”错误。我可以轻松地为ClickOnce清单签名,但无法为程序集签名。如何使此项工作?

仅为了缩小范围,您是否尝试使用另一个pfx文件进行签名?这将有助于确定是否可能是一个非常奇怪的VS错误或原始pfx文件的某些独特问题。 - Mark Rucker
我已经尝试过由VS生成的测试密钥,它有效。这实际上是我唯一拥有的其他类型的密钥。 - thecaptain0220
以下是制作自己的pfx文件的逐步说明,使用来自Microsoft的两个命令行工具(http://msdn.microsoft.com/en-us/library/ff699202.aspx)。您需要从第二个标题(“创建测试证书”)开始按照说明进行。 - Mark Rucker
2个回答

10
我曾经遇到过类似的问题,多年使用C#开发(VS 2005到2012),一直没有找到在项目属性中使用认证机构的.pfx文件进行代码签名的方法。有关代码签名的程序集属性和项目设置似乎都会互相干扰,而且都无法工作。项目属性表单要求输入pfx的密码(似乎无法存储),然后签名失败,因为密码错误。我怀疑MS从未真正使用过这个代码签名功能购买证书,只是用VS本地创建的自签名证书。

如果您想混淆代码,您还必须在混淆之后签署它,因此即使这些方法有效,您也不能使用任何方法。

我唯一可靠的解决方案是将signtool.exe用作后期构建步骤。一旦您设置好了这个,您可能就不再关心是否有更好的方法了。

当您购买证书时,通常会直接安装到PC的证书存储中,因此您可以直接从存储中在后期构建步骤中使用它进行代码签名,类似于以下内容:

"C:\Program Files (x86)\Windows Kits\8.0\bin\x64\signtool" sign
    /n CertificateName
    /tr http://timestamp.comodoca.com/rfc3161
    "$(TargetPath)"

注意事项:

  • 您可能需要搜索以找到signtool.exe在您的PC上的位置,并使用最新版本的SDK中的signtool.exe来获取最新版本 - 您必须在后期构建命令中使用完整路径才能使其正常工作
  • "CertificateName"是您购买的证书名称,在您的个人证书存储中
  • 这里的URL是一个示例(在本例中为Comodo的时间戳服务器),只需将其更改为您自己提供程序的服务器即可

或者使用.pfx文件执行此操作:

"C:\Program Files (x86)\Windows Kits\8.0\bin\x64\signtool" sign
    /f CertificateFile.pfx /p Password
    /tr http://timestamp.comodoca.com/rfc3161
    "$(TargetPath)"

(其中CertificateFile.pfx是pfx文件,"Password"是使用该文件的密码。要从证书存储中获取pfx文件,请运行"certmgr.msc"并查找证书(可能在个人\Certificates中),右键单击选择所有任务>导出...)

非常简单。为什么互联网上没有任何人(比如销售这些东西的认证机构)一开始就简单地说这个?!


1
我曾经可以使用我们旧的.pfx文件(用于ClickOnce和Strong Name)进行签名 - 在到期和续订(通过GoDaddy)之后,我再也无法弄清楚如何构建.pfx文件了。使用我获取/重新构建的新文件后,它停止工作了。唉。 - BrainSlugs83

0

如果您使用Cygwin或WSL,您也可以像这样创建一个示例密钥:

user@DevLaptop /tmp
$ openssl genrsa -des3 -out www.mycompany.com.key 1024
Generating RSA private key, 1024 bit long modulus (2 primes)
.+++++
.+++++
e is 65537 (0x010001)
Enter pass phrase for www.mycompany.com.key:
Verifying - Enter pass phrase for www.mycompany.com.key:

user@DevLaptop /tmp
$ openssl req -new -key www.mycompany.com.key -out www.mycompany.com.csr
Enter pass phrase for www.mycompany.com.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:HK
State or Province Name (full name) []:HKSAR
Locality Name (eg, city) [Default City]:Hong Kong
Organization Name (eg, company) [Default Company Ltd]:My Company
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:My Company

user@DevLaptop /tmp
$ openssl x509 -req -days 365 -in www.mycompany.com.csr -signkey www.mycompany.com.key -out www.mycompany.com.crt
Signature ok
subject=C = CA, ST = AB, L = Hong Kong, O = My Company
Getting Private key
Enter pass phrase for www.mycompany.com.key:

user@DevLaptop /tmp
$ ls *.key
www.mycompany.com.key

user@DevLaptop /tmp
$ openssl pkcs12 -export -out MyCompany.pfx -inkey www.mycompany.com.key -in www.mycompany.com.crt -certfile www.mycompany.com.crt
Enter pass phrase for www.mycompany.com.key:
Enter Export Password:
Verifying - Enter Export Password:

请参阅以下详细信息:

如何将.crt证书文件转换为.pfx

https://www.thegeekstuff.com/2009/07/Linux-Apache-mod-ssl-generate-key-csr-crt-file/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接