Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रणाली >> Windows Server

कोड साइनिंग सर्टिफिकेट के साथ PowerShell स्क्रिप्ट (PS1) पर हस्ताक्षर कैसे करें?

PowerShell स्क्रिप्ट साइनिंग का परिचय

डिजिटल हस्ताक्षर वाली स्क्रिप्ट या एक्जीक्यूटेबल फाइल उपयोगकर्ता को यह सुनिश्चित करने की अनुमति देती है कि फाइल मूल है और इसका कोड थर्ड पार्टी द्वारा बदला नहीं गया है। PowerShell के वर्तमान संस्करणों में *.ps1 स्क्रिप्ट फाइलों के कोड साइनिंग के लिए डिजिटल सर्टिफिकेट का उपयोग करने के लिए अंतर्निहित टूल हैं।

आप एक विशेष प्रकार के सर्टिफिकेट - कोड साइनिंग का उपयोग करके PowerShell स्क्रिप्ट पर हस्ताक्षर कर सकते हैं। यह सर्टिफिकेट किसी बाहरी व्यावसायिक प्रमाणन प्राधिकरण (CA), आंतरिक एंटरप्राइज CA से प्राप्त किया जा सकता है या आप सेल्फ-साइन सर्टिफिकेट का उपयोग कर सकते हैं।

सर्टिफिकेट प्राप्त करना

मान लीजिए, आपके डोमेन में PKI सेवाएं (एक्टिव डायरेक्टरी सर्टिफिकेट सर्विसेज) तैनात हैं। https://CA-server-name/certsrv पर जाकर और सर्टिफिकेशन अथॉरिटी कंसोल में पहले सक्षम किए गए कोड साइनिंग टेम्पलेट के साथ एक नया सर्टिफिकेट अनुरोध करके एक नया सर्टिफिकेट प्राप्त करें।

इसके अलावा, उपयोगकर्ता MMC स्नैप-इन सर्टिफिकेट्स -> मेरा खाता -> व्यक्तिगत -> सभी कार्य -> नया सर्टिफिकेट अनुरोध से PowerShell स्क्रिप्ट पर हस्ताक्षर करने के लिए सर्टिफिकेट का अनुरोध कर सकता है।

यदि आपने मैन्युअल रूप से सर्टिफिकेट का अनुरोध किया है, तो आपके पास .cer एक्सटेंशन वाली एक x509 सर्टिफिकेट फाइल होनी चाहिए। इस सर्टिफिकेट को आपके कंप्यूटर के स्थानीय सर्टिफिकेट स्टोर में इंस्टॉल किया जाना चाहिए।

आप निम्न PowerShell कमांड का उपयोग करके सर्टिफिकेट को कंप्यूटर के विश्वसनीय रूट सर्टिफिकेट में जोड़ सकते हैं:

$certFile = Export-Certificate -Cert $cert -FilePath C:\ps\certname.cer
Import-Certificate -CertStoreLocation Cert:\LocalMachine\AuthRoot -FilePath $certFile.FullName

यदि आप सेल्फ-साइन सर्टिफिकेट का उपयोग करना चाहते हैं, तो DNS नाम testPC1 के साथ कोड साइनिंग सर्टिफिकेट बनाने के लिए New-SelfSignedCertificate cmdlet का उपयोग करें:

New-SelfSignedCertificate -DnsName testPC1 -Type CodeSigning
$cert = New-SelfSignedCertificate -Subject "Cert for Code Signing" -Type CodeSigningCert -DnsName test1 -CertStoreLocation cert:\LocalMachine\My

सर्टिफिकेट जनरेट होने के बाद, इसे सर्टिफिकेट मैनेजर कंसोल (certmgr.msc) का उपयोग करके इंटरमीडिएट कंटेनर से विश्वसनीय रूट में ले जाएं।

PowerShell एक्जीक्यूशन पॉलिसी कॉन्फ़िगर करना

