Soliton OneGateでのゼロタッチ証明書配布 ~「デバイス予約」モードの活用~

水色の背景に六角形が2つあるイラスト 水色の背景に六角形が2つあるイラスト
アイキャッチ
目次

2026年3月のアップデートにより、Soliton OneGateに新たな証明書配布方式「デバイス予約モード」が追加されました。
デバイス予約モード機能により、あらかじめ許可した端末に対してのみ証明書を発行できるようになり、さらにスクリプトやOSの仕組みと組み合わせることで、利用者の操作を伴わない「ゼロタッチ証明書配布」を実現できます。
従来、証明書配布はユーザー操作やSCEPに対応したMDMを利用するケースが一般的でしたが、本機能により以下のようなニーズに対応可能になります。

  • AD参加端末への自動証明書配布
  • キッティング作業の省力化
  • 私物端末への証明書配布の防止

本記事では、「デバイス予約モード」の仕組みと、ゼロタッチ配布の実現方法について解説します。

Soliton OneGateの証明書配布方法と「デバイス予約」の位置づけ

これまでSoliton OneGateでは、「招待コード方式」「PKCS#12ファイル」「外部連携」の3つの配布方法が提供されていましたが、ここに第4の選択肢として「デバイス予約」が加わりました。
それぞれの特徴と最適な利用シーンは以下の通りです。

証明書発行方法機能の特徴主な利用シーン
招待コード管理者が発行した招待コードを使い、利用者が自身でアプリやブラウザから証明書を申請・取得します。通常の利用形態(社員のスマホやPCへの配布など)
PKCS#12ファイル管理者が管理画面から証明書を発行し、手動で端末にインストールします。情シスまたは外部委託業者によるキッティング作業など
外部連携IntuneやSCEP固定チャレンジ対応のMDMと連携し、管理下の端末へ自動配布します。MDM管理下にある会社支給端末への証明書配布
デバイス予約 (2026年3月のアップデートにて追加された機能)Soliton OneGateに事前登録した端末識別情報(Soliton KeyManagerで生成されるAPID、IMEI、UDID、MACアドレス)を持つ許可端末からのみ証明書の発行を受け付けます。管理者が許可した端末のみ証明書発行ができるため、私物端末への証明書配布を排除することが可能
バッチファイルや資産管理ツールを利用したAD参加端末への自動配布など

デバイス予約モードを使用したゼロタッチ証明書配布の実践

ゼロタッチ(利用者に何も操作させない)を実現するには、バッチファイルでSoliton KeyManagerを操作して証明書を取得させる必要があります。
今回は会社のActive Directoryに参加している端末を正規(会社で利用することが認められている)の端末であると定義して、スタートアップスクリプトやログオンスクリプトで証明書を配布する方法を紹介いたします。

システムの構成は次の通りです。

本ドキュメントではActive Directory並びにファイルサーバーはWindows Server 2025、クライアントPCはWindows 11 25H2を使用して説明しております。

ゼロタッチで証明書を配布する手順は次の通りとなります。

  • 【ステップ1】Soliton KeyManagerのインストール
  • 【ステップ2】Soliton OneGateへの端末識別情報の取得
  • 【ステップ3】Soliton OneGateを招待モードからデバイス予約モードに切り替える
  • 【ステップ4】ゼロタッチによる証明書配布

これらすべてのステップを踏む必要はなく、例えば端末にSoliton KeyManagerが展開済みであれば、ステップ1は飛ばしていただいて問題ございません。

【ステップ1】 Soliton KeyManagerのインストール

Windows端末でSoliton OneGateから証明書取得するにはSoliton KeyManagerのインストールが必要になります。 Soliton KeyManagerを既に展開済みだったり、OSマスターイメージに組み込まれている(組み込み手順についてはSoliton KeyManagerの説明書の「キッティングインストール」をご参照ください)、利用者に手動でインストールさせる場合などはこのステップはスキップしていただいて問題ございません。

【ワンポイントアドバイス】Soliton KeyManagerの設定
Soliton KeyManagerカスタム設定ツール(EPS/EPS-ap保守ご契約者様は弊社サポートサイト、OneGateご契約者様はSoliton Cloud Server Portalからダウンロード可能です)を使用すると、プロキシサーバーの指定などSoliton KeyManagerのデフォルト設定を変更したインストーラーを作ることが可能です。

さて、Soliton KeyManager のインストールには管理者権限が必要になります。
ここで注意したいのが、ログオンスクリプトは「ログオンしたユーザー本人の権限」で動作するという仕様です。
そのため、一般ユーザー(通常は Domain Users)でログオンする運用では、ログオンスクリプトからインストーラーを起動しても権限が足りず、インストールに失敗してしまいます。
そこで活用したいのが、SYSTEM 権限(LocalSystem。ローカル Administrators と同等以上のシステム特権で動作するサービス用アカウント)で動作するスタートアップスクリプトです。 スタートアップスクリプトは「ユーザーがログオンする前」の「PC 起動直後」に実行されるため、管理者権限を必要とする処理にうってつけです。
まず、Soliton KeyManager のインストーラー(SolitonKeyManagerV{version}.exe)をファイルサーバーの共有フォルダーに保存します。 今回の検証環境では \\fs01.example.com\setup\ に保存することにします。

【ワンポイントアドバイス】共有フォルダーのアクセス権について
スタートアップスクリプトは SYSTEM 権限で動作しますが、ネットワーク越しに共有へアクセスするときの身元は「コンピューターアカウント(<コンピューター名>$)」 になります。 このコンピューターアカウントは Authenticated Users に含まれ、さらに Authenticated Users は既定で各サーバーのローカル Users グループに所属しています。 そのため、NTFS アクセス権で Users に「読み取りと実行」が許可されている既定の状態であれば、追加設定なしでアクセス可能です。

スタートアップスクリプトは

@echo off "\\fs01.example.com\setup\SolitonKeyManagerV{version}.exe" -s

この1行で十分動作するのですが、動作検証用途として動作ログの出力と、カスタマイズ例としてSoliton KeyManagerのインストール判定を行えるバッチファイルをサンプルとして作成しました。

