Viene visualizzato un messaggio di errore quando si tenta di aggiornare un'applicazione di Visual Studio 2005 ClickOnce alla scadenza del certificato utilizzato per firmare l'installazione

Sintomi

Quando si tenta di aggiornare un'applicazione ClickOnce di Microsoft Visual Studio 2005, alla scadenza del certificato utilizzato per firmare l'installazione, viene visualizzato il seguente messaggio di errore:
L'identità di distribuzione non corrisponde alla sottoscrizione.

Causa

Questo problema si verifica perché è necessario firmare tutte le distribuzioni ClickOnce utilizzando un certificato digitale. È possibile utilizzare un certificato scaduto di firmare un'applicazione ClickOnce. Per distribuire un aggiornamento a un'applicazione che dispone di un certificato scaduto, è necessario assegnare all'applicazione un nuovo certificato. Quando il nuovo certificato non corrisponde al certificato originale, viene visualizzato il messaggio di errore menzionato nella sezione "Sintomi".

Risoluzione

Per risolvere questo problema, utilizzare uno dei metodi descritti di seguito.

Metodo 1

Aggiornare il computer client in cui è installato l'applicazione ClickOnce di Microsoft.NET Framework 2.0 Service Pack 1 (SP1) o versione successiva.

Windows Vista

Applicare il.NET Framework 3.5 o.NET Framework 3.5 SP 1.

Nota: Di 3.5 di.NET Framework contiene molte nuove funzionalità che la compilazione incrementale su.NET Framework 2.0 e 3.0. Di 3.5 di.NET Framework include il.NET Framework 2.0 SP1 e.NET Framework 3.0 SP1.

Il seguente file è disponibile per il download da Microsoft Download Center:

Download Download del pacchetto di.NET Framework 3.5.

Download Download del pacchetto di.NET Framework 3.5 Service Pack 1.

Per ulteriori informazioni su come scaricare i file di supporto Microsoft, fare clic sul seguente numero di articolo per visualizzare l'articolo della Microsoft Knowledge Base:
119591 come ottenere file di supporto Microsoft dai servizi online
Microsoft ha analizzato questo file per individuare eventuali virus. Microsoft ha utilizzato il software antivirus più recente disponibile alla data in cui il file è stato registrato. Il file è archiviato in un server con protezione avanzata che impedisce modifiche non autorizzate al file.

Windows XP

Applicare il Service Pack 1 di.NET Framework 2.0 o.NET Framework 2.0 Service Pack 2 (SP2).

I seguenti file sono disponibili per il download da Microsoft Download Center:

Download Download del pacchetto (x86) di.NET Framework 2.0 Service Pack 1.

Download Download del pacchetto (x64) di.NET Framework 2.0 Service Pack 1.

Download Download del pacchetto di.NET Framework 2.0 Service Pack 2.

Per ulteriori informazioni su come scaricare i file di supporto Microsoft, fare clic sul seguente numero di articolo per visualizzare l'articolo della Microsoft Knowledge Base:
119591 come ottenere file di supporto Microsoft dai servizi online
Microsoft ha analizzato questo file per individuare eventuali virus. Microsoft ha utilizzato il software antivirus più recente disponibile alla data in cui il file è stato registrato. Il file è archiviato in un server con protezione avanzata che impedisce modifiche non autorizzate al file.

Metodo 2

Disinstallare l'applicazione ClickOnce firmati utilizzando il certificato scaduto. Quindi reinstallare l'applicazione ClickOnce aggiornata che utilizza il nuovo certificato.

Metodo 3

Creare un assembly della riga di comando che aggiorna il certificato. A tale scopo, attenersi alla seguente procedura.

