2012-11-20 148 views
6

如何從WiX靜默安裝根證書?我正在安裝一些根證書和中級證書,而對於根證書,系統顯示確認對話框,顯示基本證書屬性和指紋。這是相關的代碼我有,使用WixIIsExtension在命名空間iis映射:在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

發現這有何幫助http://stackoverflow.com/questions/11534671/c-and-wix-silent-accept-pfx-certificates – CheGueVerra

+0

我發現也有,但是不明白的答案。如果有答案存在... – Dialecticus

+0

您是否評論他的求助或私人訊息OP – CheGueVerra

回答

1

自定義操作蘇尼爾提供相當於Certificate成分與屬性StoreLocation="localMachine"。在我的情況下,在機器商店安裝更有意義,所以我會去。原始問題仍然存在:如何在用戶存儲中靜默安裝根證書。如果有人對此問題有答案,我會將其標記爲正確答案。

4

我使用自定義操作相同

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

謝謝,你給了我一個主意,但我仍然會使用標準組件。 – Dialecticus

3

很久以前我一直在尋找答案。所以,這就是我有:

威克斯代碼:

<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++代碼:

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

希望能幫助ü

+0

謝謝你的代碼。它可能是有用的。然而,代碼使用'CERT_SYSTEM_STORE_LOCAL_MACHINE'標誌,因此它也會導入本地機器,就像我的代碼使用'StoreLocation =「localMachine」'一樣。 – Dialecticus

+0

在我的目的是許多其他延期CA,這就是爲什麼我設法解決這個問題在c + + – AkmecNurik

1

我有問題與維克斯安裝證書 - 雙我得到的問題:

1.如果您告訴WiX安裝在本地計算機上的可信根證書中,則它不會t工作,而是安裝在個人商店中。
2.由WiX安裝的證書的權限(當他們有私鑰時)沒有設置Everyone用戶。 [您可以使用MMC->證書管理器 - >本地計算機 - >(使用私鑰查找證書)右鍵單擊 - >所有任務 - >管理私鑰,從而啓動文件權限對話框]來更改權限。

您可以通過使用Microsoft winhttpcertcfg.exe tool避免了這兩個問題。我在批處理文件中使用它(請參閱下文),並使用WiX靜默自定義操作調用批處理文件。我讓WiX在執行批處理之前安裝工具,證書和批處理文件。批處理可以設置爲在安裝後刪除工具和證書。它也可以用於啓動WiX安裝的取決於證書的服務。批量的使用大大減少了您的WiX文件中自定義操作的數量。

沒有安裝證書的後果是正確的間歇性的錯誤(有些機器的工作,有些沒有)與.NET客戶端做一個HTTP請求時「無法創建SSL/TLS安全通道」異常。

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 

我在產品中安裝批量安裝和卸載文件。然後在WiX中 - 記下延期和模擬的自定義操作。

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