2012-11-20 3 views
6

Come posso installare silenziosamente i certificati di root da WiX? Sto installando alcuni certificati root e intermedi e per i certificati radice il sistema visualizza la finestra di dialogo di conferma che mostra le proprietà del certificato di base e l'identificazione personale. Questo è relativo codice che ho, utilizzando WixIIsExtension mappato nel namespace iis:Installa il certificato di root in WiX

<Binary Id="RootCa" SourceFile="Certificates\RootCa.cer" /> 

<DirectoryRef Id="TARGETDIR"> 
    <Component Id="RootCa" Guid="..."> 
    <iis:Certificate 
     Id="RootCa" 
     BinaryKey="RootCa" 
     Name="RootCa" 
     StoreLocation="currentUser" 
     StoreName="root"/> 
    </Component> 
</DirectoryRef> 

<Feature ...> 
    <ComponentRef Id="RootCa" /> 
</Feature> 
+0

trovato questo Aiuta http://stackoverflow.com/questions/11534671/c-and-wix-silent-accept-pfx-certificates – CheGueVerra

+0

ho scoperto che anche, ma non hanno capito la risposta. Se esiste una risposta a tutti ... – Dialecticus

+0

Hai commentato per un aiuto, o un messaggio privato l'OP – CheGueVerra

risposta

1

azione personalizzato che Sunil fornito è equivalente a Certificate componente con l'attributo StoreLocation="localMachine". Nel mio caso l'installazione in un negozio di macchine ha più senso comunque, quindi vado con quello. Rimane ancora la domanda originale: come installare silenziosamente il certificato radice nell'archivio utente. Se qualcuno ha una risposta a questa domanda, la contrassegnerò come risposta corretta.

4

Sto usando un'azione personalizzata per lo stesso

<CustomAction Id="InstallCertificates" Directory="TARGETDIR" ExeCommand="[SystemFolder]Certutil –addstore –f &quot;root&quot; &quot;[INSTALLLOCATION]Certificates\CertificateName.cer&quot;" Execute="immediate" Return="ignore" /> 
+0

Grazie, mi hai dato un'idea, ma userò comunque il componente standard. – Dialecticus

3

Ho cercato una risposta molto tempo fa. Quindi, questo è quello che ho:

Codice WiX:

<CustomAction Id="ImportCer.Props" Property="ImportCer" Value="[INSTALLDIR]ca\root.cer" /> 
<CustomAction Id="ImportCer" Execute="deferred" FileKey="hsminst.dll" DllEntry="ImportCer" /> 

<CustomAction Id="ImportPfx.Props" Property="ImportPfx" Value="[INSTALLDIR]ca\super.pfx" /> 
<CustomAction Id="ImportPfx" Execute="deferred" FileKey="hsminst.dll" DllEntry="ImportPfx" /> 

codice C++:

extern "C" __declspec(dllexport) UINT __stdcall ImportCer(MSIHANDLE hInstall) 
{ 
     char szPath[MAX_PATH]; 

     GetModuleFileNameA(NULL, szPath, MAX_PATH); 

     char certFilePath[MAX_PATH] = {0}; 
    DWORD certFilePathLen = MAX_PATH; 
     MsiGetProperty (
      hInstall, 
      "CustomActionData", 
      certFilePath, 
      &certFilePathLen); 

     wchar_t certFilePathW[MAX_PATH]; 
     MultiByteToWideChar(
      CP_ACP, 
      0, 
      certFilePath, 
      -1, 
      certFilePathW, 
      MAX_PATH); 

     PCCERT_CONTEXT pCertCtx = NULL; 

     if (CryptQueryObject (
     CERT_QUERY_OBJECT_FILE, 
     certFilePathW, 
     CERT_QUERY_CONTENT_FLAG_ALL, 
     CERT_QUERY_FORMAT_FLAG_ALL, 
     0, 
     NULL, 
     NULL, 
     NULL, 
     NULL, 
     NULL, 
     (const void **)&pCertCtx) != 0) 
     { 
      HCERTSTORE hCertStore = CertOpenStore (
       CERT_STORE_PROV_SYSTEM, 
       0, 
       0, 
       CERT_STORE_OPEN_EXISTING_FLAG | 
       CERT_SYSTEM_STORE_LOCAL_MACHINE, 
       L"root"); 
      if (hCertStore != NULL) 
      { 
       if (!CertAddCertificateContextToStore (
        hCertStore, 
        pCertCtx, 
        CERT_STORE_ADD_ALWAYS, 
        NULL)) 
       { 
        return -2; 
       } 

       if (!CertCloseStore (hCertStore, 0)) 
       { 
        return -3; 
       } 
      } 
      else 
      { 
       return -1; 
      } 

      if (pCertCtx) 
      { 
       CertFreeCertificateContext (pCertCtx); 
      } 
     } 
     return 0; 
    } 

    extern "C" __declspec(dllexport) UINT __stdcall ImportPfx(MSIHANDLE hInstall) 
    { 
     char certFilePath[MAX_PATH] = {0}; 
    DWORD certFilePathLen = MAX_PATH; 
     MsiGetProperty (
      hInstall, 
      "CustomActionData", 
      certFilePath, 
      &certFilePathLen); 

     wchar_t certFilePathW[MAX_PATH]; 
     MultiByteToWideChar(
      CP_ACP, 
      0, 
      certFilePath, 
      -1, 
      certFilePathW, 
      MAX_PATH); 

     CRYPTUI_WIZ_IMPORT_SRC_INFO importSrc; 
     memset(
      &importSrc, 
      0, 
      sizeof(CRYPTUI_WIZ_IMPORT_SRC_INFO)); 

     importSrc.dwSize = sizeof(CRYPTUI_WIZ_IMPORT_SRC_INFO); 
     importSrc.dwSubjectChoice = CRYPTUI_WIZ_IMPORT_SUBJECT_FILE; 
     importSrc.pwszFileName = certFilePathW; 
     importSrc.pwszPassword = L"111111"; 
     importSrc.dwFlags = CRYPT_EXPORTABLE; 

     HCERTSTORE serviceStore = CertOpenStore(
      CERT_STORE_PROV_SYSTEM, 
      0, 
      0, 
      CERT_STORE_OPEN_EXISTING_FLAG | 
      CERT_SYSTEM_STORE_CURRENT_USER, 
      L"my"); 

     if (CryptUIWizImport(
      CRYPTUI_WIZ_NO_UI , 
      NULL, 
      NULL, 
      &importSrc, 
      serviceStore 
      ) == 0) 
     { 
      return -1; 
     } 
     return 0; 
    } 

