33

我需要对一年多没有接触过的 ClickOnce 应用程序进行一些更改,因此证书已过期。

我读过使用新证书发布会使应用程序失败,因为它将使用不同的密钥进行签名。

因此我认为我需要使用相同的证书,但不知道如何更新它。

4

5 回答 5

18

如果您正在寻求快速解决方案,那么您可以“更新”您现有的证书,并给它一个更长的到期日期。

Cliff Stanford 已经清理了 Microsoft 的“解决方法”,并将其作为一个简单的命令行 exe 提供 - 可在此处获得:http: //may.be/renewcert/ - 干得好 Cliff !

于 2011-02-03T16:16:33.753 回答
9

这是有关证书到期的权威 MSDN 文章,其中还包括指向 RenewCert 更新的链接。http://msdn.microsoft.com/en-us/library/ff369721.aspx这涵盖了所有情况。

如果您的目标是 .NET 3.5,使用自动更新,并且没有 VSTO 应用程序,或者您的目标是 .NET 4,那么更改证书不会给您带来任何问题。

于 2011-02-08T06:40:32.773 回答
7

更新:@OceanAirdrop 完成了以下所有工作并在 github 上提供了它:https ://github.com/OceanAirdrop/ExtendClickOnceCertificate ,他在自述文件登录页面上有使用说明。


原始细节:

正如@Andy Blackman 所说,更新 pfx 是一种方法,但是当我尝试使用它时,renewcert 在现代 Windows 上运行时出现问题。为了修复 may.be/renewcert 依赖项,另一个人用 C# 重写了它,以便您可以在现代 Visual Studio 上使用它:

https://nathanpjones.com/2013/01/renewing-temporary-certificate/

从他的网站下载源代码,编译并运行。


如果您在 Wcslen 的 CertNameToStr 中的编组中收到“system.accessviolationexception”,请进行以下更改,以免编组崩溃:

  1. 在 Crypt.cs:Line 130 中,将 psz 变量更改为使用 char[] 而不是字符串:

     [DllImport("crypt32.dll", CharSet = CharSet.Auto)]
    -        internal static extern int CertNameToStr(X509Encoding dwCertEncodingType, ref CRYPT_DATA_BLOB pName, CertNameType dwStrType, ref string psz, int csz);
    +        internal static extern int CertNameToStr(X509Encoding dwCertEncodingType, ref CRYPT_DATA_BLOB pName, CertNameType dwStrType, [In, Out] char[] psz, int csz);
    
  2. 在 Program.cs:Line 131 中使用 char 缓冲区而不是字符串:

    -                //var buffer = new char[1024];
    -                string buffer = new string('\0', 1024);
    +                char[] buffer = new char[1024];
    +                //string buffer = new string('\0', 1024);
                     int d;
    -                if ((d = Crypt.CertNameToStr(Crypt.X509Encoding.ASN_Encodings, ref certNameBlob, Crypt.CertNameType.CERT_X500_NAME_STR, ref buffer, 1024 * sizeof(char))) != 0)
    +                if ((d = Crypt.CertNameToStr(Crypt.X509Encoding.ASN_Encodings, ref certNameBlob, Crypt.CertNameType.CERT_X500_NAME_STR, buffer, 1024 * sizeof(char))) != 0)
    
  3. 重建

要运行它以快速将证书更新为默认五年,请使用如下命令:

"[path-to-renew-cert-proj-dir\bin\Debug\]renewCert.exe" [old-cert-path\]old_cert_name.pfx [new-cert-path\]new_cert_name.pfx
于 2019-01-10T00:23:47.983 回答
1

如果我没记错的话,我遇到了同样的问题,只是创建了一个新证书。

我认为这些版本之间的自动更新中断了,但没有持久的损害。我的应用程序仅供内部使用可能会有所帮助,因此我不需要正确签名的证书。

于 2008-11-21T23:01:05.430 回答
1

基本上,您必须构建一个应用程序来延长证书的有效期。上面的链接将带您访问该应用程序的 C++ 源代码。如果你很幸运并且只是自己签名,它可能会起作用。如果您使用 Verisign 等进行签名,您就是 SOL。您将需要卸载并重新安装每个应用程序。这就像你买了一辆新车,引擎坏了,制造商给你一本关于重建引擎的书,而不是更换或修理它。ClickOnce 不是。

于 2008-11-25T02:55:29.917 回答