Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

コード署名証明書を使用してPowerShellスクリプト(PS1)に署名する方法は?

スクリプトまたはデジタル署名付きの実行可能ファイルを使用すると、ユーザーはファイルがオリジナルであり、そのコードがサードパーティによって変更されていないことを確認できます。 PowerShellの現在のバージョンには、デジタル証明書を使用して*.ps1スクリプトファイルのコード署名を行うためのツールが組み込まれています。

特別な種類の証明書(コード署名)を使用してPowerShellスクリプトに署名できます 。この証明書は、外部の商用認証局(AC)、内部のエンタープライズCAから取得できます。または、自己署名証明書を使用することもできます。

PKIサービス(Active Directory証明書サービス)がドメインに展開されているとします。 https:// CA-server-name / certsrvにアクセスし、コード署名を使用して新しい証明書をリクエストして、新しい証明書をリクエストしましょう。 テンプレート(このテンプレートは、最初に認証局コンソールで有効にする必要があります)。

コード署名証明書を使用してPowerShellスクリプト(PS1)に署名する方法は?

また、ユーザーは、mmcスナップイン[証明書]->[マイアカウント]->[個人]->[すべてのタスク]->[新しい証明書の要求]からPowerShellスクリプトに署名するための証明書を要求できます。

コード署名証明書を使用してPowerShellスクリプト(PS1)に署名する方法は?

手動で証明書を要求した場合は、 .cerを含むx509証明書ファイルが必要です。 拡大。この証明書は、コンピューターのローカル証明書ストアにインストールする必要があります。

次のPowerShellコマンドを使用して、コンピューターの信頼されたルート証明書に証明書を追加できます。

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

自己署名証明書を使用する場合は、New-SelfSignedCertificateコマンドレットを使用して、DNS名testPC1でCodeSigning証明書を作成します。

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スクリプト実行ポリシーを構成できます。デフォルトでは、Windows 10 / WindowsServer2016のPowerShell実行ポリシーは制限付きに設定されています (PowerShellスクリプトの実行をブロックします)。

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

署名されたPS1スクリプトのみの実行を許可するには、PowerShell Eecution Policyを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コンポーネント]->[WindowsPowerShell]のグループポリシーパラメーター。パラメータ値を署名されたスクリプトのみを許可するに変更します 。

次に、PowerShellスクリプトファイルの署名に移りましょう。まず、現在のユーザーのローカル証明書ストアからCodeSign証明書を取得する必要があります。まず、コードの署名に使用できるすべての証明書を一覧表示しましょう。

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

次のコマンドを使用することもできます(この場合、DnsNameによって以前に作成された自己署名証明書を選択します):

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

ヒント 。 Set-AuthenticodeSignatureコマンドレットには、サービスのタイムスタンプのURLを指定する特別なTimestampServerパラメーターがあります。このパラメーターを空白のままにすると、証明書の有効期限が切れた後、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コマンドレットを使用するか、PS1ファイルのプロパティを開いてデジタル署名に移動できます。 タブ。

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

コード署名証明書を使用してPowerShellスクリプト(PS1)に署名する方法は?

UnknownErrorの場合 Set-AuthenticodeSignatureコマンドの実行中に警告が表示された場合、この証明書はユーザーの個人証明書ストアにあるため、信頼されません。

コード署名証明書を使用してPowerShellスクリプト(PS1)に署名する方法は?

信頼されたルート証明書に移動する必要があります(疑わしい証明書がないかWindows証明書ストアを定期的に確認し、信頼されたルート証明書リストを更新することを忘れないでください):

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

これで、PS1ファイルの署名を確認するときに、有効なステータスが返されるはずです。

コード署名証明書を使用してPowerShellスクリプト(PS1)に署名する方法は?

PowerShellスクリプトファイルに署名する場合、Set-AuthenticodeSignatureコマンドレットは、PS1テキストファイルの最後にデジタル署名ブロックを追加します。

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

コード署名証明書を使用してPowerShellスクリプト(PS1)に署名する方法は?

署名ブロックには、秘密鍵を使用して暗号化されたスクリプトのハッシュが含まれています。

スクリプトを初めて実行しようとすると、警告が表示されます:

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スクリプト(PS1)に署名する方法は?

この警告が表示されないようにするには、証明書を信頼できる発行元にもコピーする必要があります。 証明する機関。証明書コンソールのコピーと貼り付け操作を使用して、証明書を[信頼された発行元]->[証明書]にコピーします。

コード署名証明書を使用してPowerShellスクリプト(PS1)に署名する方法は?

署名された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.

コード署名証明書を使用してPowerShellスクリプト(PS1)に署名する方法は?

Get-AuthenticodeSignatureコマンドレットを使用して、スクリプトの署名を確認してみてください。計算されたハッシュが署名のハッシュと一致しない場合、メッセージHashMismatch が表示されます。

コード署名証明書を使用してPowerShellスクリプト(PS1)に署名する方法は?

したがって、署名されたPS1スクリプトのコードを変更するには、再署名する必要があります。


  1. Powershell スクリプトに一時停止を追加する方法 (例あり)

    この記事では、powershell スクリプトに一時停止を追加する方法を紹介します。 一時停止または待機コマンドを追加するには、さまざまな方法があります。以下に、例を挙げてこれらの方法を示します。 Powershell スクリプトに一時停止を追加する方法 Powershell スクリプトに一時停止を追加するには、次の手順に従います PowerShell ISE を開く スタートメニューから 次に、一時停止コマンドを追加する PowerShell スクリプトを開きます start-sleep -Seconds 5 という行を追加します (数字の 5 を、スクリプトを一時停止する秒数に置

  2. Windows 10 および Windows 11 で Visual Studio Code を使用して PowerShell スクリプトを作成する方法

    Windows 10 と Windows 11 で PowerShell スクリプトを作成できることをご存知ですか? Windows に PowerShell をインストールしたので、PC で PowerShell を使用して何ができるか知りたいと思うかもしれません。このガイドでは、Visual Studio Code を使用して簡単なスクリプト ファイルを作成し、そのスクリプト ファイルを Windows 10 の PowerShell で実行する方法について説明しますおよび Windows 11. まず、基本的な PowerShell スクリプトを作成する方法を学ぶ必要があります。それを