Сообщение об ошибке при попытке обновить приложения Visual Studio 2005 ClickOnce после истечения срока действия сертификат, использованный для подписи установки

Переводы статьи Переводы статьи
Код статьи: 925521 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Проблема

При попытке обновления Microsoft Visual Studio 2005 ClickOnce-приложения, после истечения срока действия сертификата, используемого для подписи установки, появляется следующее сообщение об ошибке:
Идентификация развертывания не соответствует подписки.

Причина

Данная проблема возникает, если необходимо подписать все развертывания ClickOnce с помощью цифрового сертификата. Срок действия сертификата истек, нельзя использовать для подписи приложения ClickOnce. Для развертывания обновлений для приложения, которое имеет срок действия сертификата истек, необходимо назначить приложению новый сертификат. Новый сертификат не соответствует исходного сертификата, появляется сообщение об ошибке, описанное в разделе «Проблема».

Решение

Для решения этой проблемы воспользуйтесь одним из приведенных ниже способов..

Способ 1.

Обновите клиентский компьютер, где приложение ClickOnce устанавливается в корпорацию Майкрософт .NET Framework 2.0 с пакетом обновления 1 (SP1) или более поздней версии.

Windows Vista:

Применение в .NET Framework 3.5 или .NET Framework 3.5 пакет обновления 1.

Примечание.В .NET Framework 3.5 содержит много новых возможностей, созданные инкрементно, от .NET Framework 2.0 и 3.0. В .NET Framework 3.5 включает в себя .NET Framework 2.0 SP1 и .NET Framework 3.0 SP1.

Указанный ниже файл можно загрузить с веб-сайта Центра загрузки Майкрософт::

Свернуть это изображениеРазвернуть это изображение
Загрузка
Загрузите пакет .NET Framework 3.5.

Свернуть это изображениеРазвернуть это изображение
Загрузка
Загрузите пакет .NET Framework 3.5 с пакетом обновления 1 (SP1).

Дополнительные сведения о загрузке файлов с веб-сайта технической поддержки корпорации Майкрософт см. в следующей статье базы знаний Майкрософт::
119591Как загрузить файлы поддержки Microsoft из Интернета
Корпорация Microsoft проверила этот файл на наличие вирусов.. Корпорация Майкрософт использует последние версии антивирусного программного обеспечения, имеющиеся на момент публикации файла.. Файл хранится на защищенных серверах, что предотвращает его несанкционированное изменение..

Windows XP

Применение .NET Framework 2.0 с пакетом обновления 1 или пакета обновления 2 (SP2) для .NET Framework 2.0.

Следующие файлы доступны для загрузки из Центра загрузки Майкрософт::

Свернуть это изображениеРазвернуть это изображение
Загрузка
Загрузите пакет .NET Framework 2.0 с пакетом обновления 1 (x 86).

Свернуть это изображениеРазвернуть это изображение
Загрузка
Загрузите пакет .NET Framework 2.0 с пакетом обновления 1 (x 64).

Свернуть это изображениеРазвернуть это изображение
Загрузка
Загрузите пакет .NET Framework 2.0 с пакетом обновления 2 (SP2).

Дополнительные сведения о загрузке файлов с веб-сайта технической поддержки корпорации Майкрософт см. в следующей статье базы знаний Майкрософт::
119591Как загрузить файлы поддержки Microsoft из Интернета
Корпорация Microsoft проверила этот файл на наличие вирусов.. Корпорация Майкрософт использует последние версии антивирусного программного обеспечения, имеющиеся на момент публикации файла.. Файл хранится на защищенных серверах, что предотвращает его несанкционированное изменение..

Способ 2

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

Способ 3

Создайте сборку из командной строки для обновления сертификата. Выполните следующие действия:.

Корпорация Майкрософт предлагает примеры программного кода только для иллюстрации, без каких-либо явных или подразумеваемых гарантий.. Включая, но не ограничивая, подразумеваемые гарантии товарности или пригодности для использования в определенных целях.. В данной статье предполагается, что вы знакомы с языком программирования предложенном в примере, а также с средствами, которые используются для создания и отладки.. Сотрудники службы поддержки Майкрософт могут объяснить работу конкретной процедуры, но не. будут изменять примеры для реализации дополнительных возможностей или удовлетворения требований конкретных пользователей..
  1. В Visual Studio 2005 щелкнитеСОЗДАТЬ.в менюФайл:меню и выберите пунктProject.
  2. затем –В Visual C++затем –Консольное приложение Win32TYPE :RenewCertВ диалоговом окнеИМЯполя, а затем нажмите кнопкуOk..
  3. В диалоговом окнеМастер приложений Win32диалоговое окно, нажмите кнопкуЗавершить.
  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. в менюProjectвыберите пунктСвойстваЧтобы открыть страницы свойств для данного проекта.
  7. Разверните узелОшибка компоновщикаузел, а затем нажмите кнопкуВвод.
  8. Щелкните пустое окно к правому краюДополнительные зависимости, а затем нажмите кнопку с многоточием ()...) дляДополнительные зависимости«Свойства системы»..
  9. Введите в пустое окноCrypt32.libи выберите командуOk..
  10. затем –Применениеи выберите командуOk.Чтобы закрыть страницы свойств.
  11. в менюПостроениевыберите пунктПостроение решения.
  12. После построения решения, выполните следующую команду, чтобы обновить сертификат.
    renewcert <OldCertificate>.pfx <NewCertificate>.pfx \"CN=<NewCertificateName>\" <Password>
    Примечание. <oldcertificate></oldcertificate>— Это старый сертификат<newcertificate></newcertificate>— Это новый сертификат<newcertificatename></newcertificatename>— Это имя нового сертификата и<password></password>— Это пароль.

Дополнительная информация

Действия по воспроизведению проблемы

  1. Запустите Visual Studio 2005.
  2. в менюФайл:выберите пунктСОЗДАТЬ.и выберите командуProject.
  3. затем –В Visual C#затем –Windows приложенияTYPE :WindowsApplication1В диалоговом окнеИМЯполя, а затем нажмите кнопкуOk..
  4. В обозревателе решений щелкните правой кнопкой мышиWindowsApplication1и выберите командуСвойства.
  5. затем –Подпись, а затем назначить сертификат, срок действия скоро истекает.
  6. В обозревателе решений щелкните правой кнопкой мышиWindowsApplication1и выберите командуПубликация. Запуск мастера публикации.
  7. в менюWhere do you want to publish the application?page, type a valid URL, and then click?????. Use the following format for the URL:
    http://Имя_сервера/Имя_папки
  8. в менюWill the application be available offline?page, click the appropriate option.

    Примечания
    • If you want to let the user run the application when the user is disconnected from the network, clickYes, this application will be available online or offline. The wizard creates a shortcut for the application on theSTART ::меню.
    • If you want to run the application directly from the publish location, clickNo, this application is only available online. The wizard does not create a shortcut on theSTART ::меню.
  9. затем –?????Чтобы продолжить.
  10. затем –Завершитьto publish the application.
  11. Install the ClickOnce application from the http://Имя_сервера/Имя_папки/publish.htm URL.
  12. After the certificate expires, repeat steps 6 to 10 to republish the application.
  13. Try to install the ClickOnce application update from the http://Имя_сервера/Имя_папки/publish.htm URL.

Свойства

Код статьи: 925521 - Последний отзыв: 27 ноября 2010 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual Studio 2005 Standard Edition
  • Microsoft Visual Studio 2005 Professional Edition
Ключевые слова: 
kbtshoot kberrmsg kbbug kbprb kbmt KB925521 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:925521

Отправить отзыв

 

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