डिजिटल हस्ताक्षर के साथ एक स्क्रिप्ट या निष्पादन योग्य उपयोगकर्ता को यह सुनिश्चित करने की अनुमति देता है कि फ़ाइल मूल है और इसका कोड तीसरे पक्ष द्वारा नहीं बदला गया है। पावरशेल के वर्तमान संस्करणों में डिजिटल प्रमाणपत्रों का उपयोग करके *.ps1 स्क्रिप्ट फ़ाइलों के कोड हस्ताक्षर के लिए अंतर्निहित उपकरण हैं।
आप एक विशेष प्रकार के प्रमाणपत्र का उपयोग करके PowerShell स्क्रिप्ट पर हस्ताक्षर कर सकते हैं - कोड साइनिंग . यह प्रमाणपत्र बाहरी वाणिज्यिक प्रमाणन प्राधिकरण (एसी), एक आंतरिक उद्यम सीए से प्राप्त किया जा सकता है या आप स्व-हस्ताक्षरित प्रमाणपत्र का उपयोग कर सकते हैं।
मान लीजिए, PKI सेवाएँ (Active Directory Certificate Services) आपके डोमेन में परिनियोजित हैं। आइए https://CA-server-name/certsrv पर जाकर और कोड साइनिंग के साथ एक नए प्रमाणपत्र का अनुरोध करके नए प्रमाणपत्र का अनुरोध करें टेम्प्लेट (यह टेम्प्लेट पहले प्रमाणन प्राधिकरण कंसोल में सक्षम होना चाहिए)।
साथ ही, उपयोगकर्ता एमएमसी स्नैप-इन प्रमाणपत्रों से पावरशेल स्क्रिप्ट पर हस्ताक्षर करने के लिए प्रमाणपत्र का अनुरोध कर सकता है -> मेरा खाता -> व्यक्तिगत -> सभी कार्य -> एक नए प्रमाणपत्र का अनुरोध करें।
यदि आपने मैन्युअल रूप से किसी प्रमाणपत्र का अनुरोध किया है, तो आपके पास .cer . के साथ x509 प्रमाणपत्र फ़ाइल होनी चाहिए विस्तार। यह प्रमाणपत्र आपके कंप्यूटर के स्थानीय प्रमाणपत्र स्टोर में स्थापित होना चाहिए।
कंप्यूटर के विश्वसनीय रूट प्रमाणपत्र में प्रमाणपत्र जोड़ने के लिए आप निम्न पावरशेल कमांड का उपयोग कर सकते हैं:
$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
) का उपयोग करके इसे इंटरमीडिएट कंटेनर से ट्रस्टेड रूट पर ले जाएं। )।
प्रमाण पत्र प्राप्त करने के बाद, आप केवल हस्ताक्षरित स्क्रिप्ट को चलाने की अनुमति देने के लिए पावरशेल स्क्रिप्ट निष्पादन नीति को कॉन्फ़िगर कर सकते हैं। डिफ़ॉल्ट रूप से, Windows 10/Windows Server 2016 पर PowerShell निष्पादन नीति प्रतिबंधित पर सेट होती है (किसी भी पावरशेल स्क्रिप्ट के निष्पादन को रोकता है)।
File C:\ps\script.ps1 cannot be loaded because running scripts is disabled on this system.
केवल हस्ताक्षरित PS1 स्क्रिप्ट को चलाने की अनुमति देने के लिए, आप PowerShell Eecution नीति को AllSigned या RemoteSigned में बदल सकते हैं (केवल इस अंतर के साथ कि RemoteSign को केवल इंटरनेट से डाउनलोड की गई स्क्रिप्ट के लिए एक हस्ताक्षर की आवश्यकता होती है):
Set-ExecutionPolicy AllSigned –Force
इस मोड में, अहस्ताक्षरित पावरशेल स्क्रिप्ट चलाते समय, एक त्रुटि दिखाई देती है:
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 स्क्रिप्ट को चलने की अनुमति दे सकते हैं कंप्यूटर कॉन्फ़िगरेशन के तहत समूह नीति पैरामीटर -> नीतियां -> प्रशासनिक टेम्पलेट -> विंडोज घटक -> विंडोज पावरशेल। पैरामीटर मान को केवल हस्ताक्षरित स्क्रिप्ट की अनुमति दें . में बदलें .
अब PowerShell स्क्रिप्ट फ़ाइल पर हस्ताक्षर करने के लिए आगे बढ़ते हैं। सबसे पहले, आपको वर्तमान उपयोगकर्ता के स्थानीय प्रमाणपत्र स्टोर से कोडसाइन प्रमाणपत्र प्राप्त करने की आवश्यकता है। सबसे पहले, आइए उन सभी प्रमाणपत्रों को सूचीबद्ध करें जिनका उपयोग कोड पर हस्ताक्षर करने के लिए किया जा सकता है:
Get-ChildItem cert:\CurrentUser\my –CodeSigningCert
हमारे मामले में, हम व्यक्तिगत उपयोगकर्ता प्रमाणपत्र स्टोर से पहला प्रमाणपत्र लेंगे और इसे $cert चर में सहेजेंगे:
$cert = (Get-ChildItem cert:\CurrentUser\my –CodeSigningCert)[0]
यदि आपने अपने प्रमाणपत्र को विश्वसनीय रूट प्रमाणपत्र स्टोर में स्थानांतरित कर दिया है, तो निम्न आदेश का उपयोग करें:
$cert = (Get-ChildItem Cert:\LocalMachine\AuthRoot –CodeSigningCert)[0]
फिर आप इस प्रमाणपत्र का उपयोग अपनी पॉवरशेल स्क्रिप्ट के साथ PS1 फ़ाइल पर हस्ताक्षर करने के लिए कर सकते हैं:
Set-AuthenticodeSignature -Certificate $cert -FilePath C:\PS\testscript.ps1
आप निम्न आदेश का भी उपयोग कर सकते हैं (इस मामले में, हम DnsName द्वारा पहले बनाए गए स्व-हस्ताक्षरित प्रमाणपत्र का चयन करते हैं):
Set-AuthenticodeSignature C:\PS\test_script.ps1 @(gci Cert:\LocalMachine\AuthRoot -DnsName testPC1 -codesigning)[0]
-TimestampServer "https://timestamp.verisign.com/scripts/timstamp.dll"
यदि आप स्क्रिप्ट पर हस्ताक्षर करने के लिए एक सामान्य एसएसएल/टीएलएस प्रमाणपत्र का उपयोग करने का प्रयास करते हैं, तो एक त्रुटि दिखाई देती है:
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
यदि कोई UnknownError
सेट-AuthenticodeSignature कमांड को निष्पादित करते समय चेतावनी दिखाई देती है, तो यह प्रमाणपत्र विश्वसनीय नहीं है, क्योंकि उपयोगकर्ता के व्यक्तिगत प्रमाणपत्र स्टोर में स्थित है।
आपको इसे विश्वसनीय रूट प्रमाणपत्रों में ले जाने की आवश्यकता है (संदिग्ध प्रमाणपत्रों के लिए समय-समय पर विंडोज प्रमाणपत्र स्टोर की जांच करना न भूलें और विश्वसनीय रूट प्रमाणपत्र सूचियों को अपडेट करें):
Move-Item -Path $cert.PSPath -Destination "Cert:\LocalMachine\Root"
अब PS1 फ़ाइल के हस्ताक्षर की पुष्टि करते समय, मान्य स्थिति लौटा दी जानी चाहिए।
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] हमेशा स्क्रिप्ट के पहले रन पर चलें , अगली बार जब आप इस प्रमाणपत्र का उपयोग करके हस्ताक्षरित स्क्रिप्ट चलाएंगे, तो कोई चेतावनी दिखाई नहीं देगी।
<मजबूत>
इस चेतावनी को प्रदर्शित होने से रोकने के लिए, आपको प्रमाणपत्र को विश्वसनीय प्रकाशकों को भी कॉपी करना होगा प्रमाणपत्र, प्राधिकारी। विश्वसनीय प्रकाशकों को प्रमाणपत्र की प्रतिलिपि बनाने के लिए प्रमाणपत्र कंसोल में कॉपी-पेस्ट ऑपरेशन का उपयोग करें -> प्रमाणपत्र।
<मजबूत>
हस्ताक्षरित पावरशेल स्क्रिप्ट अब अविश्वसनीय प्रकाशक अधिसूचना प्रदर्शित किए बिना चलेगी।
युक्ति . CA रूट प्रमाणपत्र और स्क्रिप्ट पर हस्ताक्षर करने के लिए उपयोग किए जाने वाले प्रमाणपत्र पर भरोसा किया जाना चाहिए (अन्यथा, स्क्रिप्ट नहीं चलेगी)। आप GPO का उपयोग करके डोमेन कंप्यूटरों पर प्रमाणपत्रों को केंद्रीय रूप से परिनियोजित कर सकते हैं। प्रमाणपत्रों को GPO के निम्नलिखित सार्वजनिक कुंजी अनुभागों में रखने की आवश्यकता है:कंप्यूटर कॉन्फ़िगरेशन -> नीतियां -> विंडोज सेटिंग्स -> सुरक्षा सेटिंग्स -> सार्वजनिक कुंजी नीतियां -> विश्वसनीय रूट प्रमाणन प्राधिकरण और विश्वसनीय प्रकाशक ।
यदि रूट प्रमाणपत्र अविश्वसनीय है, तो जब आप पावरशेल स्क्रिप्ट चलाते हैं, तो एक त्रुटि दिखाई देगी:
A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
यदि आप हस्ताक्षरित पावरशेल स्क्रिप्ट फ़ाइल का कोड बदलते हैं तो क्या होगा? इसे चलाने का प्रयास इस अधिसूचना के साथ अवरुद्ध कर दिया जाएगा कि स्क्रिप्ट की सामग्री बदल दी गई है।
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 स्क्रिप्ट के कोड के किसी भी संशोधन के लिए उस पर फिर से हस्ताक्षर करने की आवश्यकता होगी।