@echo off setlocal enabledelayedexpansion REM ========================================================= REM スクリプト名 : SKM-Install.bat REM 処理内容 : Soliton KeyManagerのサイレントインストール REM ========================================================= REM --------------------------------------------------------- REM 1. 変数の設定 (ご利用の環境に合わせて変更してください) REM --------------------------------------------------------- set "INSTALL_DIR=\\fs01.example.com\setup" set "INSTALL_EXE=SolitonKeyManagerV{version}.exe" set "LOG_DIR=C:\temp" set "LOGFILE=%LOG_DIR%\install_log.txt" REM インストール状態の判定フラグ (0: 未インストール, 1: インストール済) set "FOUND=0" REM --------------------------------------------------------- REM 2. 事前準備 (ログ出力先の確保) REM --------------------------------------------------------- if not exist "%LOG_DIR%" ( mkdir "%LOG_DIR%" ) echo [%DATE% %TIME%] --- 処理開始 --- >> "%LOGFILE%" REM --------------------------------------------------------- REM 3. インストール済みかどうかのチェック REM --------------------------------------------------------- echo [%DATE% %TIME%] インストール状況を確認しています... >> "%LOGFILE%" REM 64bit側の確認 reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s /reg:64 /v DisplayName 2>nul | find "Soliton KeyManager" >> "%LOGFILE%" 2>&1 if !errorlevel! equ 0 set FOUND=1 REM 32bit側の確認 reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s /reg:32 /v DisplayName 2>nul | find "Soliton KeyManager" >> "%LOGFILE%" 2>&1 if !errorlevel! equ 0 set FOUND=1 REM --------------------------------------------------------- REM 4. チェック結果による分岐 REM --------------------------------------------------------- if !FOUND! equ 1 ( echo [%DATE% %TIME%] すでにインストールされています。処理を終了します。 >> "%LOGFILE%" goto :EXIT ) echo [%DATE% %TIME%] 未インストールを確認しました。インストールを開始します。 >> "%LOGFILE%" REM --------------------------------------------------------- REM 5. インストールの実行 REM --------------------------------------------------------- set "TARGET_PATH=%INSTALL_DIR%\%INSTALL_EXE%" REM 万が一インストーラーが見つからない場合のエラー処理 if not exist "%TARGET_PATH%" ( echo [%DATE% %TIME%] エラー: インストーラーが見つかりません。 >> "%LOGFILE%" echo パス: "%TARGET_PATH%" >> "%LOGFILE%" goto :EXIT ) REM サイレントインストール実行 (start /wait で完了まで待機します) start /wait "" "%TARGET_PATH%" -s set "RESULT=!errorlevel!" echo [%DATE% %TIME%] インストールコマンドが終了しました。(戻り値: !RESULT!) >> "%LOGFILE%" :EXIT echo [%DATE% %TIME%] --- 処理終了 --- >> "%LOGFILE%" endlocal exit /b 0

この内容のバッチファイルを文字コードをANSIにしてファイル名をSKM-Install.batとして保存します。

【ワンポイントアドバイス】ANSI で保存する理由
スタートアップスクリプトから実行される cmd.exe は既定で ANSI(日本語環境では CP932)として処理するため、日本語パスや日本語メッセージが記載されたバッチファイルをUTF-8 で保存してしまうと、バッチ実行時に文字化けする可能性があります。

作成したバッチファイルをスタートアップスクリプトとして登録します。PCがOU=業務PC,dc=example,dc=comに所属しているものとして、下記のように操作します。

  1. ドメインコントローラー上で「グループ ポリシーの管理」を開き、[グループポリシーの管理]-[フォレスト]-[ドメイン]-[FQDNドメイン名]-[業務PC]を右クリックして「このドメインに GPO を作成し、このコンテナーにリンクする」をクリックします。
  2. 名前に「SKMインストール」を入力して「OK」をクリックします。
  3. 「SKMインストール」を右クリックして「編集」をクリックします。
  4. グループポリシー管理エディターにて[コンピューターの構成]-[ポリシー]-[Windowsの設定]-[スクリプト(スタートアップ/シャットダウン)]を開き、「スタートアップ」を右クリックして「プロパティ」をクリックします。
  5. スタートアップのプロパティにて「ファイルの表示」をクリックします。
  6. フォルダが開きますので、作成したバッチファイル(SKM-Install.bat)を保存します。
  7. フォルダを閉じて再度「スタートアップのプロパティ」にて「追加」をクリックします。
  8. 「参照」をクリックします。
  9. 「SKM-Install.bat」を選択して「開く」をクリックします。
  10. 「OK」をクリックします。
  11. 「OK」をクリックしてスタートアップのプロパティを閉じます。

このあとPCを再起動(※)するとスタートアップスクリプトが実行されて、Soliton KeyManagerがインストールされます。

※高速スタートアップが有効な環境では、「シャットダウン」からの起動時にスタートアップスクリプトが実行されない場合があります。設定を反映させるため、必ず「再起動」を選択してください。

【ステップ2】Soliton OneGateへの端末識別情報を登録

Soliton OneGateへ端末識別情報を登録します。この端末識別情報を登録することで「デバイス予約」ができます。
端末識別に使える情報としては次の通りです。

  • IMEI(4G/5Gモデムがあるスマートフォン)
  • UDID(iOS/iPadOSデバイスでSafariを利用して証明書を取得する場合に利用可能)
  • APID
  • APID(前方一致)
  • MACアドレス

Windows端末であればAPID/APID(前方一致)/MACアドレスとなります。
資産管理ツールでMACアドレスを収集して管理しているようであればその値を端末識別情報として利用することは可能です。ただしMACアドレスは書き換えが可能であり、かつUSBタイプのNICであれば他端末への付け替えが可能であるため、端末識別としての信頼性は低めとなっております。
そのため収集の手間は掛かりますが、Soliton KeyManagerが生成する端末識別情報APIDを利用することをおすすめします。APIDの収集方法はSoliton OneGate利用ガイドの付録「識別情報の収集方法」をご参照ください。

