Recibe un mensaje de error cuando intenta actualizar una aplicación de Visual Studio 2005 ClickOnce después de que caduca el certificado utilizado para firmar la instalación

Seleccione idioma Seleccione idioma
Id. de artículo: 925521 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

Cuando intenta actualizar una aplicación ClickOnce de Microsoft Visual Studio 2005 después de que caduque el certificado que utiliza para firmar la instalación, recibirá el siguiente mensaje de error:
La identidad de implementación no coincide con la suscripción.

Causa

Este problema se produce porque debe firmar todas las implementaciones ClickOnce mediante un certificado digital. No puede utilizar un certificado caducado para firmar una aplicación ClickOnce. Para implementar una actualización en una aplicación que tiene un certificado caducado, debe asignar un nuevo certificado de la aplicación. Cuando el nuevo certificado no coincide con el certificado original, recibirá el mensaje de error que se menciona en la sección "Síntomas".

Solución

Para resolver este problema, utilice uno de los métodos siguientes.

Método 1

Actualizar el equipo cliente donde se instala la aplicación ClickOnce de Microsoft .NET Framework 2.0 Service Pack 1 (SP1) o una versión posterior.

Windows Vista

Aplicar .NET Framework 3.5 o .NET Framework 3.5 SP1.

Nota .NET Framework 3.5 contiene muchas características nuevas que se basan incrementalmente en .NET Framework 2.0 y 3.0. .NET Framework 3.5 incluye .NET Framework 2.0 SP1 y .NET Framework 3.0 SP1.

El archivo siguiente está disponible para descargarlo del Centro de descarga de Microsoft:

Contraer esta imagenAmpliar esta imagen
Download
Download the .NET Framework 3.5 package now.

Contraer esta imagenAmpliar esta imagen
Download
Download the .NET Framework 3.5 Service Pack 1 package now.

Para obtener información adicional acerca de cómo descargar los archivos de soporte técnico de Microsoft, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
119591Cómo obtener Archivos de soporte técnico de Microsoft desde los servicios en línea
Microsoft exploró este archivo en busca de virus. con el software de detección de virus más reciente disponible en la fecha de publicación. Asimismo, el archivo se almacenó en servidores seguros que ayudan a prevenir que se hagan cambios no autorizados.

Windows XP

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

Los archivos siguientes están disponibles para descargarlos del Centro de descarga de Microsoft:

Contraer esta imagenAmpliar esta imagen
Download
Download the .NET Framework 2.0 Service Pack 1 (x86) package now.

Contraer esta imagenAmpliar esta imagen
Download
Download the .NET Framework 2.0 Service Pack 1 (x64) package now.

Contraer esta imagenAmpliar esta imagen
Download
Download the .NET Framework 2.0 Service Pack 2 package now.

Para obtener información adicional acerca de cómo descargar los archivos de soporte técnico de Microsoft, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
119591Cómo obtener Archivos de soporte técnico de Microsoft desde los servicios en línea
Microsoft exploró este archivo en busca de virus. con el software de detección de virus más reciente disponible en la fecha de publicación. Asimismo, el archivo se almacenó en servidores seguros que ayudan a prevenir que se hagan cambios no autorizados.

Método 2

Desinstale la aplicación ClickOnce que firmado utilizando el certificado caducado. Después, reinstale la aplicación ClickOnce actualizada que utiliza el nuevo certificado.

Método 3

Crear un ensamblado la línea de comandos que actualiza el certificado. Para ello, siga estos pasos.