सर्टिफिकेट प्राप्त करने के बाद, आप केवल हस्ताक्षरित स्क्रिप्ट को चलाने की अनुमति देने के लिए PowerShell स्क्रिप्ट एक्जीक्यूशन पॉलिसी को कॉन्फ़िगर कर सकते हैं। डिफ़ॉल्ट रूप से, Windows 10/Windows Server 2016 पर PowerShell एक्जीक्यूशन पॉलिसी Restricted पर सेट है (किसी भी PowerShell स्क्रिप्ट के निष्पादन को ब्लॉक करता है)।

File C:\ps\script.ps1 cannot be loaded because running scripts is disabled on this system.

केवल हस्ताक्षरित PS1 स्क्रिप्ट को चलाने की अनुमति देने के लिए, आप PowerShell एक्जीक्यूशन पॉलिसी को AllSigned या RemoteSigned में बदल सकते हैं (एकमात्र अंतर यह है कि RemoteSigned केवल इंटरनेट से डाउनलोड की गई स्क्रिप्ट के लिए हस्ताक्षर की आवश्यकता होती है):

Set-ExecutionPolicy AllSigned –Force

इस मोड में, अनसाइन्ड PowerShell स्क्रिप्ट चलाने पर एक त्रुटि दिखाई देती है:

File C:\script.ps1 cannot be loaded. The file script.ps1 is not digitally signed. You cannot run this script on the current system.

आप स्क्रिप्ट निष्पादन चालू करें ग्रुप पॉलिसी पैरामीटर का उपयोग करके भी हस्ताक्षरित PowerShell स्क्रिप्ट को चलाने की अनुमति दे सकते हैं: कंप्यूटर कॉन्फ़िगरेशन -> नीतियां -> प्रशासनिक टेम्पलेट्स -> Windows घटक -> Windows PowerShell। पैरामीटर मान को केवल हस्ताक्षरित स्क्रिप्ट की अनुमति दें पर बदलें।

PowerShell स्क्रिप्ट फाइल पर हस्ताक्षर करना

अब PowerShell स्क्रिप्ट फाइल पर हस्ताक्षर करने पर चलते हैं। सबसे पहले, आपको वर्तमान उपयोगकर्ता के स्थानीय सर्टिफिकेट स्टोर से कोड साइन सर्टिफिकेट प्राप्त करने की आवश्यकता है। पहले, उन सभी सर्टिफिकेट को सूचीबद्ध करें जिनका उपयोग कोड पर हस्ताक्षर करने के लिए किया जा सकता है:

Get-ChildItem cert:\CurrentUser\my –CodeSigningCert

हमारे मामले में, हम व्यक्तिगत उपयोगकर्ता सर्टिफिकेट स्टोर से पहला सर्टिफिकेट लेंगे और इसे $cert वेरिएबल में सहेजेंगे:

$cert = (Get-ChildItem cert:\CurrentUser\my –CodeSigningCert)[0]

यदि आपने अपना सर्टिफिकेट विश्वसनीय रूट सर्टिफिकेट स्टोर में ले जाया है, तो निम्न कमांड का उपयोग करें:

$cert = (Get-ChildItem Cert:\LocalMachine\AuthRoot –CodeSigningCert)[0]

फिर आप इस सर्टिफिकेट का उपयोग अपने PowerShell स्क्रिप्ट के साथ PS1 फाइल पर हस्ताक्षर करने के लिए कर सकते हैं:

Set-AuthenticodeSignature -Certificate $cert -FilePath C:\PS\testscript.ps1

आप निम्न कमांड का भी उपयोग कर सकते हैं (इस मामले में, हम पहले बनाए गए सेल्फ-साइन सर्टिफिकेट को DNS नाम से चुनते हैं):

Set-AuthenticodeSignature C:\PS\test_script.ps1 @(gci Cert:\LocalMachine\AuthRoot -DnsName testPC1 -codesigning)[0]

संकेत: Set-AuthenticodeSignature cmdlet में एक विशेष TimestampServer पैरामीटर होता है जो टाइमस्टैम्प सेवा के लिए URL निर्दिष्ट करता है। यदि यह पैरामीटर खाली छोड़ दिया जाता है, तो सर्टिफिकेट समाप्त होने के बाद PS स्क्रिप्ट चलना बंद कर देगी। उदाहरण के लिए, आप टाइमस्टैम्प सर्वर को इस तरह सेट कर सकते हैं: -TimestampServer "https://timestamp.verisign.com/scripts/timstamp.dll"

