Как я могу продлить мой истекший сертификат ClickOnce? - PullRequest
28 голосов
/ 11 ноября 2008

Мне нужно внести некоторые изменения в приложение ClickOnce, к которым я не обращался более года, и поэтому срок действия сертификата истек.

Я читал, что публикация с новым сертификатом приведет к сбою приложения, поскольку оно будет подписано другим ключом.

Поэтому я думаю, что мне нужно использовать тот же сертификат, но не знаю, как его обновить.

Ответы [ 5 ]

14 голосов
/ 03 февраля 2011

Если вам нужно быстрое решение, вы можете «продлить» существующий сертификат и просто продлить срок его действия.

Клифф Стэнфорд исправил "обходной путь" Microsoft и сделал его доступным в виде простой командной строки exe - доступно здесь: http://may.be/renewcert/ - Отличная работа Клифф!

8 голосов
/ 08 февраля 2011

Вот исчерпывающая статья MSDN об истечении срока действия сертификата, которая также содержит ссылку на обновление RenewCert. http://msdn.microsoft.com/en-us/library/ff369721.aspx Это относится ко всем случаям.

Если вы нацелены на .NET 3.5, используете автоматические обновления и у вас нет приложения VSTO, ИЛИ вы нацеливаетесь на .NET 4, изменение сертификата не вызовет проблем.

2 голосов
/ 10 января 2019

Обновление: @OceanAirdrop сделал всю работу ниже и сделал ее доступной на github: https://github.com/OceanAirdrop/ExtendClickOnceCertificate, у него есть инструкции по использованию на целевой странице readme.


Оригинальные детали:

Обновление pfx - это путь, о котором говорит @ Энди Блэкман, но когда у меня возникли проблемы с работой в современных окнах, в компаний renewsert возникли проблемы. Чтобы исправить зависимости may.be/renewcert, другой парень переписал ее на C #, чтобы вы могли использовать ее в современной Visual Studio:

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

Загрузите исходный код со своего веб-сайта, скомпилируйте и запустите.


Если вы получаете «system.accessviolationexception» при сортировке в CertNameToStr для wcslen, то внесите следующие изменения, чтобы сортировка не взорвалась:

  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 использует буфер символов вместо строки:

    -                //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
1 голос
/ 25 ноября 2008

По сути, вам нужно создать приложение, чтобы продлить срок действия вашего сертификата. Ссылки выше приведут вас к исходному коду C ++ для приложения. Если вам повезло и вы только что подписали это, это может сработать. Если вы использовали Verisign и т. Д., Чтобы подписать его, вы СОЛ. Вам нужно будет удалить и переустановить каждое приложение. Это похоже на то, как если бы вы купили новый автомобиль, двигатель которого дует, а производитель дает вам книгу о восстановлении двигателей, а не о замене или ремонте. ClickOnce нет.

1 голос
/ 22 ноября 2008

Если я правильно помню, я столкнулся с той же проблемой и просто создал новый сертификат.

Я думаю, что автоматическое обновление сломалось между этими версиями, но не было никакого длительного повреждения. Возможно, помогло бы то, что мое приложение предназначалось только для внутреннего использования, поэтому мне не требовался должным образом подписанный сертификат.

...