Microsoft proporciona ejemplos de programación con fines ilustrativos únicamente, sin ninguna garantía tanto expresa como implícita. Esto incluye, entre otras, las garantías implícitas de comerciabilidad e idoneidad para un fin determinado. Este artículo se supone que está familiarizado con el lenguaje de programación que se muestra y con las herramientas que se utilizan para crear y depurar procedimientos. Los ingenieros de soporte técnico de Microsoft pueden explicarle la funcionalidad de un determinado procedimiento. Sin embargo, no modificarán estos ejemplos para ofrecer mayor funcionalidad ni crearán procedimientos que cumplan sus requisitos específicos.
  1. En Visual Studio 2005, haga clic en nuevo en el menú archivo y, a continuación, haga clic en proyecto .
  2. Haga clic en C++ , haga clic en Aplicación de consola Win32 , escriba RenewCert en el cuadro nombre y, a continuación, haga clic en Aceptar .
  3. En el cuadro de diálogo Asistente para aplicaciones Win32 , haga clic en Finalizar .
  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. En el archivo stdafx.h, reemplace el código existente con el código siguiente:
    // 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. En el menú proyecto , haga clic en Propiedades para abrir las páginas de propiedad de este proyecto.
  7. Expanda el nodo de vinculador y, a continuación, haga clic en entrada .
  8. Haga clic en la ventana en blanco a la derecha de Dependencias adicionales y, a continuación, haga clic en el botón de puntos suspensivos (... ) para abrir el cuadro de diálogo Dependencias adicionales .
  9. En la ventana en blanco, escriba Crypt32.lib y, a continuación, haga clic en Aceptar .
  10. Haga clic en Aplicar y, a continuación, haga clic en Aceptar para cerrar las páginas de propiedades.
  11. En el menú Generar , haga clic en Generar solución .
  12. Después de genera la solución, ejecute el siguiente comando para actualizar el certificado:
    renewcert <OldCertificate>.pfx <NewCertificate>.pfx \"CN=<NewCertificateName>\" <Password>
    Nota <OldCertificate> es un marcador de posición para el certificado antiguo <NewCertificate> es un marcador de posición para el nuevo certificado <NewCertificateName> es un marcador de posición para el nombre del nuevo certificado y <Password> es un marcador de posición para la contraseña.

Más información

Pasos para reproducir este problema

  1. Inicie Visual Studio 2005.
  2. En el archivo de menú, haga clic en nuevo y, a continuación, haga clic en proyecto .
  3. Haga clic en C# , haga clic en Aplicación para Windows , escriba WindowsApplication1 en el cuadro nombre y, a continuación, haga clic en Aceptar .
  4. En el Explorador de soluciones, haga clic con el botón secundario del mouse en WindowsApplication1 y a continuación, haga clic en Propiedades .
  5. Haga clic en firma y, a continuación, asignar un certificado que caduca pronto.
  6. En el Explorador de soluciones, haga clic con el botón secundario del mouse en WindowsApplication1 y, a continuación, haga clic en publicar . Se inicia el Asistente para publicar.
  7. En el ¿dónde desea publicar la aplicación? página, escriba una dirección URL válida y, a continuación, haga clic en siguiente . Utilice el siguiente formato para la dirección URL:
    http:// ServerName / FolderName
  8. En el la aplicación estará disponible sin conexión? página, haga clic en la opción adecuada.

    notas
    • Si desea permitir que el usuario ejecute la aplicación cuando el usuario se desconecta de la red, haga clic en Sí, esta aplicación estará disponible en línea o sin conexión . El asistente crea un acceso directo para la aplicación en el menú Inicio .
    • Si desea ejecutar la aplicación directamente desde la ubicación de publicación, haga clic en no, esta aplicación está sólo disponible en línea . El asistente no crea un acceso directo en el menú Inicio .
  9. Haga clic en siguiente para continuar.
  10. Haga clic en Finalizar para publicar la aplicación.
  11. Instalar la aplicación ClickOnce desde http:// ServerName / FolderName /publish.htm URL.
  12. Después de que caduque el certificado, repita los pasos 6 a 10 para volver a publicar la aplicación.
  13. Intente instalar la actualización de aplicación ClickOnce desde http:// ServerName / FolderName /publish.htm URL.

Propiedades

Id. de artículo: 925521 - Última revisión: jueves, 12 de marzo de 2009 - Versión: 4.1
La información de este artículo se refiere a:
  • Microsoft Visual Studio 2005 Standard Edition
  • Microsoft Visual Studio 2005 Professional Edition
  • Microsoft Visual Studio 2005 Express Edition
Palabras clave: 
kbmt kbtshoot kberrmsg kbbug kbprb KB925521 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 925521

Enviar comentarios

 

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