如何续订过期的ClickOnce证书?

时间:2008-11-11 09:53:50

标签: c# visual-studio visual-studio-2008 clickonce

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

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

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

5 个答案:

答案 0 :(得分:14)

如果您正在寻求快速解决方案,那么您可以“续订”现有证书,并为其提供更长的到期日期。

Cliff Stanford已经清理了微软的“变通方法”,并将其作为一个简单的命令行exe提供 - 可在此处获取:http://may.be/renewcert/ - 好工作Cliff!

答案 1 :(得分:8)

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

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

答案 2 :(得分:2)

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


原始详细信息:

续订pfx是@Andy Blackman所说的方法,但是当我尝试使用renewcert时,它在现代Windows上运行时会出现问题。为了修复may.be/renewcert依赖关系,另一个人用C#重写了它,因此您可以在现代的Visual Studio中使用它:

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

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


如果在wcslen的CertNameToStr中进行编组时遇到“ system.accessviolationexception”,请进行以下更改,以使编组不会爆炸:

  1. 在Crypt.cs:第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:第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. 重建

要运行该证书以快速将证书更新为默认五年,请使用以下cmd:

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

基本上,您必须构建一个应用程序来延长证书的到期时间。上面的链接将为您提供应用程序的C ++源代码。如果你很幸运并且自己签了它可能会有用。如果您使用Verisign等签名,那么您就是SOL。您需要卸载并重新安装每个应用程序。这就像你购买一辆新车发动机爆炸,制造商给你一本关于重建发动机的书,而不是更换或修理它。 ClickOnce不是。