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

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 de 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 tenga 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 para Microsoft.NET Framework 2.0 Service Pack 1 (SP1) o una versión posterior.

Windows Vista

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

Nota: La 3.5 de.NET Framework contiene muchas características nuevas que se basan incrementalmente en la versión.NET Framework 2.0 y 3.0. La 3.5 de.NET Framework incluye el Service Pack 1 de.NET Framework 2.0 y.NET Framework 3.0 SP1.

El siguiente archivo está disponible para su descarga desde el Centro de descarga de Microsoft:

Download Descargue ahora el paquete de.NET Framework 3.5.

Download Descargue ahora el paquete de.NET Framework 3.5 Service Pack 1.

Para obtener más información acerca de cómo descargar archivos de soporte técnico de Microsoft, haga clic en el número de artículo siguiente para ver el artículo en Microsoft Knowledge Base:
119591 cómo obtener archivos de soporte técnico de Microsoft desde los servicios en línea
Microsoft analizó este archivo en busca de virus. Microsoft ha utilizado el software de detección de virus más reciente que estaba disponible en la fecha en que se publicó el archivo. El archivo se almacena en servidores seguros que ayudan a evitar cambios no autorizados en el archivo.

Windows XP

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

Los archivos siguientes están disponibles para su descarga desde Centro de descarga de Microsoft:

Download Descargue ahora el paquete de.NET Framework 2.0 Service Pack 1 (x86).

Download Descargue ahora el paquete de.NET Framework 2.0 Service Pack 1 (x64).

Download Descargue ahora el paquete de.NET Framework 2.0 Service Pack 2.

Para obtener más información acerca de cómo descargar archivos de soporte técnico de Microsoft, haga clic en el número de artículo siguiente para ver el artículo en Microsoft Knowledge Base:
119591 cómo obtener archivos de soporte técnico de Microsoft desde los servicios en línea
Microsoft analizó este archivo en busca de virus. Microsoft ha utilizado el software de detección de virus más reciente que estaba disponible en la fecha en que se publicó el archivo. El archivo se almacena en servidores seguros que ayudan a evitar cambios no autorizados en el archivo.

Método 2

Desinstale la aplicación ClickOnce que firmó con el certificado expirado. A continuación, vuelva a instalar la aplicación ClickOnce actualizada que utiliza el nuevo certificado.

Método 3

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

Microsoft proporciona ejemplos de programación únicamente con fines ilustrativos, sin ninguna garantía expresa o implícita. Esto incluye, pero no se limita, a las garantías implícitas de comerciabilidad o idoneidad para un propósito particular. Este artículo asume 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 Visual 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. En el archivo RenewCert.cpp, reemplace el código existente con el código siguiente:
    #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 propiedades para 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 adicionalesy, 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.liby, a continuación, haga clic en Aceptar.
  10. Haga clic en Aplicary, 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 < contraseña > 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 menú archivo, haga clic en nuevoy, a continuación, haga clic en proyecto.
  3. Haga clic en Visual C#, haga clic en Aplicación para Windows, escriba WindowsApplication1 en el
    Nombre de cuadro y, a continuación, haga clic en Aceptar.
  4. En el Explorador de soluciones, haga WindowsApplication1y, a continuación, haga clic en Propiedades.
  5. Haga clic en firmay, a continuación, asignar un certificado que caduca pronto.
  6. En el Explorador de soluciones, haga WindowsApplication1y, a continuación, haga clic en Publicar. Inicia el Asistente para publicación.
  7. En el ¿dónde desea publicar la aplicación? de 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? de 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 sólo está 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 el http://nombreDeServidor/nombreDeCarpeta/publish.htm URL.
  12. Cuando el certificado haya caducado, repita los pasos 6 a 10 para volver a publicar la aplicación.
  13. Intente instalar la actualización de la aplicación ClickOnce desde el http://nombreDeServidor/nombreDeCarpeta/publish.htm URL.
Propiedades

Id. de artículo: 925521 - Última revisión: 14 ene. 2017 - Revisión: 1

Comentarios