インストールの署名に使用した証明書の期限が切れた後、Visual Studio 2005 ClickOnce アプリケーションを更新するときにエラー メッセージが表示される

現象
インストールの署名に使用した証明書の期限が切れた後で Microsoft Visual Studio 2005 ClickOnce アプリケーションを更新するときに、次のエラー メッセージが表示されます。
配置 ID がサブスクリプションと一致しません。
原因
この問題は、ClickOnce によるすべての配置には、デジタル証明書を使用して署名する必要があることが原因で発生します。期限切れの証明書を使用して ClickOnce アプリケーションに署名することはできません。証明書の期限が切れているアプリケーションに更新プログラムを配置するには、アプリケーションに新しい証明書を割り当てる必要があります。新しい証明書が元の証明書と一致しない場合は、「現象」に記載されているエラー メッセージが表示されます。
回避策
この問題を回避するには、次のいずれかの方法を使用します。

方法 1

期限切れの証明書を使用して署名した ClickOnce アプリケーションをアンインストールします。次に、新しい証明書を使用する最新の ClickOnce アプリケーションを再インストールします。

方法 2

証明書を更新するコマンド ライン アセンブリを作成します。作成するには、次の手順を実行します。

マイクロソフトは、この情報をプログラミング言語の使用方法の一例として提供するだけであり、市場性および特定目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。この資料は、例示されているプログラミング言語やプロシージャの作成およびデバッグに使用するツールについて理解されているユーザーを対象としています。Microsoft Support 担当者は、特定のプロシージャの機能についての問い合わせにはお答えできますが、ユーザー固有の目的に合わせた機能の追加、プロシージャの作成などの内容変更は行っておりません。
  1. Visual Studio 2005 で、[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
  2. [Visual C++] をクリックし、[Win32 コンソール アプリケーション] をクリックします。次に、[プロジェクト名] ボックスに RenewCert と入力し、[OK] をクリックします。
  3. [Win32 アプリケーション ウィザード - RenewCert] ダイアログ ボックスで、[完了] をクリックします。
  4. RenewCert.cpp ファイルで、既存のコードを次のコードに置き換えます。
    #include "stdafx.h"  void ReadPFXFile(LPCWSTR fileName, CRYPT_DATA_BLOB *pPFX){            HANDLE hCertFile = NULL;            DWORD cbRead = 0;            DWORD dwFileSize = 0, dwFileSizeHi = 0;             hCertFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);            dwFileSize = GetFileSize(hCertFile, &dwFileSizeHi);            pPFX->pbData = (BYTE *) CryptMemAlloc(dwFileSize*sizeof(BYTE));            pPFX->cbData = dwFileSize;             ReadFile(hCertFile, pPFX->pbData, pPFX->cbData, &cbRead, NULL);            CloseHandle(hCertFile);} void GetPrivateKey(CRYPT_DATA_BLOB pPFX, LPCWSTR szPassword, HCRYPTPROV *hCPContext){            HCERTSTORE hCertStore = NULL;            PCCERT_CONTEXT hCertContext = NULL;            DWORD dwKeySpec = AT_SIGNATURE;            BOOL bFreeCertKey = TRUE;             hCertStore = PFXImportCertStore(&pPFX, szPassword, CRYPT_EXPORTABLE);            hCertContext = CertEnumCertificatesInStore(hCertStore, NULL);            CryptAcquireCertificatePrivateKey(hCertContext, 0, NULL, hCPContext, &dwKeySpec, &bFreeCertKey);            CertCloseStore(hCertStore, CERT_CLOSE_STORE_FORCE_FLAG);} void PrintContainerName(HCRYPTPROV hCPContext){            DWORD containerNameLen = 0;            CHAR *szContainerName = NULL;             CryptGetProvParam(hCPContext, PP_CONTAINER, NULL, &containerNameLen, 0);            szContainerName = (CHAR *)CryptMemAlloc(sizeof(BYTE)*containerNameLen);            CryptGetProvParam(hCPContext, PP_CONTAINER, (BYTE *)szContainerName, &containerNameLen, 0);            printf("This certificate's container name is: %s", szContainerName);} void MakeNewCert(HCRYPTPROV hCPContext, LPCWSTR szCertName, LPCWSTR szPassword, CRYPT_DATA_BLOB *pPFX){            CERT_NAME_BLOB certNameBlob = {0,NULL};            PCCERT_CONTEXT hCertContext = NULL;            SYSTEMTIME certExpireDate;            HCERTSTORE hTempStore = NULL;             CertStrToName(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, szCertName, CERT_OID_NAME_STR, NULL, NULL, &certNameBlob.cbData, NULL);            certNameBlob.pbData = (BYTE *)CryptMemAlloc(sizeof(BYTE)*certNameBlob.cbData);            CertStrToName(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, szCertName, CERT_OID_NAME_STR, NULL, certNameBlob.pbData, &certNameBlob.cbData, NULL);             GetSystemTime(&certExpireDate);            certExpireDate.wYear += 5;             hCertContext = CertCreateSelfSignCertificate(hCPContext, &certNameBlob, 0, NULL, NULL, NULL, &certExpireDate, NULL);            hTempStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, NULL, CERT_STORE_CREATE_NEW_FLAG, 0);            CertAddCertificateContextToStore(hTempStore, hCertContext, CERT_STORE_ADD_NEW, NULL);            PFXExportCertStoreEx(hTempStore, pPFX, szPassword, NULL, EXPORT_PRIVATE_KEYS);            pPFX->pbData = (BYTE *)CryptMemAlloc(sizeof(BYTE)*pPFX->cbData);            PFXExportCertStoreEx(hTempStore, pPFX, szPassword, NULL, EXPORT_PRIVATE_KEYS);             CryptMemFree(certNameBlob.pbData);            CertCloseStore(hTempStore, CERT_CLOSE_STORE_FORCE_FLAG);            CertFreeCertificateContext(hCertContext);} void WritePFX(CRYPT_DATA_BLOB pPFX, LPCWSTR szOutputFile){            HANDLE hOutputFile = NULL;            DWORD cbWritten = 0;             hOutputFile = CreateFile(szOutputFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, NULL);            WriteFile(hOutputFile, pPFX.pbData, pPFX.cbData, &cbWritten, NULL);             CloseHandle(hOutputFile);} int _tmain(int argc, _TCHAR* argv[]){            LPCWSTR szCertFileName = NULL;             CRYPT_DATA_BLOB pPFX;            LPCWSTR szPassword = NULL;            HCRYPTPROV hCPContext = NULL;             LPCWSTR szCertName = L"CN=NewCert";            CRYPT_DATA_BLOB pPfxOutputBlob = {0,NULL};            LPCWSTR szOutFile = NULL;             // Parse the command line.            if(argc == 1)            {                        printf("renewcert <PFX File> <new cert filename> <new cert friendly name> [optional]<password>\n");                        printf("Example: renewcert oldcert.pfx newcert.pfx \"CN=MyNewCert\" MySuperSecretPassword");                        return 0;            }             if(argc >= 2)                        szCertFileName = argv[1];            if(argc >= 5)                        szPassword = argv[4];            // Uncomment this block to add <new cert filename> and <new cert friendly name> as parameters            // NOTE: <new cert friendly name> must be of format "CN=<name>"            if(argc >= 3)                        szOutFile = argv[2];            if(argc >= 4)                        szCertName = argv[3];             ReadPFXFile(szCertFileName, &pPFX);                        GetPrivateKey(pPFX, szPassword, &hCPContext);             //PrintContainerName(hCPContext);             // Uncomment this section to make a new PFX rather than just printing the container name.            // Make sure you also uncomment the command line parameter section above.            MakeNewCert(hCPContext, szCertName, szPassword, &pPfxOutputBlob);            WritePFX(pPfxOutputBlob, szOutFile);                         // Clean up.            CryptReleaseContext(hCPContext, 0);            CryptMemFree(pPfxOutputBlob.pbData);            CryptMemFree(pPFX.pbData);            return 0;}
  5. stdafx.h ファイルで、既存のコードを次のコードに置き換えます。
    // stdafx.h : include file for standard system include files,// or project specific include files that are used frequently, but// are changed infrequently.// #pragma once  #define WIN32_LEAN_AND_MEAN                     // Exclude rarely used material from Windows headers.#include <stdio.h>#include <tchar.h>#include <windows.h>#include <wincrypt.h>
  6. [プロジェクト] メニューの [RenewCert のプロパティ] をクリックして、このプロジェクトのプロパティ ページを開きます。
  7. [リンカ] ノードを展開し、[入力] をクリックします。
  8. [追加の依存ファイル] の右側にある空白のウィンドウをクリックし、省略記号ボタン ([...]) をクリックして、[追加の依存ファイル] ダイアログ ボックスを開きます。
  9. 空白のウィンドウに Crypt32.lib と入力し、[OK] をクリックします。
  10. [適用] をクリックし、[OK] をクリックしてプロパティ ページを閉じます。
  11. [ビルド] メニューの [ソリューションのビルド] をクリックします。
  12. ソリューションがビルドされたら、次のコマンドを実行して証明書を更新します。
    renewcert <OldCertificate>.pfx <NewCertificate>.pfx \"CN=<NewCertificateName>\" <Password>
    : <Oldcertificate> には古い証明書、<NewCertificate> には新しい証明書、<NewCertificateName> には新しい証明書の名前、<Password> にはパスワードが入ります。
状況
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。
詳細

問題の再現手順

  1. Visual Studio 2005 を起動します。
  2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
  3. [Visual C#] をクリックし、[Windows アプリケーション] をクリックします。次に、[プロジェクト名] ボックスに WindowsApplication1 と入力し、[OK] をクリックします。
  4. ソリューション エクスプローラで、[WindowsApplication1] を右クリックし、[プロパティ] をクリックします。
  5. [署名] をクリックし、間もなく期限が切れる証明書を割り当てます。
  6. ソリューション エクスプローラで、[WindowsApplication1] を右クリックし、[発行] をクリックします。発行ウィザードが起動します。
  7. [アプリケーションをどこに発行しますか?] ページで、有効な URL を入力し、[次へ] をクリックします。URL には以下の形式を使用します。
    http://ServerName/FolderName
  8. [アプリケーションはオフラインでも利用できますか?] ページで、適切なオプションをクリックします。

    • ネットワークから切断されているときにユーザーがアプリケーションを実行できるようにする場合は、[はい、このアプリケーションはオンラインでもオフラインでも利用できます] をクリックします。ウィザードによって、[スタート] メニューにアプリケーションのショートカットが作成されます。
    • アプリケーションを発行場所から直接実行する場合は、[いいえ、このアプリケーションはオンラインでのみ利用できます] をクリックします。ウィザードによって、[スタート] メニューにショートカットは作成されません。
  9. [次へ] をクリックして、操作を続けます。
  10. [完了] をクリックして、アプリケーションを発行します。
  11. ClickOnce アプリケーションを http://ServerName/FolderName/publish.htm という URL からインストールします。
  12. 証明書の期限が切れたら、新しい証明書を割り当て、手順 6. ~ 10. を繰り返してアプリケーションを再発行します。
  13. ClickOnce アプリケーションの更新プログラムを http://ServerName/FolderName/publish.htm という URL からインストールします。
ClickOnce certificate
Savybės

Straipsnio ID: 925521 – Paskutinė peržiūra: 04/24/2008 01:42:47 – Peržiūra: 3.0

Microsoft Visual Studio 2005 Standard Edition, Microsoft Visual Studio 2005 Professional Edition, Microsoft Visual Studio 2005 Express Edition

  • kbtshoot kberrmsg kbbug kbprb KB925521
Atsiliepimai