Você receber uma mensagem de erro quando você tenta atualizar um aplicativo Visual Studio 2005 ClickOnce após expira o certificado que foi usado para assinar a instalação

Traduções deste artigo Traduções deste artigo
ID do artigo: 925521 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Quando você tenta atualizar um aplicativo ClickOnce do Microsoft Visual Studio 2005 depois da expiração do certificado usado para assinar a instalação, você receber a seguinte mensagem de erro:
A identidade de implantação não corresponde a inscrição.

Causa

Esse problema ocorre porque você deve assinar todas as implantações do ClickOnce usando um certificado digital. Não é possível usar um certificado expirado para assinar um aplicativo ClickOnce. Para implantar uma atualização em um aplicativo que tenha um certificado expirado, você deve atribuir o aplicativo um novo certificado. Quando o novo certificado não corresponde ao certificado original, você receber a mensagem de erro mencionada na seção "Sintomas".

Resolução

Para resolver esse problema, use um dos seguintes métodos.

Método 1

Atualizar o computador cliente onde o aplicativo ClickOnce é instalado para o Microsoft .NET Framework 2.0 Service Pack 1 (SP1) ou uma versão posterior.

Windows Vista

Aplica o .NET Framework 3.5 ou o .NET Framework 3.5 SP 1.

Observação O .NET Framework 3.5 contém muitos recursos novos que criar incrementalmente ao .NET Framework 2.0 e 3.0. O .NET Framework 3.5 inclui o .NET Framework 2.0 SP1 e o .NET Framework 3.0 SP1.

O seguinte arquivo está disponível para download no Centro de download da Microsoft:

Recolher esta imagemExpandir esta imagem
Download
Download the .NET Framework 3.5 package now.

Recolher esta imagemExpandir esta imagem
Download
Download the .NET Framework 3.5 Service Pack 1 package now.

Para obter mais informações sobre como baixar os arquivos de suporte da Microsoft, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
119591Como obter arquivos de suporte da Microsoft de serviços on-line
Microsoft examinou esse arquivo em busca de vírus. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o arquivo foi publicado. O arquivo é armazenado em servidores com segurança avançada que ajudam a evitar qualquer alteração não autorizada no arquivo.

Windows XP

Aplica o .NET Framework 2.0 SP1 ou o .NET Framework 2.0 Service Pack 2 (SP2).

Os seguintes arquivos estão disponíveis para download no Centro de download da Microsoft:

Recolher esta imagemExpandir esta imagem
Download
Download the .NET Framework 2.0 Service Pack 1 (x86) package now.

Recolher esta imagemExpandir esta imagem
Download
Download the .NET Framework 2.0 Service Pack 1 (x64) package now.

Recolher esta imagemExpandir esta imagem
Download
Download the .NET Framework 2.0 Service Pack 2 package now.

Para obter mais informações sobre como baixar os arquivos de suporte da Microsoft, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
119591Como obter arquivos de suporte da Microsoft de serviços on-line
Microsoft examinou esse arquivo em busca de vírus. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o arquivo foi publicado. O arquivo é armazenado em servidores com segurança avançada que ajudam a evitar qualquer alteração não autorizada no arquivo.

Método 2

Desinstale o aplicativo ClickOnce que você assinou usando o certificado expirou. Em seguida, reinstale o aplicativo ClickOnce atualizado que usa o novo certificado.

Método 3

Crie um conjunto de linha de comando que atualiza o certificado. Para fazer isso, siga estas etapas.