Microsoft fornisce esempi di programmazione a scopo puramente illustrativo, senza alcuna garanzia espressa o implicita. Ciò include, ma non limitato a, le garanzie implicite di commerciabilità o idoneità per uno scopo particolare. In questo articolo si presuppone che si abbia familiarità con il linguaggio di programmazione in questione e gli strumenti utilizzati per creare ed eseguire la procedura di debug. Tecnici del supporto Microsoft consentono di spiegare la funzionalità di una particolare procedura. Tuttavia, essi non modificherà questi esempi per fornire funzionalità aggiuntive o creare procedure atte a soddisfare specifiche esigenze.
  1. In Visual Studio 2005, scegliere Nuovo dal menu File , quindi progetto.

  2. Fare clic su Visual C++, fare clic su Applicazione Console Win32, digitare RenewCert nella casella nome e quindi fare clic su OK.

  3. Nella finestra di dialogo Creazione guidata applicazione Win32 , fare clic su Fine.

  4. Nel file RenewCert.cpp, sostituire il codice esistente con il codice seguente:
    #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. Nel file stdafx. h, sostituire il codice esistente con il codice seguente:
    // 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. Dal menu progetto , fare clic su proprietà per aprire le pagine delle proprietà per questo progetto.
  7. Espandere il nodo Linker e quindi fare clic su Input.
  8. Fare clic su nella finestra vuota a destra di Dipendenze aggiuntivee quindi fare clic sul pulsante con i puntini di sospensione (...) per aprire la finestra di dialogo Dipendenze aggiuntive .
  9. Nella finestra vuota, digitare Crypt32.libe quindi fare clic su OK.
  10. Fare clic su Applicae quindi fare clic su OK per chiudere le pagine delle proprietà.
  11. Scegliere Genera soluzione dal menu Compila .

  12. Dopo la generazione della soluzione, eseguire il comando seguente per aggiornare il certificato:
    renewcert <OldCertificate>.pfx <NewCertificate>.pfx \"CN=<NewCertificateName>\" <Password>
    Nota: < OldCertificate > è un segnaposto per il vecchio certificato, < NewCertificate > è un segnaposto per il nuovo certificato, < NewCertificateName > è un segnaposto per il nome del nuovo certificato e < Password > è un segnaposto per la password.

Ulteriori informazioni

Procedura per riprodurre il problema

  1. Avviare Visual Studio 2005.
  2. Dal menu File, fare clic su Nuovoe quindi fare clic su progetto.
  3. Fare clic su Visual C#, fare clic su Applicazione Windows, digitare WindowsApplication1 , nel
    Nome casella e quindi fare clic su OK.
  4. In Esplora soluzioni fare WindowsApplication1e quindi scegliere proprietà.
  5. Fare clic su firmae quindi assegnare un certificato che scade entro breve tempo.
  6. In Esplora soluzioni fare WindowsApplication1e quindi fare clic su pubblica. Avvia la pubblicazione guidata.
  7. Nel dove si desidera pubblicare l'applicazione? di pagina, digitare un URL valido e quindi fare clic su Avanti. Utilizzare il seguente formato per l'URL:
    http://ServerName/FolderName
  8. Nella l'applicazione sarà disponibile offline? fare clic sull'opzione appropriata.

    Note
    • Se si desidera consentire all'utente di eseguire l'applicazione quando l'utente è disconnesso dalla rete, fare clic su Sì, l'applicazione sarà disponibile online o offline. La procedura guidata crea un collegamento per l'applicazione nel menu di avvio .
    • Se si desidera eseguire l'applicazione direttamente dal percorso di pubblicazione, fare clic su No, questa applicazione è disponibile solo online. La procedura guidata non crea un collegamento nel menu di avvio .
  9. Fare clic su Avanti per continuare.
  10. Fare clic su Fine per pubblicare l'applicazione.
  11. Installare l'applicazione ClickOnce da http://nomeserver/nomecartella/publish.htm URL.
  12. Alla scadenza del certificato, ripetere i passaggi da 6 a 10 per pubblicare di nuovo l'applicazione.
  13. Provare a installare l'aggiornamento dell'applicazione ClickOnce da http://nomeserver/nomecartella/publish.htm URL.
Proprietà

ID articolo: 925521 - Ultima revisione: 31 gen 2017 - Revisione: 1

Feedback