PowerShellでAllSigned実行ポリシーを使用したいのですが、スクリプトの自己署名には数百メガバイトのダウンロードとインストールが必要で、署名プロセスは面倒なようです。
ドキュメントで説明されているよりも簡単にPowerShellスクリプトに署名する方法はありますか?
署名を行うには、Set-AuthenticodeSignature
コマンドレットを使用できます。もちろん、これには証明書が必要です。 (おそらくない)認証局を持っている場合は、コード署名証明書を作成できます。それ以外の場合、自己署名証明書を作成するためのさまざまなツールがあります。
証明書ストアに証明書をインストールし(Windowsエクスプローラーで.cer
または.pfx
ファイルを開いて)、次にSet-AuthenticodeSignature
(cert:
プロバイダー/ドライブは、ストア内の証明書へのアクセスを提供します)。
使用する
help about_signing
または詳細については、ヘルプトピックの オンラインバージョン (Windows SDKツールを使用した自己署名証明書の作成を含む)[1])。
[1] これはあなたが言及している大きなダウンロードだと思います:必要なビットをインストールするか、他のツールを利用することができます(OpenSSLには証明書の生成が含まれています)。 SDKの取得は、この目的のために、1回限りのアクティビティです。
このPowerShellスクリプトを使用します。
## sign-script.ps1
## Sign a powershell script with a Thawte certificate and
## timestamp the signature
##
## usage: ./sign-script.ps1 c:\foo.ps1
param([string] $file=$(throw “Please specify a script filepath.”))
$certFriendlyName = "Thawte Code Signing"
$cert = gci cert:\CurrentUser\My -codesigning | where -Filter
{$_.FriendlyName -eq $certFriendlyName}
# https://www.thawte.com/ssl-digital-certificates/technical-
# support/code/msauth.html#timestampau
# We thank VeriSign for allowing public use of their timestamping server.
# Add the following to the signcode command line:
# -t http://timestamp.verisign.com/scripts/timstamp.dll
$timeStampURL = "http://timestamp.verisign.com/scripts/timstamp.dll"
if($cert) {
Set-AuthenticodeSignature -filepath $file -cert $cert -IncludeChain All -
TimeStampServer $timeStampURL
}
else {
throw "Did not find certificate with friendly name of `"$certFriendlyName`""
}
証明書を取得したら、インポートしたユーザーアカウントを使用したいと思いました。このレジストリキーにより、コンテキストメニューにオプションSignが表示されました(Windows 7を使用しています)。署名したい証明書が別の方法で保存されている場合は、最後に PowerShell コマンドを変更します。
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1]
[HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1\Shell]
[HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1\Shell\Sign]
[HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1\Shell\Sign\Command]
@="C:\\\Windows\\\System32\\\WindowsPowerShell\\\v1.0\\\powershell.exe -command Set-AuthenticodeSignature '%1' @(Get-ChildItem cert:\\\CurrentUser\\\My -codesigning)[0]"