なお、Windows版Soliton KeyManagerでは「コンピューター用」と「ユーザー用(Windowsログオンアカウントごと)」の2種類のAPIDが生成されますが、これらは値の前半20文字が共通する仕様となっています。 そのため、Soliton OneGateに前半20文字を「APID(前方一致)」として登録しておけば、コンピューター証明書はもちろんのこと、Windowsログオンユーザーが変わっても、許可端末として扱われます。

APID(前方一致)の登録の仕方は次の通りです。

  1. Soliton KeyManagerにてAPIDを確認します。
  2. Soliton OneGateの管理画面にて[証明書管理]>[デバイス予約情報設定一覧]を開き「登録」をクリックします。
  3. 表示名にPC名、デバイス予約情報種別に「APID(前方一致)」、デバイス予約情報にSoliton KeyManagerで表示されているAPIDのうち前半20文字、発行プロファイル設定をdefaultもしくは作成済みのプロファイルを選択して「保存」をクリックします。
  4. デバイス予約設定一覧に登録したAPIDが表示されます。

【ステップ3】Soliton OneGateを招待モードからデバイス予約モードに切り替える

Soliton OneGateの証明書配布のモードを招待モードからデバイス予約モードに切り替えます。デバイス予約モードに切り替えた場合、招待コードでの証明書の新規取得はできなくなります。
今回は「Windows版 Soliton KeyManager(Windows SKM)」のみをデバイス予約モードに切り替えます。

  1. Soliton OneGateの管理画面にて[証明書管理]>[発行プロファイル]を開き、「共通設定」をクリックします。
  2. 証明書発行モード設定にてWindows版 Soliton KeyManager(Windows SKM)の「デバイス予約モード」ラジオボタンを選択して「保存」をクリックします。

【ステップ4】 ゼロタッチ証明書配布

Soliton KeyManagerのインストール、OneGateへAPIDなどのデバイス予約設定の登録、OneGateをデバイス予約モードへの切り替えが完了したら、いよいよゼロタッチによる証明書配布を実施します。
Soliton KeyManagerをコマンドラインで操作してSoliton OneGateから証明書を取得しますが、Soliton OneGateでの証明書発行にはSoliton OneGateの利用者による認証が必要になります。
Soliton OneGate利用者ごとにID/パスワードを埋め込むには、(1) 全利用者のパスワード把握、(2) 利用者ごとのバッチ作成、(3) 利用者ごとのGPO割当てが必要となり、現実的ではありません。
そこでSoliton OneGateに証明書取得専用の利用者を作成して、その利用者を使って証明書を取得するようにします。
今回はcert-distributor01ユーザーを作成しました。

Soliton OneGateのコマンドラインオプション

Soliton KeyManagerを使ってコマンドラインでOneGateから証明書を取得するには、Soliton KeyManagerをオプションを付けて実行します。

オプション説明
/clコマンドラインで実行するオプションです。必須項目となります。
/h <OneGateのテナントFQDN>接続するOneGateのFQDN(例: xxx.ids.soliton-ods.jp)を指定してください。こちらも必須項目です。
/u <OneGate利用者のログイン名>証明書を申請する利用者のログイン名を指定します。
指定しない場合には入力ダイアログが表示されます。
/wl申請ユーザーとしてWindowsにログオンしているユーザーID を取得して使用することができます。
/p <OneGate利用者のパスワード>申請者のパスワードを平文で指定します。
指定しない場合には入力ダイアログが表示されます。
/pe <OneGate利用者のパスワード>このオプションを指定した場合、入力した文字列を暗号化した値が出力されます。
この暗号化された値は/pオプションで利用することは不可であり、/epオプションで利用します。
/ep <暗号化した値>/peオプションで暗号化したパスワードの値を利用します。
スクリプトなどにパスワードの値を平文で記載したくない場合にご利用ください。
/scコンピューター証明書ストアに証明書を格納します。
/suユーザー証明書ストアに証明書を格納します。
/scもしくは/suを指定しない場合には、ユーザー証明書ストアに証明書が格納されます。
/cn/scを指定している場合、証明書のCNがコンピューター名になります。
/suを指定している場合には、証明書のCNがWindowsログオンユーザーIDになります。
※/cnを指定しない場合には、証明書のCNは/uで指定したOneGateの利用者名になります。
/newCLIで証明書取得する場合、毎回新規での証明書取得として実行します。
/new を指定しない場合に有効期限が通知日数の範囲であれば「更新」します。通知日数の範囲外の場合は更新が不要として更新はスキップされます。

この他にもコマンドラインオプションはありますので、詳細はSoliton KeyManager V2.2 説明書をご確認ください。

利用者のパスワードを暗号化する

Soliton KeyManagerをCLIでバッチ実行するときに/pでパスワードを平文で記載してしまうと、バッチファイルの中身を見られたときにOneGateの利用者のパスワードがわかってしまいます。そこで先ほど登録したOneGateの利用者のパスワードを/peオプションで暗号化して、バッチファイルには/ep <暗号化したパスワード>を記載することでOneGateのパスワードを保護します。
/peオプションでパスワードを暗号化するには、コマンドラインでSoliton KeyManagerがあるフォルダ(C:\Program Files (x86)\Soliton KeyManager)にてKeyManager.exe /pe <パスワード>を実行します。

C:\Users\tsoliton>cd "C:\Program Files (x86)\Soliton KeyManager" C:\Program Files (x86)\Soliton KeyManager>KeyManager.exe /pe <パスワード> C:\Program Files (x86)\Soliton KeyManager>a1234567bcd8e9f000

このa1234567bcd8e9f000が暗号化されたパスワード値となり、/epオプションで指定することができます。

ゼロタッチでコンピューター証明書ストアにクライアント証明書を発行する

