スクリプトの署名

Security Controls でスクリプトをインポートまたは実行するには、スクリプトが信頼できる機関によって署名されている必要があります。Security Controls に付属しているすべてのスクリプトは Ivanti によって署名されています。Security Controls のインストール中には、Ivanti 証明書がコンソール コンピュータの信頼できる証明書ストアに追加されます。

Security Controls にインポートする前に作成するスクリプトを署名する必要があります。このためには、署名証明書が必要です。 証明書は、作成するスクリプトを実行するコンソールの信頼リストに登録されている機関によって発行されている必要があります。

このセクションでは、署名証明書を作成して、コンソールで信頼できる証明書に追加する1つの方法について説明します。

コード署名証明書を発行できるルート証明書を作成する

この手順では、Windows 10 または Windows Server 2016 以降を使用する必要があります。

コード署名証明書を発行できる、新しいルート証明書を作成するには、次のコマンドを使用します。

PS C:\> $signerRoot = New-SelfSignedCertificate -Subject "CN=PowerShell Local Certificate Root2" -HashAlgorithm Sha256 -CertStoreLocation Cert:\LocalMachine\My -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3") -KeyUsageProperty None -KeyUsage None

署名証明書の作成

この手順では、Windows 10 または Windows Server 2016 以降を使用する必要があります。

次に、ルート証明書で発行された署名証明書を作成します。 このためには、コマンドプロンプトで次のように入力します。

PS C:\> $powershellSignerSigner = New-SelfSignedCertificate -Subject "CN=PowerShell User" -HashAlgorithm Sha256 -CertStoreLocation Cert:\LocalMachine\My -Signer $signerRoot -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3") -KeyUsageProperty None -KeyUsage None

署名証明書の検証

PowerShell 内から証明書を検証するには、次のコマンドを入力します。

Get-ChildItem cert:\LocalMachine\My -codesigning | Where-Object {$_.Subject -match "CN=PowerShell User"}

証明書が見つかった場合は、次のように証明書のサムプリントと件名が表示されます。

署名証明書を信頼できるルート証明書ストアに移動する

「My」証明書ストアの署名証明書を信頼できる「Root」証明書ストアに移動する必要があります。 これで、ルート ストアへの信頼チェーンが構築されます。

PS C:\> Move-Item -Path "Cert:\LocalMachine\My\$($signerRoot.Thumbprint)" -Destination Cert:\LocalMachine\Root

スクリプトの署名

このセクションでは、PowerShell プロンプトまたは PowerShell ISE からスクリプト ファイルを署名する方法について説明します。

PowerShell コマンドプロンプトから、スクリプト ファイルを含むディレクトリに変更します。 この例では、test-script.ps1という名前です。 次に、次の2つのコマンドを入力します。

最初のコマンドは1行で入力してください。 CN=PowerShell User は、署名証明書を作成したときに指定した名前と一致する必要があります。

$cert = @(Get-ChildItem cert:\LocalMachine\My -codesigning | Where-Object {$_.Subject -match "CN=PowerShell User"})[0]

Set-AuthenticodeSignature .\test-script.ps1 $cert

最初のコマンドは、証明書ストアの証明書を検索します。 次のコマンドはその証明書を使用してスクリプトを署名します。

スクリプトを署名すると、次のようなブロックがスクリプトの最後に追加されます。

# SIG # 署名ブロックの先頭

# MIIEMwYJKoZIhvcNAQcCoIIEJDCCBCACAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB

# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR

# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU4QyppfQY+5HviH7wuIBvvmRf

……

# SIG # 署名ブロックの末尾

このスクリプトを変更する場合は、もう一度署名します。

PFX ファイルを使用してスクリプトを署名する

各コンピュータに署名証明書をインストールせずに、複数のコンピュータで同じ署名証明書を使用してスクリプトを署名する場合は、PFX (Personal Information Exchange) ファイルを使用できます。

PFX ファイルを作成するには:

  1. CertMgr.exe を実行します。
  2. [個人] タブで署名証明書を選択します。
  3. [エクスポート] をクリックします。
  4. 最初のエクスポート ウィザード画面で、[次へ] をクリックします。
  5. [Personal Information Exchange] オプションを選択します。
    [強力な保護を有効にする] オプションがある場合はオンにします。
  6. 確認メッセージが表示されたら、パスワードを入力します。
    この PFX ファイルを使用してスクリプトをを署名するときには、これが必要でうs。
  7. 確認メッセージが表示されたら、PFX ファイルの名前を入力します。

PFX ファイルを使用してスクリプトを署名するには、PowerShell で次のコマンドを入力します。

$cert = Get-PfxCertificate mycert.pfx

Set-AuthenticodeSignature .\test-script.ps1 $cert

確認メッセージが表示されたら、手順6で作成したパスワードを入力します。