Recebe uma mensagem de erro quando tenta actualizar uma aplicação do Visual Studio 2005 ClickOnce depois de expira o certificado que foi utilizado para assinar a instalação

Traduções de Artigos Traduções de Artigos
Artigo: 925521 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando tentar actualizar uma aplicação do Microsoft Visual Studio 2005 ClickOnce depois de expira o certificado utilizado para assinar a instalação, recebe a seguinte mensagem de erro:
A identidade de implementação não coincide com a subscrição.

Causa

Este problema ocorre porque tem de iniciar sessão todas as implementações ClickOnce utilizando um certificado digital. Pode utilizar um certificado expirado para assinar uma aplicação ClickOnce. Para implementar uma actualização para uma aplicação que tenha um certificado expirado, terá de atribuir a aplicação de um novo certificado. Quando o novo certificado não corresponde ao certificado original, recebe a mensagem de erro mencionada na secção "Sintomas".

Resolução

Para resolver este problema, utilize um dos seguintes métodos.

Método 1

Actualizar o computador cliente onde está instalada a aplicação ClickOnce para o Microsoft .NET Framework 2.0 Service Pack 1 (SP1) ou uma versão posterior.

Windows Vista

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

Nota O .NET Framework 3.5 contém muitas funcionalidades novas que criar incrementalmente após o .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 ficheiro seguinte está disponível para transferência a partir do Centro de transferências da Microsoft:

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

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

Para obter mais informações sobre como transferir ficheiros de suporte da Microsoft, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
119591Como obter ficheiros de suporte da Microsoft a partir de serviços online
Microsoft procedeu de vírus neste ficheiro. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o ficheiro foi publicado. O ficheiro é alojado em servidores com segurança avançada o que ajuda a impedir alterações não autorizadas ao ficheiro.

Windows XP

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

Os ficheiros seguintes estão disponíveis para transferência a partir do Centro de transferências da Microsoft:

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

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

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

Para obter mais informações sobre como transferir ficheiros de suporte da Microsoft, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
119591Como obter ficheiros de suporte da Microsoft a partir de serviços online
Microsoft procedeu de vírus neste ficheiro. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o ficheiro foi publicado. O ficheiro é alojado em servidores com segurança avançada o que ajuda a impedir alterações não autorizadas ao ficheiro.

Método 2

Desinstale a aplicação ClickOnce que assinou utilizando o certificado expirou. Reinstale em seguida, a aplicação de ClickOnce actualizada que utiliza o novo certificado.

Método 3

Crie uma assemblagem da linha de comandos que actualiza o certificado. Para o fazer, siga estes passos.

A Microsoft fornece exemplos de programação apenas, para fins sem garantia expressa ou implícita. Isto inclui, mas não está limitado a, as garantias implícitas de comercialização ou adequação a um fim específico. Este artigo pressupõe que está familiarizado com a linguagem de programação apresentada e as ferramentas que são utilizadas para criar e depurar procedimentos. Os técnicos de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento. No entanto, não modificarão estes exemplos para proporcionarem funcionalidades adicionais nem criarão procedimentos adaptados às necessidades específicas do utilizador.
  1. No Visual Studio 2005, clique em Novo no menu ficheiro e, em seguida, clique em projecto .
  2. Clique em Visual C++ , clique em Aplicação de consola do Win32 , escreva RenewCert na caixa nome e, em seguida, clique em OK .
  3. Na caixa de diálogo Assistente de aplicação de 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 ficheiro stdafx.h, substitua o código existente com o seguinte código:
    // 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 projecto , clique em Propriedades para abrir as páginas de propriedades para este projecto.
  7. Expanda o nó Ligador de e, em seguida, clique em entrada .
  8. Clique na janela em branco à direita do Dependências adicionais e, em seguida, clique no botão de reticências (... ) para abrir a caixa de diálogo Dependências adicionais .
  9. Na janela em branco, escreva 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 criar , clique em Criar soluções .
  12. Depois da solução é criada, execute o comando seguinte para actualizar o certificado:
    renewcert <OldCertificate>.pfx <NewCertificate>.pfx \"CN=<NewCertificateName>\" <Password>
    Nota <OldCertificate> é um marcador para o antigo certificado <NewCertificate> é um marcador para o novo certificado, <NewCertificateName> é um marcador de posição para o nome do novo certificado e <Password> é um marcador para a palavra-passe.

Mais Informação

Passos para reproduzir este problema

  1. Inicie o Visual Studio 2005.
  2. No ficheiro , clique em Novo e, em seguida, clique em projecto .
  3. Clique em Visual C# , clique em Aplicação do Windows , escreva WindowsApplication1 na caixa nome e, em seguida, clique em OK .
  4. No Solution Explorer, clique com o botão direito do rato WindowsApplication1 e, em seguida, clique em Propriedades .
  5. Clique em assinatura e, em seguida, atribuir um certificado que expira brevemente.
  6. No Solution Explorer, clique com o botão direito do rato WindowsApplication1 e, em seguida, clique em Publicar . O Assistente Publicar é iniciado.
  7. No onde deseja publicar a aplicação? página, escreva um URL válido e, em seguida, clique em seguinte . Utilize o seguinte formato para o URL:
    http:// ServerName / FolderName
  8. No é a aplicação estar disponível offline? página, clique na opção apropriada.

    notas
    • Se pretender permitir que o utilizador executar a aplicação quando o utilizador é desligado da rede, clique em Sim, esta aplicação estarão disponível online ou offline . O assistente cria um atalho para a aplicação no menu Iniciar .
    • Se pretender executar a aplicação directamente da localização de publicação, clique em não, esta aplicação está apenas disponível online . O assistente não cria um atalho no menu Iniciar .
  9. Clique em seguinte para continuar.
  10. Clique em Concluir para publicar a aplicação.
  11. Instalar a aplicação ClickOnce de http:// ServerName / FolderName /publish.htm URL.
  12. Depois do certificado expirar, repita os passos 6 a 10 para voltar a publicar a aplicação.
  13. Tente instalar a actualização de aplicações ClickOnce a partir de http:// ServerName / FolderName /publish.htm URL.

Propriedades

Artigo: 925521 - Última revisão: 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
  • 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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