2012-11-20 16 views
6

Jak mogę cicho instalować certyfikaty główne z WiX? Instaluję niektóre certyfikaty główne i pośrednie, a dla certyfikatów głównych system wyświetla okno dialogowe z potwierdzeniem, zawierające podstawowe właściwości certyfikatu i odcisk palca. Jest to istotne kod mam, używając WixIIsExtension odwzorowany w przestrzeni nazw iis:Po cichu zainstaluj certyfikat główny w 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

uznał ten sposób pomaga http://stackoverflow.com/questions/11534671/c-and-wix-silent-accept-pfx-certificates – CheGueVerra

+0

Okazało się, że również, ale nie zrozumieć odpowiedź. Jeśli w ogóle istnieje odpowiedź ... – Dialecticus

+0

Czy zgłosiłeś mu prośbę o pomoc lub prywatną wiadomość? OP – CheGueVerra

Odpowiedz

1

niestandardowe działania, które Sunil przewidziany jest równoważna Certificate komponentu z atrybutem StoreLocation="localMachine". W moim przypadku instalowanie w sklepie maszynowym ma sens, więc pójdę z tym. Pozostaje pytanie oryginalne: jak zainstalować dyskretnie certyfikat główny w sklepie użytkownika. Jeśli ktoś ma odpowiedź na to pytanie, zaznaczę to jako poprawną odpowiedź.

4

używam niestandardowe działania dla samego

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

Dzięki, dałeś mi pomysł, ale nadal będę używać standardowego komponentu. – Dialecticus

3

Szukałem odpowiedzi dawno temu. Tak, to jest to co mam:

Kod 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" /> 

C++ Kod:

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; 
    } 

Nadzieja pomoże u

+0

Dziękuję za kod. To może być przydatne. Kod jednak używa flagi 'CERT_SYSTEM_STORE_LOCAL_MACHINE', więc również importuje na lokalny komputer, tak jak mój kod robi z' StoreLocation = "localMachine" '. – Dialecticus

+0

W moich celach było wiele innych odroczonych CA, dlatego udało mi się rozwiązać ten problem w C++ – AkmecNurik

1

miałem problemy z instalacją certyfikatów z WiX - dwa problemy mam:

1. Jeśli powiesz WiX, aby zainstalował się w zaufanych certyfikatów głównych na komputerze lokalnym, nie ma t działa, instaluje się w sklepie osobistym.
2. Uprawnienia do certyfikatów instalowanych przez WiX (gdy mają klucz prywatny) nie mają skonfigurowanego użytkownika Wszyscy. [Możesz zmienić uprawnienia za pomocą MMC-> Menedżer certyfikatów-> Lokalny komputer -> (zlokalizuj certyfikat z kluczem prywatnym) Prawym przyciskiem myszy-> Wszystkie zadania-> Zarządzaj kluczem prywatnym, który wyświetla okno dialogowe uprawnień do pliku].

Możesz uniknąć obu tych problemów, używając programu microsoft winhttpcertcfg.exe tool. Używam go w pliku wsadowym (patrz poniżej) i używam cichej akcji niestandardowej WiX, aby wywołać plik wsadowy. Pozwoliłem WiX zainstalować narzędzie, certyfikaty i pliki wsadowe przed wykonaniem partii. Partię można skonfigurować, aby usunąć narzędzie i certyfikaty po instalacji. Można go również użyć do uruchomienia usługi, w której zainstalowana jest WiX, która zależy od certyfikatów. Korzystanie z partii znacznie zmniejsza liczbę niestandardowych działań w pliku WiX.

Konsekwencją nieprawidłowej instalacji certyfikatów był sporadyczny błąd (niektóre urządzenia działały, niektóre nie) z klientem .net "Nie można utworzyć wyjątku bezpiecznego kanału SSL/TLS" podczas wykonywania żądania 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 

zainstalować plik wsadowy instalacji i deinstalacji w produkcie. Następnie w WiX - zanotuj odroczoną i udawaną akcję niestandardową.

<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> 
Powiązane problemy