【问题标题】:How can I renew my expired ClickOnce certificate?如何续订过期的 ClickOnce 证书?
【发布时间】:2019-05-22 01:51:41
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 这有几个问题,仅供参考。可能想检查一下。 robindotnet.wordpress.com/2010/01/26/…
    • 我知道这很老,但它(非常荒谬)仍然是一个问题。如果一个同事已经创建了一个新证书(因此“延长”了一年),但是当我们去发布时,它会警告签名发生变化。这是一个大问题,因为一旦签名发生变化,客户端将无法再收到更新:“无法更新应用程序。请联系供应商。”或者其他的东西。如果他们再次手动安装它,它将创建“名称 -1”图标/链接。
    • 如果没有某些 VC++ 依赖项,renewcert 工具通常无法工作,如果您遇到无法弄清楚的情况,您可以手动编译并运行另一个工具,请参阅stackoverflow.com/a/54120387/579234
    • 链接已失效。看起来该项目已移至 GitHub? github.com/andreasbotsikas/RenewCert
    【解决方案2】:

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

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

    【讨论】:

    • 确实如此! (定)
    • 链接已失效。我讨厌微软如何不断杀死他们的 URL,似乎任何超过几年的好信息都可能无法访问。
    • 链接又恢复了。
    【解决方案3】:

    更新:@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: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. 重建

    要运行它以快速将证书更新为默认五年,请使用如下 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
    

    【讨论】:

    • 谢谢..这对我有用。我采用了上述代码,添加了您的修复程序并将到期日期延长了 105 年。您可以在 github 上找到该项目:github.com/OceanAirdrop/ExtendClickOnceCertificate
    • @OceanAirdrop 不错!我会把它放在我的答案之上!
    • 主要感谢您@Sogger,因为您找到了原始解决方案。帮了我很多忙!
    • 这很有趣。那是我在 nathanpjones.com 上的原始代码,当我遇到同样的问题时,你的答案就是。小世界!感谢大家的修复。
    • 我正在尝试使用此工具来扩展我的 SHA256 测试证书,但它始终生成为 SHA1。任何人都知道如何告诉它使用 SHA256?
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-04
        • 1970-01-01
        相关资源
        最近更新 更多