48時間で最初のスクリプトに署名する方法

問題



解決策を必要とする問題が小さい場合、特にあなたが.NETプログラマーである場合、それを解決するために別のユーティリティを作成することは本当に望みません。

スクリプト? 確かに、はい、しかしWindowsベースの戦闘車両にサードパーティの通訳を配置することはまったくクリスチャンではありません。 それでは、なぜWindows Powershellを使用しないのですか? 私はすぐに正直に認める準備ができています。彼との経験はほとんどありませんでしたが、とても魅力的でした。

問題を解決するスクリプトは、1つの「しかし」を考慮しない場合、15分で準備が整いました。 スクリプトとしての実行に適さない一連の命令であるため、スクリプトと呼ぶことはまだ困難でした。 PowerShellの点では不適切です。



すべてについて合理的な説明があります-もちろん、スクリプトの実行には特定の制限が課されます。これは、スクリプト実行ポリシーによって設定さます。 スクリプトを作成したので、マシン上ですぐに実行できませんでした。 ただし、 実稼働サーバー上で実行ポリシーを一時的にUnrestrictedまたは、より正確にはRemoteSignedに変更することにより、ローカルマシンの問題は解決されました。



常に出口があります。 実行用の既製のスクリプトに署名する必要があるのは論理的です。 署名メカニズムを整理するプロセスは非常に長く厄介ですが、この投稿の良い土として役立ちました。



自宅とオフィスでの2日間の苦痛の後、PowerShellのスクリプトへの署名に関する簡単なマニュアルを公開しました。



解決策



デフォルトでは、スクリプトの実行は禁止されています。 開始するには、信頼できるルート証明書を使用して、信頼できる発行元からの署名済みスクリプトのみの実行を許可する必要があります。 Powershell 管理セッションの一部として:



> Set-ExecutionPolicy AllSigned







タンバリンとのさらなるダンスは、ルート証明書と個人証明書を作成するためのユーティリティに関連しています。

スクリプトに署名するための「指示」に従ったすべての証明書



> Get-Help About_Signing







%Program Files%\ Microsoft SDKs \ Windows \ v7.0A \ bin \ makecertにあるmakecert.exeユーティリティを使用して作成



次の2つのアクションは、通常のコマンドラインセッションの一部として実行されます。



> makecert -n "CN=PowerShell Local Certificate Root" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer -ss Root -sr localMachine



> makecert -pe -n "CN=PowerShell User" -ss MY -a sha1 -eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer









最初の行は、ローカルマシンを証明機関として使用してルート証明書を作成します。 証明書を取得する最も一般的な「無料」の方法。

2行目では、PowerShellユーザーの個人証明書を作成します。この証明書には、スクリプトが署名され、ルート証明書で証明されます。 すべてがうまくいけば、両方の行に成功の結果が表示されます。



X509個人証明書が既に存在する場合、上記の操作は実行されません。



その後、念のため、作成した証明書をOSが認識していることを確認できます。 PowerShell:



> Get-Childitem cert:\CurrentUser\my -codesigning







スクリプトに署名することはすでに可能ですが、この場合、そのようなPowershell行は毎回スクリプト署名に行きます:



> Set-AuthenticodeSignature "FileName" @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]







他のスクリプトに署名するスクリプトを作成することは論理的です。 スクリプトは、PowerShell ISE 以外のテキストエディターで作成する必要があります。 この環境内で作成されたスクリプトの場合、 不明なエラーとしての署名に関する問題発生します。 ここで決定が下されます



スクリプト自体は次のようになります。

param([string] $file=$(throw "Please specify a filename."))

$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]

Set-AuthenticodeSignature $file $cert







上記の手順を使用して、このスクリプト自体にインタラクティブなPowerShellモードで署名します。

その後、別のマシンで実行するスクリプトに次のように署名できます。



> .\Add-Signature.ps1 MyScript.ps1







ああ悲しい



証明書が作成されたマシンを除くすべてのマシン:

  1. ルート証明書が信頼されていない場合、スクリプトはまったく失敗します。
  2. スクリプトに署名した発行者の個人証明書が信頼されない場合、スクリプトは確認のみで実行されます。


信頼できる証明書にルート証明書と個人証明書を追加するには、 証明書スナップインでmmc管理コンソールを使用する必要があります。 証明書を信頼されたルート証明機関フォルダーと信頼された発行元フォルダーに追加します。



それが唯一の真の解決策のふりをするわけではありませんが、研究結果は、これまでのところこれが多かれ少なかれ普通の方法であることを示しています。 状況を明確にし、可能であればリンクを突くのを手伝ってくれることを知っている人にお願いします。



All Articles