我如何更新已过期的ClickOnce证书?

34

我需要对一个ClickOnce应用程序进行修改,但已经有一年没有接触过它了,因此证书已过期。

我已经了解到使用新证书发布将导致应用程序失败,因为它将由不同的密钥签名。

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

5个回答

18
如果您想快速解决问题,您可以“续订”现有证书并将其有效期延长。Cliff Stanford已经简化了微软的“解决方法”,并将其作为一个简单的命令行exe文件提供 - 可在此处获取:http://may.be/renewcert/ - Cliff干得好!

7
提醒一下,这个方法还存在几个问题。你可能需要查看这篇文章:http://robindotnet.wordpress.com/2010/01/26/how-to-extend-an-existing-certificate-even-if-it-has-expired/ - RobinDotNet
2
我知道这很老,但它(相当荒谬地)仍然是一个问题。如果一位同事已经创建了一个新证书(因此“延长”了一年),但当我们去发布时,它会警告签名已更改。这是一个巨大的问题,因为一旦签名更改,客户端就无法再接收更新:“无法更新应用程序。请联系供应商。”或其他类似信息。如果他们手动重新安装,它将创建“名称-1”的图标/链接。 - Keith
renewcert工具通常需要某些VC++依赖项才能正常工作,如果你遇到无法解决的问题,可以手动编译和运行另一个工具,请参见https://dev59.com/KXVC5IYBdhLWcg3weBE-#54120387。 - Sogger
2
链接已失效。看起来该项目已经移至GitHub?https://github.com/andreasbotsikas/RenewCert - Ama

9
这是关于证书过期的权威MSDN文章,其中还包括一个RenewCert更新链接。http://msdn.microsoft.com/en-us/library/ff369721.aspx 这篇文章涵盖了所有情况。
如果您的目标是.NET 3.5,使用自动更新,并且没有VSTO应用程序,或者您的目标是.NET 4,更改证书不会给您带来任何问题。

的确如此! - Peter Mortensen
1
这个链接已经失效了。我讨厌微软不断地让它们的URL失效,好像任何超过几年的有价值信息都很难访问到。 - Mark Ransom
1
链接已经恢复。 - Edo

7

更新:@OceanAirdrop已经完成以下所有工作,并将其放在github上提供:https://github.com/OceanAirdrop/ExtendClickOnceCertificate,他在readme登陆页面上有使用说明。


原始详细信息:

如@Andy Blackman所述,更新pfx是正确的方法,但是renewcert在我尝试使用它时在现代windows上运行时存在问题。为了解决may.be/renewcert依赖关系,另一位开发者用C#重写了它,因此您可以在现代Visual Studio上使用它:

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

从该网站下载源代码,进行编译和运行。


如果在CertNameToStr的wcslen封送中出现“system.accessviolationexception”错误,则进行以下更改,以便封送不会崩溃:

  1. In Crypt.cs:Line 130 change the psz variable to use char[] instead of string:

     [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. In Program.cs:Line 131 use a char buffer instead of a string:

    -                //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. rebuild

如果只需快速更新默认五年的证书,请使用以下命令:

"[path-to-renew-cert-proj-dir\bin\Debug\]renewCert.exe" [old-cert-path\]old_cert_name.pfx [new-cert-path\]new_cert_name.pfx

4
谢谢。这对我有用。我采用了上述代码,并添加了您的修复并将到期日期增加了105年。您可以在此处找到该项目的GitHub链接: https://github.com/OceanAirdrop/ExtendClickOnceCertificate - Ocean Airdrop
1
@OceanAirdrop 很好!我会把它放在我的答案顶部! - Sogger
主要感谢您 @Sogger,因为您找到了原始解决方案。对我帮助巨大! - Ocean Airdrop
2
这太有趣了。那是我在nathanpjones.com上的原始代码,当我遇到同样的问题时,你的答案就出现了。世界真小!感谢大家的修复。 - N Jones
我正在尝试使用这个工具来扩展我的SHA256测试证书,但它总是生成SHA1。有人知道如何告诉它使用SHA256吗? - bkqc

1

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

我想自动更新在这些版本之间出了问题,但没有造成持久性的损害。可能有所帮助的是,我的应用程序仅供内部使用,所以我不需要一个正式签名的证书。


1

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


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