web-dev-qa-db-ja.com

期限切れのClickOnce証明書を更新するにはどうすればよいですか?

1年以上触れていないClickOnceアプリケーションにいくつかの変更を加える必要があるため、証明書の有効期限が切れています。

新しい証明書で公開すると、別のキーで署名されるため、アプリケーションが失敗することを読みました。

したがって、同じ証明書を使用する必要があると思いますが、更新方法がわかりません。

28
HAdes

迅速な解決策が必要な場合は、既存の証明書を「更新」して、有効期限を長くすることができます。

Cliff Stanfordは、Microsoftの「回避策」をクリーンアップし、単純なコマンドラインexeとして利用できるようにしました-ここで利用できます: http://may.be/renewcert/ -いい仕事クリフ!

14
Andy Blackman

これは、証明書の有効期限に関する最も信頼のおけるMSDNの記事であり、RenewCertの更新へのリンクも含まれています。 http://msdn.Microsoft.com/en-us/library/ff369721.aspx これはすべての場合をカバーします。

自動更新を使用して.NET3.5をターゲットにしていて、VSTOアプリがない場合、OR .NET 4をターゲットにしている場合、証明書を変更しても問題は発生しません。

8
RobinDotNet

更新:@OceanAirdropは以下のすべての作業を行い、githubで利用できるようにしました: https://github.com/OceanAirdrop/ExtendClickOnceCertificate 、readmeのランディングページに使用方法の説明があります。


元の詳細:

@Andy Blackmanが述べているように、pfxを更新する方法ですが、renewcertを使用しようとすると、最新のWindowsで実行する際に問題が発生します。 may.be/renewcertの依存関係を修正するために、別の人がC#で書き直して、最新のVisualStudioで使用できるようにしました。

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

彼のウェブサイトからソースをダウンロードし、コンパイルして実行します。


WcslenのCertNameToStrのマーシャリングで「system.accessviolationexception」が発生した場合は、マーシャリングが失敗しないように次の変更を加えます。

  1. Crypt.cs:Line 130で、文字列の代わりにchar []を使用するようにpsz変数を変更します。

     [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. 再構築

デフォルトの5年間、証明書をすばやく更新するために実行するには、次のような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
2
Sogger

基本的に、証明書の有効期限を延長するためのアプリを作成する必要があります。上記のリンクから、アプリのC++ソースコードにアクセスできます。運が良ければ、自分で署名しただけでうまくいくかもしれません。ベリサインなどを使用して署名した場合は、SOLです。すべてのアプリをアンインストールして再インストールする必要があります。それはあなたがエンジンが吹く新しい車を買うようなもので、メーカーはあなたにそれを交換したり修理したりする代わりにエンジンを再構築することについての本を与えます。 ClickOnceはそうではありません。

1
Dan

正しく覚えていれば、同じ問題が発生し、新しい証明書を作成しました。

これらのバージョン間で自動更新が壊れたと思いますが、永続的な損傷はありませんでした。私のアプリケーションが内部使用のみであったことが助けになったかもしれないので、適切に署名された証明書は必要ありませんでした。

1
gillonba