यदि आप स्क्रिप्ट पर हस्ताक्षर करने के लिए सामान्य SSL/TLS सर्टिफिकेट का उपयोग करने का प्रयास करते हैं, तो एक त्रुटि दिखाई देती है:

Set-AuthenticodeSignature: Cannot sign code. The specified certificate is not suitable for code signing.

आप फोल्डर में सभी PowerShell स्क्रिप्ट फाइलों पर एक साथ हस्ताक्षर कर सकते हैं:

Get-ChildItem c:\ps\*.ps1| Set-AuthenticodeSignature -Certificate $Cert

हस्ताक्षर सत्यापित करना

अब आप जांच सकते हैं कि PowerShell स्क्रिप्ट फाइल पर सही ढंग से हस्ताक्षर किए गए हैं या नहीं। आप Get-AuthenticodeSignature cmdlet का उपयोग कर सकते हैं या PS1 फाइल के गुण खोलकर डिजिटल हस्ताक्षर टैब पर जा सकते हैं।

Get-AuthenticodeSignature c:\ps\test_script.ps1 | ft -AutoSize

यदि Set-AuthenticodeSignature कमांड निष्पादित करते समय UnknownError चेतावनी दिखाई देती है, तो यह सर्टिफिकेट विश्वसनीय नहीं है क्योंकि यह उपयोगकर्ता के व्यक्तिगत सर्टिफिकेट स्टोर में स्थित है।

आपको इसे विश्वसनीय रूट सर्टिफिकेट में ले जाने की आवश्यकता है (Windows सर्टिफिकेट स्टोर में संदिग्ध सर्टिफिकेट के लिए समय-समय पर जांच करना और विश्वसनीय रूट सर्टिफिकेट सूची को अपडेट करना न भूलें):

Move-Item -Path $cert.PSPath -Destination "Cert:\LocalMachine\Root"

अब PS1 फाइल के हस्ताक्षर को सत्यापित करते समय, Valid स्थिति वापस की जानी चाहिए।

PowerShell स्क्रिप्ट फाइल पर हस्ताक्षर करते समय, Set-AuthenticodeSignature cmdlet PS1 टेक्स्ट फाइल के अंत में एक डिजिटल हस्ताक्षर ब्लॉक जोड़ता है:

# SIG # Begin signature block ........... ........... # SIG # End signature block

हस्ताक्षर ब्लॉक में स्क्रिप्ट का हैश होता है, जिसे निजी कुंजी का उपयोग करके एन्क्रिप्ट किया जाता है।

पहली बार स्क्रिप्ट चलाने का प्रयास करते समय, एक चेतावनी दिखाई देगी:

Do you want to run software from this untrusted publisher? File C:\PS\script.ps1 is published by CN=testPC1 and is not trusted on your system. Only run scripts from trusted publishers.

यदि आप स्क्रिप्ट के पहले रन पर [A] हमेशा चलाएं का चयन करते हैं, तो अगली बार इस सर्टिफिकेट का उपयोग करके हस्ताक्षरित स्क्रिप्ट चलाने पर चेतावनी अब दिखाई नहीं देगी।

इस चेतावनी को प्रकट होने से रोकने के लिए, आपको सर्टिफिकेट को विश्वसनीय प्रकाशक प्रमाणन प्राधिकारी में भी कॉपी करना होगा। सर्टिफिकेट कंसोल में कॉपी-पेस्ट ऑपरेशन का उपयोग करके सर्टिफिकेट को विश्वसनीय प्रकाशक -> सर्टिफिकेट में कॉपी करें।

हस्ताक्षरित PowerShell स्क्रिप्ट अब अविश्वसनीय प्रकाशक अधिसूचना प्रदर्शित किए बिना चलेगी।