コンピューター証明書ストアの証明書は、主に次の用途で利用されます。

  • Wi-Fi接続におけるコンピューター認証 Active Directory 環境では、ユーザーがWindowsにログオンする前に、端末へコンピューター向けのポリシーを適用する必要があるケースがあります。このような環境において、本機能が利用されます。
    また、リモートワーク環境で社内PCへRDP接続を行う場合にも活用されることがあります。

  • 一部の VPN クライアントソフトウェアにおける認証
    キャッシュされた資格情報によるWindowsログオンを回避するため、Windowsログオン前にVPN接続を確立し、ドメインコントローラーと通信可能な状態にする仕組みとして、本機能が利用される場合があります。

このように、ログオン前の認証やネットワーク接続に関わるシナリオでは、コンピューター証明書ストアに対して適切に証明書を配布・格納しておくことが重要となります。

証明書をコンピューター証明書ストアへ配布する際、証明書の Common Name(CN)には OneGate の利用者名を指定することも可能ですが、運用管理の観点からは、端末を識別しやすいようにコンピューター名を指定することが推奨されます。
この場合、Soliton KeyManagerのコマンド実行はKeyManager.exe /cl /h <OneGateのテナントFQDN> /u <OneGateの利用名> /ep <暗号化したパスワード値> /sc /cnとなります。

KeyManager.exe /cl /h <OneGateのテナントFQDN> /u cert-distributor01 /ep a1234567bcd8e9f000 /sc /cn

こちらもこれだけで動作するのですが、動作検証目的でログファイル出力と、実運用を見据えてSoliton KeyManagerインストール済みかどうかの判定を含めたバッチファイルにしてみました。

@echo off setlocal enabledelayedexpansion REM ========================================================= REM スクリプト名 : ComputerCert.bat REM 処理内容 : Soliton KeyManagerを使用したコンピューター証明書の取得 REM ========================================================= REM --------------------------------------------------------- REM 1. 変数の設定 (環境に合わせて変更してください) REM --------------------------------------------------------- set "TENANT_FQDN=xxx.ids.soliton-ods.jp" set "REQ_USER=cert-distributor01" set "ENC_PASS=a1234567bcd8e9f000" set "SKM_DIR=C:\Program Files (x86)\Soliton KeyManager" set "SKM_EXE=KeyManager.exe" set "LOG_DIR=C:\temp" set "LOGFILE=%LOG_DIR%\Computer-enroll_log.txt" REM --------------------------------------------------------- REM 2. 事前準備 (ログ出力先の確保) REM --------------------------------------------------------- if not exist "%LOG_DIR%" ( mkdir "%LOG_DIR%" ) echo [%DATE% %TIME%] --- コンピューター証明書取得 処理開始 --- >> "%LOGFILE%" REM --------------------------------------------------------- REM 3. インストール判定 (実行ファイルの存在確認) REM --------------------------------------------------------- echo [%DATE% %TIME%] Soliton KeyManagerのインストール状態を確認しています... >> "%LOGFILE%" if not exist "%SKM_DIR%\%SKM_EXE%" ( echo [%DATE% %TIME%] エラー: Soliton KeyManagerがインストールされていません。 >> "%LOGFILE%" echo [%DATE% %TIME%] パス: "%SKM_DIR%\%SKM_EXE%" が見つかりません。 >> "%LOGFILE%" goto :EXIT ) REM --------------------------------------------------------- REM 4. カレントディレクトリの移動とコマンド実行 REM --------------------------------------------------------- echo [%DATE% %TIME%] カレントディレクトリを移動します: %SKM_DIR% >> "%LOGFILE%" cd /d "%SKM_DIR%" echo [%DATE% %TIME%] 証明書の取得(エンロール)を開始します... >> "%LOGFILE%" REM 終了を待機するため start /wait を使用 start "" /wait "%SKM_EXE%" /cl /h "%TENANT_FQDN%" /u "%REQ_USER%" /ep "%ENC_PASS%" /sc /cn REM 戻り値を出力 set "RESULT=!errorlevel!" echo [%DATE% %TIME%] コマンドが終了しました。(戻り値: !RESULT!) >> "%LOGFILE%" :EXIT echo [%DATE% %TIME%] --- 処理終了 --- >> "%LOGFILE%" endlocal exit /b 0

【ワンポイントアドバイス】Soliton KeyManagerのリターンコード
Soliton KeyManagerを実行した際のリターンコードについてはSoliton KeyManager V2.2 説明書をご確認ください。

上記の内容のバッチファイルを、文字コードを ANSIにして、ファイル名 ComputerCert.bat で保存します。
コンピューター証明書ストア(LocalMachine\My など)への証明書インストールには管理者権限が必要です。
スタートアップスクリプトは **SYSTEM 権限(管理者権限を含む最上位のローカル権限)**で動作するため、この用途にちょうど適しています。 そこで、作成した ComputerCert.bat をスタートアップスクリプトとして登録します。Soliton KeyManager と同様に、対象 PC が OU=業務PC,DC=example,DC=com に所属しているものとして、以下の手順で操作します。

  1. ドメインコントローラー上で「グループ ポリシーの管理」を開き、[グループポリシーの管理]-[フォレスト]-[ドメイン]-[FQDNドメイン名]-[業務PC]を右クリックして「このドメインに GPO を作成し、このコンテナーにリンクする」をクリックします。
  2. 名前に「コンピューター証明書配布」を入力して「OK」をクリックします。
  3. 「コンピューター証明書配布」を右クリックして「編集」をクリックします。
  4. グループポリシー管理エディターにて[コンピューターの構成]-[ポリシー]-[Windowsの設定]-[スクリプト(スタートアップ/シャットダウン)]を開き、「スタートアップ」を右クリックして「プロパティ」をクリックします。
  5. スタートアップのプロパティにて「ファイルの表示」をクリックします。
  6. フォルダが開きますので、作成したバッチファイル(ComputerCert.bat)を保存します。
  7. フォルダを閉じて再度「スタートアップのプロパティ」にて「追加」をクリックします。
  8. 「参照」をクリックします。
  9. 「ComputerCert.bat」を選択して「開く」をクリックします。
  10. 「OK」をクリックします。
  11. 「OK」をクリックしてスタートアップのプロパティを閉じます。

