2012-11-20 15 views
6

में रूट प्रमाण पत्र स्थापित करें मैं चुपचाप वाईएक्स से रूट प्रमाणपत्र कैसे स्थापित कर सकता हूं? मैं कुछ रूट और इंटरमीडिएट प्रमाणपत्र स्थापित कर रहा हूं, और रूट प्रमाण पत्र के लिए सिस्टम बुनियादी प्रमाणपत्र गुणों और थंबप्रिंट को दिखाते हुए पुष्टिकरण संवाद प्रदर्शित करता है। यह प्रासंगिक कोड रहा है, WixIIsExtension नाम स्थान 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> 
+0

मिला यह यह http://stackoverflow.com/questions/11534671/c-and-wix-silent-accept-pfx-certificates मदद करता है – CheGueVerra

+0

मुझे लगता है कि यह भी पाया गया है, लेकिन इस सवाल का जवाब समझ में नहीं आया। यदि कोई जवाब बिल्कुल मौजूद है ... – Dialecticus

+0

क्या आपने उसे मदद के लिए टिप्पणी की थी, या ओपी – CheGueVerra

उत्तर

1

कस्टम कार्रवाई कि सुनील प्रदान की के लिए कस्टम क्रिया का उपयोग कर रहा विशेषता StoreLocation="localMachine" साथ Certificate घटक के बराबर है। मेरे मामले में मशीन स्टोर में स्थापित करने से वैसे भी अधिक समझ आता है, इसलिए मैं इसके साथ जाऊंगा। मूल प्रश्न अभी भी बनी हुई है: उपयोगकर्ता स्टोर में चुपचाप रूट प्रमाणपत्र कैसे स्थापित करें। अगर किसी के पास उस प्रश्न का उत्तर है तो मैं इसे सही उत्तर के रूप में चिह्नित करूंगा।

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

मैं बहुत समय पहले एक उत्तर की तलाश में था। तो, thats मैं क्या है:

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

सी ++ कोड:

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

मेरे उद्देश्यों में कई अन्य स्थगित सीए थे, इसलिए मैं सी ++ में ऐसी समस्या को हल करने में कामयाब रहा – AkmecNurik

1

मैं WiX के साथ प्रमाणपत्र इंस्टॉल करने के साथ मुद्दों पड़ा है - दो मुझे मिली समस्याएं:

1. यदि आप स्थानीय मशीन पर विश्वसनीय रूट प्रमाणपत्रों में स्थापित करने के लिए वाईएक्स को बताते हैं, तो यह नहीं करता टी काम, इसके बजाय व्यक्तिगत स्टोर में स्थापित करता है।
2. वाईएक्स द्वारा स्थापित प्रमाणपत्रों के लिए अनुमतियां (जब उनकी निजी कुंजी होती है) में प्रत्येक उपयोगकर्ता द्वारा सेट अप नहीं किया जाता है। [आप एमएमसी-> प्रमाणपत्र प्रबंधक-> स्थानीय मशीन -> (निजी कुंजी के साथ प्रमाणपत्र का पता लगाएं) का उपयोग कर अनुमतियां बदल सकते हैं राइट क्लिक-> सभी कार्य-> निजी कुंजी प्रबंधित करें, जो फ़ाइल अनुमति संवाद लाता है]।

आप माइक्रोसॉफ्ट winhttpcertcfg.exe tool का उपयोग कर इन दोनों समस्याओं से बच सकते हैं। मैं इसे बैच फ़ाइल में उपयोग करता हूं (नीचे देखें), और बैच फ़ाइल को कॉल करने के लिए एक वाईएक्स मूक कस्टम एक्शन का उपयोग करें। मैंने बैच को निष्पादित करने से पहले WiX को उपकरण, प्रमाण पत्र और बैच फ़ाइलों को इंस्टॉल करने दिया। स्थापना के बाद उपकरण और प्रमाणपत्र को हटाने के लिए बैच सेटअप किया जा सकता है। इसका उपयोग ऐसी सेवा शुरू करने के लिए भी किया जा सकता है जो वाईएक्स स्थापित है जो प्रमाणपत्रों पर निर्भर करता है। बैच का उपयोग आपकी वाईएक्स फ़ाइल में कस्टम कार्रवाइयों की संख्या को बहुत कम करता है।

प्रमाण पत्र स्थापित करने का नतीजा एक HTTP अनुरोध करते समय एक .NET क्लाइंट "एसएसएल/टीएलएस सुरक्षित चैनल नहीं बना सका" अपवाद के साथ एक अस्थायी त्रुटि (कुछ मशीनें काम करती हैं, कुछ नहीं) थीं।

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 

मैं बैच इंस्टॉल और उत्पाद में फ़ाइल अनइंस्टॉल स्थापित करता हूं। फिर वाईएक्स में - स्थगित और प्रतिरूपित कस्टम कार्रवाई को नोट करें।

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