टिप: CA रूट सर्टिफिकेट और स्क्रिप्ट पर हस्ताक्षर करने के लिए उपयोग किया जाने वाला सर्टिफिकेट विश्वसनीय होना चाहिए (अन्यथा स्क्रिप्ट नहीं चलेगी)। आप GPO का उपयोग करके डोमेन कंप्यूटरों पर सर्टिफिकेट को केंद्रीय रूप से तैनात कर सकते हैं। सर्टिफिकेट को GPO के निम्नलिखित पब्लिक कुंजी अनुभागों में रखा जाना चाहिए: कंप्यूटर कॉन्फ़िगरेशन -> नीतियां -> Windows सेटिंग्स -> सुरक्षा सेटिंग्स -> पब्लिक कुंजी नीतियां -> विश्वसनीय रूट प्रमाणन प्राधिकरण और विश्वसनीय प्रकाशक।

यदि रूट सर्टिफिकेट अविश्वसनीय है, तो PowerShell स्क्रिप्ट चलाने पर एक त्रुटि दिखाई देगी:

A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.

हस्ताक्षरित स्क्रिप्ट में परिवर्तन का पता लगाना

यदि आप हस्ताक्षरित PowerShell स्क्रिप्ट फाइल के कोड को बदलते हैं तो क्या होगा? इसे चलाने का प्रयास इस अधिसूचना के साथ ब्लॉक कर दिया जाएगा कि स्क्रिप्ट की सामग्री बदल दी गई है।

File xx.ps1 cannot be loaded. The contents of file xx.ps1 might have been changed by an unauthorized user or process, because the hash of the file does not match the hash stored in the digital signature. The script cannot run on the specified system.

Get-AuthenticodeSignature cmdlet का उपयोग करके स्क्रिप्ट के हस्ताक्षर को सत्यापित करने का प्रयास करें। यदि गणना किया गया हैश हस्ताक्षर में हैश से मेल नहीं खाता है, तो HashMismatch संदेश दिखाई देता है।

इस प्रकार, हस्ताक्षरित PS1 स्क्रिप्ट के कोड में कोई भी संशोधन इसे पुनः हस्ताक्षर करने की आवश्यकता होगी।

  1. GIMP से दस्तावेज़ पर हस्ताक्षर कैसे करें GIMP से दस्तावेज़ पर हस्ताक्षर कैसे करें

    किसी ने आपसे एक दस्तावेज़ पर हस्ताक्षर करके ईमेल करने के लिए कहा, तो अब आपको प्रिंटर और स्कैनर खरीदना होगा, दस्तावेज़ प्रिंट करना होगा, उस पर हस्ताक्षर करना होगा, और उसे स्कैन करना होगा। ... नहीं! रुकें! कागज क्यों बर्बाद करें जब लंबे समय से अपने दस्तावेज़ों पर डिजिटल रूप से हस्ताक्षर करना संभव है?

  1. PowerShell में डिले/पॉज जोड़ें: सरल कमांड और व्यावहारिक उदाहरण PowerShell में डिले/पॉज जोड़ें: सरल कमांड और व्यावहारिक उदाहरण

    PowerShell स्क्रिप्ट में पॉज कैसे जोड़ें PowerShell ISE खोलें (Start से)। स्क्रिप्ट खोलें। जहां पॉज चाहिए वहां डालें: Start-Sleep -Seconds 5 (5 की जगह सेकंड डालें)। सेव करके चलाएं। सिंटैक्स Start-Sleep -Seconds <नंबर> Start-Sleep -Milliseconds <नंबर> उदाहरण Start-Sleep -Seconds 1.5

  1. विंडोज 10 और 11 पर विजुअल स्टूडियो कोड के साथ पावरशेल स्क्रिप्ट बनाएं और चलाएं: शुरुआती गाइड विंडोज 10 और 11 पर विजुअल स्टूडियो कोड के साथ पावरशेल स्क्रिप्ट बनाएं और चलाएं: शुरुआती गाइड

    क्या आप जानते हैं कि आप विंडोज 10 और विंडोज 11 पर पावरशेल स्क्रिप्ट बना सकते हैं? अब जब आपने विंडोज पर पावरशेल इंस्टॉल कर लिया है, तो आप जानना चाहेंगे कि आप अपने पीसी पर इसके साथ क्या कर सकते हैं। इस गाइड में, हम आपको दिखाएंगे कि विजुअल स्टूडियो कोड का उपयोग करके एक साधारण स्क्रिप्ट फ़ाइल कैसे बनाएं