この状態でPCを再起動するとスタートアップスクリプトが実行されて、Soliton KeyManagerがSYSTEM権限でCLI実行されてコンピューター証明書が取得できます。

証明書が取得されたあとにSoliton KeyManagerの「証明書一覧」を開くと、コンピューター証明書が取得できており、詳細を開いて見るとCNが申請ユーザーであるcert-distributor01ではなくて、コンピューター名になっていることが確認できます。

【ワンポイントアドバイス】スタートアップスクリプトの毎起動時の実行について
PCが起動するたびにスタートアップスクリプトが実行されますが、Soliton KeyManagerのCLIのオプションとして/newを指定していないため、有効期限の通知日数の範囲外の場合は更新が不要で証明書取得されず、範囲内の場合には証明書の更新が行われます。

【参考】スタートアップスクリプトでプロキシ経由でインターネットアクセス

Soliton OneGateはインターネット上のクラウドサービスですので、証明書の取得にはインターネット経由になります。多くの企業では社内からのインターネットアクセスにはプロキシサーバーを経由すると思います。
Soliton KeyManagerはプロキシ経由でOneGateへアクセスすることが可能であり、Windowsの[設定]→[ネットワークとインターネット]→[プロキシ]で設定したプロキシ設定に従います。
Windowsのプロキシ設定はWindowsログオンユーザー別に設定されるものであり、ユーザーログオン(ユーザープロファイルの読み込み)後に参照可能になるため、SYSTEMで動作するスタートアップスクリプトの実行時点ではプロキシ設定を反映させることができません。
スタートアップスクリプト実行時点でプロキシを反映させるには、グループポリシーの管理用テンプレートで『コンピューター別にプロキシを設定する(ユーザー別ではなく)』を有効にし、レジストリ等でプロキシ設定を配布する工夫が必要になります。 もしくはSoliton KeyManagerカスタム設定ツールを使ってプロキシサーバーを指定して、Soliton KeyManagerを新規でインストールしていただければ、指定したプロキシサーバーを経由してOneGateへアクセスします。

ユーザー証明書ストアにクライアント証明書を発行する

先ほど作成したバッチファイルの/sc/suに変えて、グループポリシーでログオンスクリプトとして配布すれば、ゼロタッチでユーザー証明書として証明書を配布することが可能です。
コマンドとしては次の通りとなります。

KeyManager.exe /cl /h <OneGateのテナントFQDN> /u cert-distributor01 /ep a1234567bcd8e9f000 /su /cn

これをバッチにすると次の通りです。

@echo off setlocal enabledelayedexpansion REM ========================================================= REM スクリプト名 : UserCert.bat REM 処理内容 : Soliton KeyManagerを使用したユーザー証明書の取得 REM ========================================================= REM --------------------------------------------------------- REM 1. 変数の設定 (環境に合わせて変更してください) REM --------------------------------------------------------- set "TENANT_FQDN=xxx.ids.soliton-ods.jp" set "REQ_USER=cert-distributor01" set "ENC_PASS=a1234567bcd8e9f000" set "SKM_DIR=C:\Program Files (x86)\Soliton KeyManager" set "SKM_EXE=KeyManager.exe" set "LOG_DIR=%TEMP%" set "LOGFILE=%LOG_DIR%\User-enroll_log.txt" REM --------------------------------------------------------- REM 2. 事前準備 (ログ出力先の確保) REM --------------------------------------------------------- if not exist "%LOG_DIR%" ( mkdir "%LOG_DIR%" ) echo [%DATE% %TIME%] --- ユーザー証明書取得 処理開始 --- >> "%LOGFILE%" REM --------------------------------------------------------- REM 3. インストール判定 (実行ファイルの存在確認) REM --------------------------------------------------------- echo [%DATE% %TIME%] Soliton KeyManagerのインストール状態を確認しています... >> "%LOGFILE%" if not exist "%SKM_DIR%\%SKM_EXE%" ( echo [%DATE% %TIME%] エラー: Soliton KeyManagerがインストールされていません。 >> "%LOGFILE%" echo [%DATE% %TIME%] パス: "%SKM_DIR%\%SKM_EXE%" が見つかりません。 >> "%LOGFILE%" goto :EXIT ) REM --------------------------------------------------------- REM 4. カレントディレクトリの移動とコマンド実行 REM --------------------------------------------------------- echo [%DATE% %TIME%] カレントディレクトリを移動します: %SKM_DIR% >> "%LOGFILE%" cd /d "%SKM_DIR%" echo [%DATE% %TIME%] 証明書の取得(エンロール)を開始します... >> "%LOGFILE%" REM 終了を待機するため start /wait を使用 start "" /wait "%SKM_EXE%" /cl /h "%TENANT_FQDN%" /u "%REQ_USER%" /ep "%ENC_PASS%" /su /cn REM 戻り値を出力 set "RESULT=!errorlevel!" echo [%DATE% %TIME%] コマンドが終了しました。(戻り値: !RESULT!) >> "%LOGFILE%" :EXIT echo [%DATE% %TIME%] --- 処理終了 --- >> "%LOGFILE%" endlocal exit /b 0

この内容のバッチファイルを文字コードをANSIにしてファイル名をUserCert.batとして保存します。

作成したバッチファイルをログオンスクリプトとして登録します。ユーザーがOU=社員,dc=example,dc=comに所属しているものとして、下記のように操作します。

  1. ドメインコントローラー上で「グループ ポリシーの管理」を開き、[グループポリシーの管理]-[フォレスト]-[ドメイン]-[FQDNドメイン名]-[社員]を右クリックして「このドメインに GPO を作成し、このコンテナーにリンクする」をクリックします。
  2. 名前に「ユーザー証明書配布」を入力して「OK」をクリックします。
  3. 「ユーザー証明書配布」を右クリックして「編集」をクリックします。
  4. グループポリシー管理エディターにて[ユーザーの構成]-[ポリシー]-[Windowsの設定]-[スクリプト(ログオン/ログオフ)]を開き、「ログオン」を右クリックして「プロパティ」をクリックします。
  5. ログオンのプロパティにて「ファイルの表示」をクリックします。
  6. フォルダが開きますので、作成したバッチファイル(UserCert.bat)を保存します。
  7. フォルダを閉じて再度「ログオンのプロパティ」にて「追加」をクリックします。
  8. 「参照」をクリックします。
  9. 「UserCert.bat」を選択して「開く」をクリックします。
  10. 「OK」をクリックします。
  11. 「OK」をクリックしてログオンのプロパティを閉じます。