Speranza aiuterà u

+0

Grazie per il codice. Potrebbe essere utile. Il codice tuttavia usa il flag "CERT_SYSTEM_STORE_LOCAL_MACHINE' così da importarlo anche sul computer locale, come il mio codice fa con' StoreLocation = "localMachine" '. – Dialecticus

+0

Nei miei scopi c'erano molti altri CA differiti, ecco perché sono riuscito a risolvere questo problema in C++ – AkmecNurik

1

ho avuto problemi con l'installazione di certificati con WiX - due problemi che ho riscontrato:

1. Se si dice a WiX di installarsi nei certificati di radice attendibili sul computer locale, non funziona t lavoro, installa invece nel Personal Store.
2. Le autorizzazioni per i certificati installati da WiX (quando dispongono di una chiave privata) non prevedono la configurazione dell'utente Everyone. [È possibile modificare le autorizzazioni utilizzando MMC-> Gestione certificati-> Macchina locale -> (individuare il certificato con chiave privata) Fare clic con il tasto destro del mouse su -> Tutte le attività-> Gestisci chiave privata, che visualizza una finestra di dialogo per l'autorizzazione dei file].

È possibile evitare entrambi questi problemi utilizzando il microsoft winhttpcertcfg.exe tool. Lo uso in un file batch (vedi sotto) e utilizzo un'azione personalizzata silenziosa WiX per chiamare il file batch. Ho permesso a WiX di installare lo strumento, i certificati e i file batch prima di eseguire il batch. Il batch può essere impostato per eliminare lo strumento e i certificati dopo l'installazione. Può anche essere utilizzato per avviare un servizio installato da WiX che dipende dai certificati. L'uso del batch riduce notevolmente il numero di azioni personalizzate nel tuo file WiX.

La conseguenza di non installare correttamente i certificati era un errore intermittente (alcune macchine funzionavano, altre no) con un client .net "Impossibile creare SSL/TLS canale sicuro" durante l'esecuzione di una richiesta http.

REM Batch file to install certificates using WinHttpCertCfg.exe 
"[path to installed]winhttpcertcfg.exe" -i "[path to installed]ca.pfx" -a Everyone -c LOCAL_MACHINE\Root > c:\temp\installcc.log 
"[path to installed]winhttpcertcfg.exe" -i "[path to installed]server.pfx" -a Everyone -c LOCAL_MACHINE\My >> c:\temp\installcc.log 

ho installare installare il batch e file di disinstallazione nel prodotto. Quindi, in WiX, annota l'azione personalizzata differita e impersonata.

<CustomAction Id="InstallCustomAction_Cmd" 
    Property="InstallCustomActionQt" 
    Value="&quot;cmd.exe&quot; /c &quot;[#InstallCustomAction.cmd]&quot;" 
    Execute="immediate" /> 

<CustomAction Id="InstallCustomActionQt" 
    BinaryKey="WixCA" 
    DllEntry="CAQuietExec" 
    Execute="deferred" 
    Return="ignore" 
    Impersonate="yes"/> 

<InstallExecuteSequence> 
    <Custom Action="InstallCustomAction_Cmd" Before="InstallFinalize">NOT REMOVE</Custom> 
    <Custom Action="InstallCustomActionQt" After="InstallCustomAction_Cmd" >NOT REMOVE</Custom> 
... 
</InstallExecuteSequence> 
... 
<Component Id="InstallCustomAction" Guid="{your-GUID}"> 
    <File Id="InstallCustomAction.cmd" KeyPath="yes" 
      Source="tools\InstallCloudConnectCustomAction.cmd" /> 
</Component>