代码之家  ›  专栏  ›  技术社区  ›  HAdes

如何续订过期的ClickOnce证书?

  •  25
  • HAdes  · 技术社区  · 16 年前

    我需要对一个ClickOnce应用程序做一些更改,我已经一年多没有接触过它了,因此证书已经过期了。

    我已经读到使用新证书发布将导致应用程序失败,因为它将使用其他密钥进行签名。

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

    5 回复  |  直到 6 年前
        1
  •  14
  •   Andy Blackman    13 年前

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

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

        2
  •  8
  •   RobinDotNet    13 年前

    这是关于证书过期的最终的msdn文章,其中还包括一个到renewcert更新的链接。 http://msdn.microsoft.com/en-us/library/ff369721.aspx 这涵盖了所有情况。

    如果您以.NET 3.5为目标,使用自动更新,并且没有VSTO应用程序,或者以.NET 4为目标,则更改证书不会导致任何问题。

        3
  •  1
  •   Dan    16 年前

    基本上,您必须构建一个应用程序来延长证书的有效期。上面的链接将为您提供应用程序的C++源代码。如果你运气好,而且自己签了名,那就行了。如果你用Verisign等签名,你就是Sol。您需要卸载并重新安装每个应用程序。就好像你买了一辆新车,发动机坏了,制造商给你一本关于重新制造发动机的书,而不是更换或修理它。ClickOnce不是。

        4
  •  1
  •   Peter Mortensen Sumit Kumar    11 年前

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

    我认为自动更新在这些版本之间中断了,但是没有持久的损坏。我的申请只供内部使用可能会有所帮助,所以我不需要一个正确签名的证书。

        5
  •  0
  •   Sogger    6 年前

    正如@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