10

WiX からルート証明書をサイレント インストールするにはどうすればよいですか? いくつかのルート証明書と中間証明書をインストールしています。ルート証明書の場合、システムは基本的な証明書のプロパティと拇印を示す確認ダイアログを表示します。WixIIsExtensionこれは、 namespace でマップされたを使用して、私が持っている関連コードですiis:

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

4 に答える 4

3

私はずっと前から答えを探していました。だから、それは私が持っているものです:

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++ コード:

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

希望はあなたを助けます

于 2012-11-30T06:52:55.577 に答える
2

CertificateSunilが提供するカスタムアクションは、属性を持つコンポーネントと同等ですStoreLocation="localMachine"。私の場合、とにかくマシンストアにインストールする方が理にかなっているので、それを使用します。元の質問はまだ残っています:ユーザーストアにルート証明書をサイレントにインストールする方法。誰かがその質問に対する答えを持っている場合、私はそれを正解としてマークします。

于 2012-11-22T12:33:25.623 に答える
0

WiX で証明書をインストールする際に問題が発生しました - 2 つの問題が発生

しました。
2. WiX によってインストールされた証明書のアクセス許可 (秘密鍵がある場合) には、Everyone ユーザーが設定されていません。[MMC -> 証明書マネージャー -> ローカル マシン -> (秘密鍵で証明書を見つける) を使用してアクセス許可を変更できます) 右クリック -> すべてのタスク -> 秘密キーの管理、ファイル アクセス許可ダイアログが表示されます]。

これらの問題は、Microsoft winhttpcertcfg.exeツールを使用して回避できます。私はこれをバッチ ファイル (以下を参照) で使用し、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>
于 2014-10-07T21:14:18.450 に答える