最近、DigiCert EV コード署名証明書を購入しました。signtool.exe を使用して .exe ファイルに署名できます。ただし、ファイルに署名するたびに、SafeNet eToken パスワードの入力を求められます。
パスワードをどこかに保存/キャッシュすることで、ユーザーの介入なしにこのプロセスを自動化するにはどうすればよいでしょうか?
最近、DigiCert EV コード署名証明書を購入しました。signtool.exe を使用して .exe ファイルに署名できます。ただし、ファイルに署名するたびに、SafeNet eToken パスワードの入力を求められます。
パスワードをどこかに保存/キャッシュすることで、ユーザーの介入なしにこのプロセスを自動化するにはどうすればよいでしょうか?
私の知る限り、ログイン ダイアログをバイパスする方法はありませんが、できることは、ログイン セッションごとに 1 回だけ要求するように SafeNet Authentication Client を構成することです。
SAC のドキュメント (「 」、「 」の\ProgramFiles\SafeNet\Authentication\SAC\SACHelp.chm
章にインストールされていることがわかります) をここに引用します。Client Settings
Enabling Client Logon
シングル ログオンが有効になっている場合、ユーザーは、各コンピューター セッション中にトークン パスワードを 1 回要求するだけで、複数のアプリケーションにアクセスできます。これにより、ユーザーが各アプリケーションに個別にログオンする必要がなくなります。
デフォルトでは無効になっているこの機能を有効にするには、SAC の詳細設定に移動し、[シングル ログオンを有効にする] ボックスをオンにします。
コンピューターを再起動すると、トークン パスワードの入力を求めるプロンプトが 1 回だけ表示されるようになります。私たちの場合、ビルドごとに 200 を超えるバイナリに署名する必要があるため、これは合計で必須です。
それ以外の場合は、ログオン ダイアログに自動的に応答できるようにする小さな C# コンソール サンプル コード (m1st0 のものと同等) を次に示します (おそらく管理者として実行する必要があります) (コンソール プロジェクト (UIAutomationClient.dll
およびUIAutomationTypes.dll
)から参照する必要があります)。
using System;
using System.Windows.Automation;
namespace AutoSafeNetLogon {
class Program {
static void Main(string[] args) {
SatisfyEverySafeNetTokenPasswordRequest("YOUR_TOKEN_PASSWORD");
}
static void SatisfyEverySafeNetTokenPasswordRequest(string password) {
int count = 0;
Automation.AddAutomationEventHandler(WindowPattern.WindowOpenedEvent, AutomationElement.RootElement, TreeScope.Children, (sender, e) =>
{
var element = sender as AutomationElement;
if (element.Current.Name == "Token Logon") {
WindowPattern pattern = (WindowPattern)element.GetCurrentPattern(WindowPattern.Pattern);
pattern.WaitForInputIdle(10000);
var edit = element.FindFirst(TreeScope.Descendants, new AndCondition(
new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit),
new PropertyCondition(AutomationElement.NameProperty, "Token Password:")));
var ok = element.FindFirst(TreeScope.Descendants, new AndCondition(
new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button),
new PropertyCondition(AutomationElement.NameProperty, "OK")));
if (edit != null && ok != null) {
count++;
ValuePattern vp = (ValuePattern)edit.GetCurrentPattern(ValuePattern.Pattern);
vp.SetValue(password);
Console.WriteLine("SafeNet window (count: " + count + " window(s)) detected. Setting password...");
InvokePattern ip = (InvokePattern)ok.GetCurrentPattern(InvokePattern.Pattern);
ip.Invoke();
} else {
Console.WriteLine("SafeNet window detected but not with edit and button...");
}
}
});
do {
// press Q to quit...
ConsoleKeyInfo k = Console.ReadKey(true);
if (k.Key == ConsoleKey.Q)
break;
}
while (true);
Automation.RemoveAllEventHandlers();
}
}
}
ビルド プロセスの自動化に役立つベータ ツールを作成しました。
これは、クライアント サーバー Windows アプリケーションです。EVトークンを挿入したPCでサーバーを起動できます。サーバー側アプリケーションの起動時にトークンのパスワードを入力します。この後、リモートでファイルに署名できます。クライアント側アプリケーションは signtool.exe を完全に置き換えるため、既存のビルド スクリプトを使用できます。
ここにあるソースコード: https://github.com/SirAlex/RemoteSignTool
編集: このツールを使用して、この半年間、24 時間年中無休でビルド サーバーのコード署名に成功しました。すべて正常に動作します。
AutoHotKeyを使用して、次のスクリプトを使用してパスワード入力を自動化しました。私たちは、開発者が署名して返すことができるように、このスクリプトを実行して Windows ボックスにバイナリを送信するための Web ベースのフロント エンドを作成しようとしています。
Loop
{
Sleep 2000
if (WinExist("Token Logon"))
{
WinActivate ; use the window found above
SendInput [your_password]
SendInput {Enter}
}
if (WinExist("DigiCert Certificate Utility for Windows©"))
{
WinActivate ; use the window found above
SendInput [your_password]
SendInput {Enter}
}
}
私が共有したものは完全に安全ではないことに注意する必要がありますが、この問題も発生し、開発者ごとに署名キーを購入するか、リリースされたソフトウェアの署名を承認する署名マネージャーの仕事を割り当てる必要があります. 私は、それらがより優れた安全なプロセスであると信じています。つまり、品質保証に合格し、リリースが承認されたら、正式に署名することができます。ただし、小規模な会社のニーズでは、これを他の自動化された方法で行う必要がある場合があります。
私は元々 Linux で (EV 証明書の前に) osslsigncodeを使用して、Windows 実行可能ファイルの署名を自動化しました (Linux サーバーが開発者の容易さとコラボレーションのために多くの作業を行っていたため)。osslsigncode の開発者に連絡して、DigiCert SafeNet トークンを利用して別の方法で自動化できるかどうかを確認しました。Linux で確認できるからです。彼の返事は希望を与えてくれましたが、私には進展が見られず、これ以上時間を割くことができませんでした
私の場合、Digicert は CI の標準 (OV) 証明書を発行します。すでに EV 証明書をお持ちの場合は無料です。
これが解決策ではないことはわかっていますが、サーバー(クラウドサーバー)にトークンを入れることができない場合は、これが道です。