Windowsログオンすると、ログオンしたユーザーの権限でログオンスクリプトが実行され、OneGateから証明書が発行されてユーザーストアにインストールされた旨のメッセージが表示されます。

【ワンポイントアドバイス】OneGateのCA証明書が信頼されたルート証明機関に入っていない場合
ユーザー証明書ストアへのクライアント証明書を格納する段階で、OneGateのCA証明書がコンピューター証明書ストア、もしくはユーザー証明書ストアの「信頼されたルート証明機関」にインポートされていない場合には、Windowsの仕様によりCA証明書を信頼されたルート証明機関にインポートする旨の「セキュリティ警告」が表示されますので、「はい」をクリックしてCA証明書をインポートしてください。
「はい」をクリックするまでバッチの処理が止まります。また「いいえ」をクリックした場合には、クライアント証明書の取得に失敗します。
なお、利用者に一切操作させないようにする場合には、事前にGPO等でOneGateのCA証明書を配布してください。

Soliton KeyManagerの「証明書一覧」を開くと、ユーザー証明書が取得できており、詳細を開いて見るとCNが申請ユーザーであるcert-distributor01ではなくて、ログオンユーザー名になっていることが確認できます。

このような形でSoliton KeyManagerをCLIで実行して、コンピューターもしくはユーザー証明書ストアに証明書をインストールすることができます。

【応用編】ゼロタッチにせずにユーザーにID、パスワードを入力させる

Soliton KeyManagerをCLIで実行する際、あえてユーザーID(/u または /wl)やパスワード(/p)を指定しないことで、ユーザー自身にIDとパスワードの入力を求めることも可能です。

KeyManager.exe /cl /h <OneGateテナントFQDN> /su

【動作環境に関するご注意】
本機能は、Soliton KeyManagerv2.2.2、および今後リリースされるv2.2.4以降のバージョンでご利用いただけます。

「ユーザーに手動で入力させるのは負担になるのでは?」と思われるかもしれません。しかし、以下の理由から実際のハードルはそれほど高くないケースが多いです。

  • 日頃の運用との親和性
    OneGateを使ってクラウドサービスへSAML SSOを行う際など、ユーザーは普段からOneGateの認証画面に慣れていることが多いため、大きな混乱なく対応できるケースが多いです。
  • AD連携環境ならさらにスムーズ
    Active DirectoryのユーザーをOneGateへ同期している環境であれば、普段の「Windowsログオンアカウントとパスワード」を入力するだけで済むため、よりユーザーに実行してもらいやすくなります。

ただし、この運用には1つ大きな注意点があります。 Soliton KeyManagerの仕様上、IDやパスワードを引数で指定しない場合、コマンドが実行されるたびに毎回入力画面がポップアップしてしまいます。 証明書の更新時期以外であっても、ログオンスクリプト等でバッチが実行されるたびに入力を求められてしまうのは、ユーザーにとって大きな負担になりかねません。
そこでバッチファイル内で事前にユーザー証明書ストアをチェックし、「証明書が存在しない場合」や「有効期限が迫って更新時期を迎えた場合」にのみ Soliton KeyManagerを実行するなどの工夫が必要になります。

これらを踏まえた処理を行う場合には、動作が複雑になるためPowerShellを使って実現したほうが簡単であるため、PowerShellを呼び出すバッチファイルと、実際に証明書発行元、有効期限のチェックを行ってSoliton KeyManagerを実行するPowerShellスクリプトを作成しました。

@echo off REM ========================================================= REM PowerShellログオンスクリプト ラッパー REM - 実行ポリシーをこのプロセス内のみBypassでPS1を起動 REM - ユーザー権限で実行されます (HKCUの証明書ストアにアクセスするため) REM ========================================================= powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -File "%~dp0UserCertCheck.ps1" exit /b %errorlevel%

この内容のバッチファイルを文字コードをANSIにしてファイル名をWrapper-PS.batとして保存します。

