4

我觉得这不应该那么难,但我要疯了才能让它发挥作用。我发现了很多不同的东西可以尝试,但似乎没有任何效果。

我正在尝试使用 .pfx 文件对 WPF 程序集进行签名。如果我尝试使用原始文件,我会得到“找不到用于解密的证书和私钥”。

如果我导入密钥并再次导出它,取消选择“如果可能,请在证书路径中包含所有证书”它似乎有效。但是,当我去构建时,我收到“错误 1 ​​无法导入以下密钥文件:my_key.pfx。密钥文件可能受密码保护。要更正此问题,请尝试再次导入证书或手动将证书安装到强名称 CSP具有以下关键容器名称:"

我可以很好地签署 ClickOnce 清单,而不是程序集。关于如何使这项工作的任何建议?

4

2 回答 2

8

我遇到过类似的问题,经过多年的 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)"

笔记:

  • 您可能需要搜索以查找您 PC 上的 signtool.exe 的位置,并使用您可以找到的最新 SDK 版本中的那个来获取它的最新版本 - 您必须在后期使用完整路径 -构建命令使其工作
  • “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”并找到证书(可能在 Personal\Certificates 中) ,右键单击它并选择所有任务>导出...)

超级容易。为什么互联网上的任何地方都没有人(比如销售这些东西的认证机构)一开始就这么说?!

于 2013-07-18T21:04:55.273 回答
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/

于 2021-07-08T23:51:21.890 回答