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

文書翻訳 文書翻訳
文書番号: 925521 - 対象製品
すべて展開する | すべて折りたたむ

目次

現象

インストールの署名に使用した証明書の期限が切れた後で 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 からインストールします。

プロパティ

文書番号: 925521 - 最終更新日: 2008年4月24日 - リビジョン: 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
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com