Microsoft fornece exemplos de programação apenas para ilustração, sem garantia expressa ou implícita. Isso inclui, mas não está limitado a, garantias implícitas de comercialização ou adequação para uma finalidade específica. Este artigo presume que você está familiarizados com a linguagem de programação que está sendo demonstrada e com as ferramentas que são usadas para criar e depurar procedimentos. Engenheiros de suporte podem ajudar a explicar a funcionalidade de um determinado procedimento. No entanto, eles não modificarão esses exemplos para fornecer funcionalidades adicionais ou construir procedimentos para atender às suas necessidades.
  1. No Visual Studio 2005, clique em novo no menu arquivo e, em seguida, clique em Project .
  2. Clique em Visual C++ , clique em Aplicativo de console do Win32 , digite RenewCert na caixa nome e, em seguida, clique em OK .
  3. Na caixa de diálogo Assistente de aplicativos Win32 , clique em Concluir .
  4. In the RenewCert.cpp file, replace the existing code with the following code:
    #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. No arquivo de stdafx.h, substitua o código existente com o código a seguir:
    // 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. No menu Project , clique em Propriedades para abrir as páginas de propriedades para este projeto.
  7. Expanda o nó vinculador e, em seguida, clique em entrada .
  8. Clique na janela em branco à direita do Dependências adicionais e clique no botão de reticências (... ) para abrir a caixa de diálogo Dependências adicionais .
  9. Na janela em branco, digite Crypt32.lib e, em seguida, clique em OK .
  10. Clique em Aplicar e, em seguida, clique em OK para fechar as páginas de propriedades.
  11. No menu Build , clique em Build Solution .
  12. Após a solução é criada, execute o seguinte comando para atualizar o certificado:
    renewcert <OldCertificate>.pfx <NewCertificate>.pfx \"CN=<NewCertificateName>\" <Password>
    Observação <OldCertificate> é um espaço reservado para o certificado antigo, <NewCertificate> é um espaço reservado para o novo certificado, <NewCertificateName> é um espaço reservado para o nome do novo certificado e <Password> é um espaço reservado para a senha.

Mais Informações

Etapas para reproduzir esse problema

  1. Inicie o Visual Studio 2005.
  2. No arquivo menu, clique em novo e, em seguida, clique em Project .
  3. Clique em translation from VPE for Csharp Visual , clique em Windows Application , digite WindowsApplication1 na caixa nome e, em seguida, clique em OK .
  4. No Solution Explorer, clique com o botão direito do mouse WindowsApplication1 e, em seguida, clique em Propriedades .
  5. Clique em assinatura e, em seguida, atribuir um certificado que expira em breve.
  6. No Solution Explorer, clique com o botão direito do mouse WindowsApplication1 e, em seguida, clique em Publicar . O Assistente para publicar é iniciado.
  7. No onde você deseja publicar o aplicativo? página, digite uma URL válida e, em seguida, clique em Avançar . Use o seguinte formato para a URL:
    http:// ServerName / FolderName
  8. No será o aplicativo ser disponível off-line? página, clique na opção apropriada.

    anotações
    • Se você desejar permitir que o usuário executar o aplicativo quando o usuário estiver desconectado da rede, clique em Sim, este aplicativo estarão disponível on-line ou off-line . O assistente cria um atalho para o aplicativo no menu Iniciar .
    • Se você deseja executar o aplicativo diretamente do local de publicação, clique em não, este aplicativo está disponível apenas online . O assistente não cria um atalho no menu Iniciar .
  9. Clique em Avançar para continuar.
  10. Clique em Concluir para publicar o aplicativo.
  11. Instalar o aplicativo ClickOnce de http:// ServerName / FolderName /publish.htm URL.
  12. Após o certificado expira, repita as etapas 6 a 10 para republicar o aplicativo.
  13. Tente instalar a atualização de aplicativo ClickOnce partir http:// ServerName / FolderName /publish.htm URL.

Propriedades

ID do artigo: 925521 - Última revisão: quinta-feira, 12 de março de 2009 - Revisão: 4.1
A informação contida neste artigo aplica-se a:
  • Microsoft Visual Studio 2005 Standard Edition
  • Microsoft Visual Studio 2005 Professional Edition
  • Microsoft Visual Studio 2005 Express Edition
Palavras-chave: 
kbmt kbtshoot kberrmsg kbbug kbprb KB925521 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 925521

Submeter comentários

 

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