<# .SYNOPSIS UserCertCheck.ps1 - Soliton KeyManagerを使用したユーザー証明書の取得・更新スクリプト .DESCRIPTION ユーザー証明書ストア(Cert:\CurrentUser\My)を確認し、 指定CAの証明書が存在しない、または有効期限が閾値以下の場合に Soliton KeyManagerを起動して証明書を取得・更新します。 #> Write-Host "[$(Get-Date -Format 'yyyy/MM/dd HH:mm:ss')] [PS1] === PowerShellスクリプト開始 ===" Write-Host "[$(Get-Date -Format 'yyyy/MM/dd HH:mm:ss')] [PS1] PSVersion=$($PSVersionTable.PSVersion)" Write-Host "[$(Get-Date -Format 'yyyy/MM/dd HH:mm:ss')] [PS1] User=$env:USERNAME / Host=$env:COMPUTERNAME" Write-Host "[$(Get-Date -Format 'yyyy/MM/dd HH:mm:ss')] [PS1] ScriptPath=$PSCommandPath" $TranscriptFile = Join-Path $env:TEMP ('UserCertCheck_transcript_{0:yyyyMMdd}.log' -f (Get-Date)) try { Start-Transcript -Path $TranscriptFile -Append -IncludeInvocationHeader | Out-Null Write-Host "[$(Get-Date -Format 'yyyy/MM/dd HH:mm:ss')] [PS1] トランスクリプト記録開始: $TranscriptFile" } catch { Write-Host "[$(Get-Date -Format 'yyyy/MM/dd HH:mm:ss')] [PS1] [WARN] Start-Transcriptに失敗: $($_.Exception.Message)" } Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' # --------------------------------------------------------- # 1. 変数の設定 # --------------------------------------------------------- $CaName = 'xxxxxx' $RenewDays = 5 $TenantFqdn = 'xxxx.ids.soliton-ods.jp' $SkmDir = 'C:\Program Files (x86)\Soliton KeyManager' $SkmExe = 'KeyManager.exe' $SkmFullPath = Join-Path $SkmDir $SkmExe $LogDir = $env:TEMP $LogFile = Join-Path $LogDir 'User-enroll_log.txt' # --------------------------------------------------------- # 2. ログ出力ヘルパー # --------------------------------------------------------- function Write-Log { param( [Parameter(Mandatory)] [string]$Message, [ValidateSet('INFO','WARN','ERROR')] [string]$Level = 'INFO' ) $timestamp = Get-Date -Format 'yyyy/MM/dd HH:mm:ss' $line = "[$timestamp] [$Level] $Message" try { Add-Content -LiteralPath $LogFile -Value $line -Encoding UTF8 } catch {} Write-Host $line } # --------------------------------------------------------- # 3. 処理開始 # --------------------------------------------------------- Write-Log '--- ユーザー証明書チェック・取得処理 開始 ---' Write-Log "実行ユーザー: $env:USERNAME / コンピューター: $env:COMPUTERNAME" # --------------------------------------------------------- # 4. 証明書のチェック # --------------------------------------------------------- Write-Log "発行元CA「$CaName」の証明書をチェックします..." $needEnroll = $false try { $cert = Get-ChildItem -Path 'Cert:\CurrentUser\My' -ErrorAction Stop | Where-Object { $_.Issuer -like "*$CaName*" } | Sort-Object NotAfter -Descending | Select-Object -First 1 if ($null -eq $cert) { Write-Log "発行元CA「$CaName」の証明書が存在しません。" -Level WARN $needEnroll = $true } else { $notAfter = $cert.NotAfter $daysLeft = [int][Math]::Floor( ($notAfter - (Get-Date)).TotalDays ) Write-Log ("対象証明書: Subject={0}" -f $cert.Subject) Write-Log (" Thumbprint={0}" -f $cert.Thumbprint) Write-Log ("有効期限: {0:yyyy/MM/dd HH:mm:ss} / 残り: {1} 日" -f $notAfter, $daysLeft) Write-Log ("判定: 残り {0} 日 vs しきい値 {1} 日" -f $daysLeft, $RenewDays) if ($daysLeft -le $RenewDays) { Write-Log "更新時期(残り $RenewDays 日以下)です。証明書取得処理を実行します。" $needEnroll = $true } else { Write-Log "スキップ: 有効期限まで $RenewDays 日以上ある有効な証明書が存在します。" } } } catch { Write-Log "警告: 証明書ストアの取得に失敗しました。詳細: $($_.Exception.Message)" -Level WARN Write-Log "安全のため、証明書取得処理を実行します。" -Level WARN $needEnroll = $true } # --------------------------------------------------------- # 5. エンロール処理 # --------------------------------------------------------- if ($needEnroll) { Write-Log 'Soliton KeyManagerのインストール状態を確認しています...' if (-not (Test-Path -LiteralPath $SkmFullPath)) { Write-Log "エラー: Soliton KeyManagerがインストールされていません。" -Level ERROR Write-Log "パス: ""$SkmFullPath"" が見つかりません。" -Level ERROR } else { Write-Log "証明書の取得(エンロール)を開始します..." Write-Log "実行コマンド: ""$SkmFullPath"" /cl /h ""$TenantFqdn""" try { $proc = Start-Process -FilePath $SkmFullPath ` -ArgumentList @('/cl', '/h', $TenantFqdn) ` -WorkingDirectory $SkmDir ` -Wait -PassThru $exitCode = $proc.ExitCode Write-Log "コマンドが終了しました。(戻り値: $exitCode)" } catch { Write-Log "エラー: KeyManagerの起動に失敗しました。詳細: $($_.Exception.Message)" -Level ERROR } } } # --------------------------------------------------------- # 6. 終了処理 # --------------------------------------------------------- Write-Log '--- 処理終了 ---' try { Stop-Transcript | Out-Null } catch {} Write-Host "[$(Get-Date -Format 'yyyy/MM/dd HH:mm:ss')] [PS1] === PowerShellスクリプト終了 ===" exit 0

この内容のPowerShellスクリプトを文字コードをUTF-8(BOM付き)にしてファイル名をUserCertCheck.ps1として保存します。

グループポリシーに設定します。

  1. ドメインコントローラー上で「グループ ポリシーの管理」を開き、[グループポリシーの管理]-[フォレスト]-[ドメイン]-[FQDNドメイン名]-[社員]を右クリックして「このドメインに GPO を作成し、このコンテナーにリンクする」をクリックします。
  2. 名前に「ユーザー証明書配布」を入力して「OK」をクリックします。
  3. 「ユーザー証明書配布」を右クリックして「編集」をクリックします。
  4. グループポリシー管理エディターにて[ユーザーの構成]-[ポリシー]-[Windowsの設定]-[スクリプト(ログオン/ログオフ)]を開き、「ログオン」を右クリックして「プロパティ」をクリックします。
  5. ログオンのプロパティにて「ファイルの表示」をクリックします。
  6. フォルダが開きますので、作成したバッチファイル(Wrapper-PS.batとUserCertCheck.ps1)を保存します。
  7. フォルダを閉じて再度「ログオンのプロパティ」にて「追加」をクリックします。
  8. 「参照」をクリックします。
  9. 「Wrapper-PS.bat」を選択して「開く」をクリックします。
  10. 「OK」をクリックします。
  11. 「OK」をクリックしてログオンのプロパティを閉じます。

なお、ここで紹介したスクリプトはWindows 11 25H2の日本語ロケールの動作を確認しておりますが、ご利用の環境もしくは今後のWindowsの仕様変更によっては動作しない可能性がありますので、ご利用の際には充分な検証を行い、ご利用環境に併せて充分なチューニングを行ってください。

Soliton KeyManagerをCLIで実行してSoliton OneGateから証明書を取得する場合の注意点

ここからはSoliton KeyManagerを使ってCLIで証明書を取得する場合の注意点を説明します。
こちらに記載した内容は、今後のバージョンアップ等で改善される可能性もございますので、Soliton OneGate並びにSoliton KeyManagerの最新情報にご注目いただければと思います。

Soliton OneGate利用者ポータルからのセルフ失効ができない

Soliton OneGateでは発行済の証明書を利用者ポータルから利用者自身で失効させることが可能ですが、証明書を発行しているのはあくまで証明書取得専用の利用者となります。そのため他の利用者が代理で証明書を発行している環境では、自分自身で証明書を失効させることは出来ませんので、証明書を失効する必要がある場合にはSoliton OneGateの管理者が失効してください。

証明書の格納先とSoliton KeyManagerでの証明書格納先指定の不一致

ユーザーの証明書とコンピューターの証明書で別々のサブジェクト(OUの値など)に変えたいなどで、ユーザーのAPIDとコンピューターのAPIDをそれぞれ別々の発行プロファイルに紐づけて登録する際、プロファイルの「証明書の格納先」(ユーザー、コンピューター)とSoliton KeyManagerのオプション(/su、/sc)の不一致が発生すると証明書が発行できません。

CLI(ゼロタッチ)で取得した証明書の更新

証明書取得専用利用者を使ってCLIにて証明書を取得したあと、端末の利用者がSoliton KeyManagerを起動してGUIにてその証明書を更新しようとしても、証明書取得専用利用者のパスワードを把握していないため更新することが出来ません。 仮にパスワードを把握している場合には更新が出来てしまいますが、その場合には 証明書のCNが証明書取得専用利用者になってしまいます。
基本的にはCLIで取得した証明書はCLIで更新する前提で運用していただくか、有効期限をなるべく長くして証明書の更新を行なわない運用をご検討ください。 なおSoliton KeyManagerカスタム設定ツールを使って期限切れ間近の通知をオフにして、Soliton KeyManagerを新規にインストールしていただければ、端末利用者向けに証明書有効期限間近のポップアップを表示させないことができますので、不用意にGUIでの更新を行わないようにすることが可能になります。

Soliton KeyManagerは多重起動出来ない仕様

Soliton KeyManagerは多重起動が出来ません。
そのため今回紹介したスタートアップスクリプトとログオンスクリプトの両方を使って証明書取得を行う方法の場合、スタートアップスクリプトにてSoliton KeyManagerが実行されている最中にWindowsログオンしてしまうとログオンスクリプトでもSoliton KeyManagerが起動しようとしてエラーになることがあります。 その場合には、ログオンスクリプトを工夫してでSoliton KeyManagerの実行を遅らせるなどの処置を行ってください。

【補足】Soliton OneGateデバイス予約モードとNetAttest EPS-apの申請モードとの違い

NetAttest EPSと組み合わせてご利用いただけるNetAttest EPS-apにも申請モードがあり似たようなことが実現できますが、Soliton OneGateのデバイス予約と細かい点で異なります。
主な違いは次の通りです。

モードの選択

  • Soliton OneGate
    Soliton OneGateの場合、OSの種類ごとに招待モードとデバイス予約モードのどちらかを選択することができます。
    例えばWindows端末は「デバイス予約」で許可した端末のみに配布し、BYODのスマートフォンは「招待コード」で配布する、といった運用が可能です。
    また運用を開始後でもモード変更を行うことができます。モードの変更方法はSoliton OneGate管理者ガイドをご確認ください。
  • EPS-ap
    筐体ごとにどちらかのモードを設定していただく必要があります。そのためOS種別ごとにモードを切り替えるなどは不可となります。
    また、このモードを変更するには一旦EPS-apを初期化する必要があります。そのため運用開始後にモード変更することはおすすめできません。

APID同時申請

EPS-apでは事前にAPIDを登録せずに、Soliton KeyManagerからの証明書申請時にAPIDを登録する「APID同時申請」が可能ですが、Soliton OneGateでは「デバイス予約」であるため事前にAPIDの登録(デバイスの予約)は必須となります。

自動承認

EPS-apでは端末からの証明書申請を自動で承認するか、手動で承認するかを選択できますが、Soliton OneGateでは申請されたら自動で承認されます。

申請端末のシリアル番号チェック機能

EPS-ap v2.6.13より申請端末の識別としてAPID、IMEI、UDID、MACアドレスの他、Windows版Soliton KeyManager v2.2.2以上をご利用の場合に限り端末のシリアル番号(※)も利用できるようになりましたが、2026年4月現在のSoliton OneGateではAPID、IMEI、UDID、MACアドレスのみとなっており、端末のシリアル番号を利用することは出来ません。

※端末のシリアル番号は、PowerShellで以下のコマンドレットを実行して表示される値です。

(Get-CimInstance -ClassName Win32_BIOS).SerialNumber

最後に

今回はActive Directoryのスタートアップ/ログオンスクリプトを活用した証明書配布バッチを作成しました。この内容は資産管理ツールを用いた配布に応用することも可能ですので、皆様のご参考になれば幸いです。

【ご紹介したバッチ、スクリプトについて】
掲載しているバッチ、スクリプトはあくまでサンプルです。手元の検証環境にて動作確認を行っておりますが、すべての環境における動作を保証するものではありません。ご使用の際は、ご自身の環境にて十分に検証を行った上でご利用ください。

記事を書いた人

ソリトンシステムズ ソリューションアーキテクト 小林

ソリトンシステムズで20年以上エンジニア職についておりベテランの域に着きつつありますが、IT業界は目まぐるしく進歩しており、まだまだ修行中です。 うなぎ職人の「串打ち3年、裂き8年、焼き一生」と同じで、IT技術もまた奥深く、一生探求し続ける必要を感じています。 本サイトでは弊社製品の話題を中心にしていますが、弊社製品に限らず色々なことにトライして、皆様の業務、もしくは個人的な興味にちょっとしたヒントをお届けできればと思います。よろしくお願いいたします。