概要
本記事では、Modの署名や信頼に関する作業をできるだけ簡略化するために、独自CAでコードサイニング証明書を発行して使用する手順について説明します。
- 独自CA用として専用サーバーを用意する必要はありません。作成したルート証明書やコードサイニング証明書を Spotfire Server にインポートすることで動作します。
- OSの証明書ストアへの証明書の追加作業は不要です。
背景
Mod開発時にはModファイル(*.mod)を署名する必要があり、Mod利用時にはその署名が検証されます。
Modを利用するには該当Modを予め信頼しておく必要があります。
Modファイルの署名にはSpotfire環境によって発行されたコードサイニング証明書、またはパブリック認証局によって発行されたコードサイニング証明書のいずれかを利用できますが、それぞれには以下のデメリットがあります。
- Spotfire環境によって発行されたコードサイニング証明書
- Mod利用時に証明書がSpotfire Server環境に対して検証されます。
- Modをほかの環境に移行して利用する場合には証明書の失効検証を行うために元のSpotfire Serverを立てたままにする必要があります。また、失効検証機能をオフにすることができません。
- 同一Spotfireアカウントに複数のコードサイニング証明書が発行される可能性があります。
- 署名や再署名の実施に手間がかかります。(Mod開発サーバーに接続してソースコードからModファイルを作成しながら署名する方法しかありません。)
- パブリック認証局によって発行されたコードサイニング証明書
- Mod利用時に証明書がAnalyst端末やWeb Player/Automation ServicesサーバーのOSの証明書ストアに対して検証されます。また、該当証明書をグループに信頼させる際にはSpotfire Server環境に対して検証されます。
- コードサイニング証明書を発行したルート証明書や中間証明書をSpotfire Server環境やAnalyst端末やWeb Player/Automation ServicesサーバーのOSの証明書ストアにインストールする必要がある場合があります。
- Mod利用時に証明書の失効検証を行うためにAnalyst端末やWeb Player/Automation Servicesサーバーから失効検証サーバーにインタネット接続ができる必要がある場合があります。
- 証明書の発行に費用が掛かることがあります。
上記問題を改善するため、独自CAで発行した証明書を利用してModの署名や信頼を行います。
概要
- 独自CA証明書やMod署名用のコードサイニング証明書の2種類を発行します。
- 中間証明書は発行しません。
- 独自CA証明書のみをSpotfire Serverにインポートする必要があります。
- 独自CA証明書やコードサイニング証明書をSpotfire Server/Analyst/Web Player/Automation Servicesなどの端末のOSの証明書ストアにインストールする必要はありません。
- コードサイニング証明書の失効検証を行いません。
- コードサイニング証明書をブロックすることで「失効」と同等なことを実現できます。
- コードサイニング証明書が常にSpotfire Serverに対して検証されます。
- 証明書検証時にインタネット接続を行いません。
- Spotfire Server設定を変更してSpotfire Serverにインポートされたルート証明書でも署名検証に使用されるようにします。(デフォルト設定では動作端末のOSの証明書ストアに存在しているルート証明書のみが使用されます)
動作環境
- Spotfire Server 11.4.X
- Spotfire Analyst/Web Player/Automation Services 11.4.2 HF-013以降
- HF-013より前のバージョンの場合は本記事記載の手順では正しく動作しません。
HF-013(リンク)には以下の不具合修正が含まれており、失効検証情報のないコードサイニング証明書でModを署名した場合にも正しく動作するようになりました。(HF-013より前の場合は失効検証情報のないコードサイニング証明書で署名したModの署名が無効とみなされてしまいます。)
TS_11.4.2.42 LTS HF-013: Hotfix for TIBCO Spotfire® 11.4.x (Released: April 04, 2022)
TS-68717 - A mod signed with a certificate, where there is no method to check the revocation status of the certificate because revocation is not supported by the certificate authority, is considered to have an invalid signature.
実施手順
下記の手順ではJavaに同梱されている keytool.exe を使用しますので、Spotfire Server端末内での実施を推奨します。Java 17の場合に利用できるコマンドについては「補足②」の部分をご参照ください。
- Spotfire Server 11.4の場合(Java 11):
C:\tibco\tss\11.4.X\jdk\bin\keytool.exe
- Spotfire Server 12.0の場合(Java 17):
C:\tibco\tss\12.0.X\jdk\bin\keytool.exe
- Spotfire Server 14.0の場合(Java 17):
C:\spotfire\spotfireserver\14.0.X\jdk\bin\keytool.exe
1.独自CA証明書やコードサイニング証明書の発行
以下のコマンドを実行して、独自CAの証明書とMod署名用のコードサイニング証明書を発行します。
説明:
- Windowsのコマンドプロンプト内で実行してください。
- Java 11に同梱されているkeytool.exeを使用しますので、該当ファイルの格納先フォルダのフルパスを環境変数PATHに追加しておいてください。
- 発行された証明書には失効検証情報が指定されません。
- 必要に応じて以下の引数を変更してください。
- -dname "CN=ktroot,OU=Sign my company's mods":発行先の識別名
- -storepass rootpass / -storepass certpass:証明書(キーストア)のパスワード
- -validity 3650:証明書の有効期限日数
- -alias myroot / -alias signer1:コードサイニング証明書の別名
- -keystore xxx.pfx / -file xxx.cer:作成した証明書のファイル名
rem CA証明書を発行
keytool.exe -storepass rootpass -genkeypair -keysize 2048 -keyalg RSA -storetype pkcs12 -keystore myroot.pfx -validity 3650 -alias myroot -ext bc:c -dname "CN=ktroot,OU=Sign my company's mods"
keytool.exe -storepass rootpass -exportcert -keystore myroot.pfx -alias myroot -rfc -file myroot.pem
keytool.exe -storepass rootpass -exportcert -keystore myroot.pfx -alias myroot -file myroot.cer
rem コードサイニング証明書(例:signer1)を発行
keytool.exe -storepass certpass -genkeypair -keysize 2048 -keyalg RSA -storetype pkcs12 -keystore signer1.pfx -validity 3650 -alias signer1 -dname "CN=signer1,OU=Sign my company's mods"
keytool.exe -storepass certpass -certreq -keystore signer1.pfx -alias signer1 -file signer1.csr
keytool.exe -storepass rootpass -keystore myroot.pfx -gencert -validity 3650 -alias myroot -ext ku:c=dig,keyE -ext eku:c=codeSigning -rfc -infile signer1.csr -outfile signer1.pem
copy /y myroot.pem+signer1.pem signer1_myroot.pem
keytool.exe -storepass certpass -importcert -keystore signer1.pfx -alias signer1 -file signer1_myroot.pem -noprompt
keytool.exe -storepass certpass -exportcert -keystore signer1.pfx -alias signer1 -file signer1.cer
上記コマンド実行後に以下のファイル(例)が生成されます。
- myroot.pfx:独自CA証明書(公開鍵と秘密鍵を含む、パスワードで保護されています)
- myroot.cer:独自CA証明書(公開鍵のみ)
- signer1.pfx:コードサイニング証明書(公開鍵と秘密鍵を含む、パスワードで保護されています)
- signer1.cer:コードサイニング証明書(公開鍵のみ)
- *.csr / *.pem:これらのファイルが不要となるため削除してよいです。
「*.pfx」ファイルには秘密鍵が含まれているため、パスワードと共に大事に保管してください。
本例で発行した独自CAの証明書の情報は以下になります。
※テスト環境のOSの証明書ストアにインストールした場合の表示内容となります。実際利用時にはOSの証明書ストアにインストールする必要はありません。
本例で発行したコードサイニング証明書の情報が以下になります。
2.Modの署名
Package Builder(コンソール版、参照資料)を利用して、ソースコードからModファイルを作成して署名する、または既存のModファイルを再署名することができます。
Package BuilderはSpotfire Developer SDKに含まれています。
・TIB_sfire_dev_11.4.0_win.zip
・ソースコードからModファイルを作成して署名するバッチの例:
- 以下の変数は実際に合わせて指定してください。
- manifest:Modのマニフェストファイル(mod-manifest.json)のフルパス
- ※フルパスや相対パスの指定が必要です。ファイル名のみを指定した場合はModsを正しく作成できません(作成されたModsは正しく動作しません)。
- mod:作成したModsファイルの出力先のフルパス
- sdk:Spotfire Developer SDKの格納先
- cert:コードサイニング証明書のフルパス
- certpwd:コードサイニング証明書のキーストアのパスワード
- manifest:Modのマニフェストファイル(mod-manifest.json)のフルパス
@echo off
setlocal
set manifest="D:\dev\mods\spotfire-mods\examples\js-dev-barchart\src\mod-manifest.json"
set mod="D:\tmp\Bar Chart.mod"
set sdk=D:\dev\TIB_sfire_dev_11.4.0_win
set pb="%sdk%\SDK\Package Builder\Spotfire.Dxp.PackageBuilder-Console.exe"
set cert="D:\tmp\ktcert1\signer1.pfx"
set certpwd=certpass
%pb% /targettype:mod /mod-manifest:%manifest% /target:%mod% /cert:%cert% /password:%certpwd%
上記バッチを実行して署名、生成したModファイルの例は以下に示します。
・既存のModファイルを再署名するバッチの例:
※既存Modファイルが上書きされます。
- 以下の変数は実際に合わせて指定してください。
- mod:既存のModファイルのフルパス
- sdk:Spotfire Developer SDKの格納先
- cert:コードサイニング証明書のフルパス
- certpwd:コードサイニング証明書のキーストアのパスワード
@echo off
setlocal
set mod="D:\dev\mods\Bar Chart_signed.mod"
set sdk=D:\dev\TIB_sfire_dev_11.4.0_win
set pb="%sdk%\SDK\Package Builder\Spotfire.Dxp.PackageBuilder-Console.exe"
set cert="D:\tmp\ktcert1\signer1.pfx"
set certpwd=certpass
%pb% /targettype:mod /target:%mod% /sign /cert:%cert% /password:%certpwd%
3.Spotfire Server設定変更
下記の設定変更を実施することにより、Modの署名に使ったコードサイニング証明書の検証が先にSpotfire Serverに対して行うようになります(厳密に言いますと、Spotfire Serverにインポートされたサードパーティーのルート証明書がAnalyst/Web Player/Automation Services端末に配布され、署名の検証に使用されるようになります)。Spotfire Serverに対して検証できた場合には動作端末のOSの証明書ストアに対して検証を行いません。
本記事の場合は独自CAの証明書をSpotfire Serverにインポートしますので独自CAで発行したコードサイニング証明書は必ずSpotfire Serverにて有効と検証されます。
OS管理者権限でコマンドプロンプトを起動して、フォルダ「C:\tibco\tss\11.4.X\tomcat\spotfire-bin」に遷移して以下の3つのコマンドを順次実行してください。
※コマンド実行時にConfiguration Toolのパスワードが求められることがあります。
1.既存設定をエクスポートします。
config.bat export-config --force
※既存ファイルを上書きするには引数「--force」を指定します。
2.設定変更を実施します。
config.bat set-config-prop -n security.code-trust.distribute-third-party-root-certs -v true
3.変更した設定をインポートします。
config.bat import-config -c "enable distribute third party root certificates"
4.コマンド実行後にSpotfire Serverサービスを再起動して設定変更を反映させてください。
4.独自CA証明書のインポート
以下のコマンドを実行して、独自CAの証明書をSpotfire Serverにインポートします。インポートされた独自CAの証明書がリポジトリデータベースに格納されます。これで、該当独自CAによって発行されたすべてのコードサイニング証明書がSpotfire環境内では有効とみなされるようになります。
※セキュリティ考慮上、独自CAの証明書をOSの証明書ストアにはインストールしないでください。
config.bat import-code-signing-certificate -p "D:\tmp\ktcert1\myroot.cer"
コマンド実行後に、Spotfire Serverサービス、Node Managerサービスを再起動して設定変更を反映させてください。
Analystクライアントアプリケーションが開かれている場合も一旦閉じて再度ログインし直して上記の独自CAの証明書の情報を反映させる必要があります。
5.コードサイニング証明書の信頼(推奨)
ほかのユーザーが該当Modを利用できるように、コードサイニング証明書を予めEveryoneグループに信頼させることを推奨します。その後には対象コードサイニング証明書によって署名されたすべてのModファイルがすべてのSpotfireアカウントによって信頼され、Modが利用できるようになります。
・Spotfire管理者アカウントでブラウザからSpotfire Serverにログインして、「Users & Groups」画面を開いて、「Everyone」グループを開いて、「Trusted signers」タブにて、「Add certificate」ボタンを押して「From local file」を選択してください。
・コードサイニング証明書(本例:signer1.cer)を開いてください。
・上記を実施した後にはコードサイニング証明書がEveryoneグループ(すべてのSpotfireアカウント)に信頼されるようになります。
Analystでの動作確認
Analystを起動してログインし、データを取り込んでからModファイル(本例:Bar Chart.mod)をAnalystへドラッグアンドドロップして取り込んでビジュアライゼーションを作成します。
Modファイル取り込み時には署名が有効かつすでに信頼済みのためエラーや信頼の提示などが表示されません。
「ファイル⇒信頼を管理」を開いて、Modの署名を確認してください。
該当Modの署名が「Spotfireサーバー」によって検証されていることを確認できます。
分析ファイルの作成が完了した後にはライブラリに保存してください。
Web Playerでの動作確認
ブラウザからConsumerユーザーでログインして上記の分析を開いてください。
分析を開く際にはModの署名が有効かつすでに信頼済みのためエラーや信頼の提示などが表示されません。
「ファイル⇒信頼を管理」を開いて、Modの署名を確認してください。
該当Modの署名が「Spotfireサーバー」によって検証されていることを確認できます。
コードサイニング証明書のブロック
コードサイニング証明書をブロックすることで該当コードサイニング証明書によって署名されたすべてのModファイルが利用できなくなり、対象コードサイニング証明書が信頼されなくなります。
説明:
- 「config.bat revoke-code-signing-certificate 」コマンドではSpotfire環境によって発行されたコードサイニング証明書のみを失効させることができますので、本記事で発行した証明書(およびパブリック認証局によって発行されたコードサイニング証明書)は対応していません。
- 独自CAの証明書をブロックすることができません。
- コードサイニング証明書をブロックした後には、取り消す(アンブロック)ことができません。
以下のコマンドを実行して、コードサイニング証明書をブロックできます。
※ブロック処理がすぐにAnalystやWeb Playerなどに反映されます。
config.bat block-code-trust --path "D:\tmp\ktcert1\signer1.cer"
ブロックされたコードサイニング証明書で署名したModファイルをAnalystへ取り込もうとする際に下記のようなメッセージが表示され、信頼を実施できません。
※署名自体が有効と検証されます。
ブロックされたコードサイニング証明書で署名したModを利用している分析ファイルを閲覧しようとする際には信頼されていないことなり、ビジュアライゼーションが正しく表示されません。
署名者(コードサイニング証明書)がブロックされています。
補足
補足①、自己署名証明書として発行したコードサイニング証明書を署名者として信頼することはできません。
該当署名者(コードサイニング証明書)を信頼しようとする際に以下のエラーが「信頼を管理」画面に表示されます。
信頼アクションをサーバー上で永続化できませんでした。問題が解決しない場合は、各 mod を個別に信頼してください。
また、以下のエラーが server.log に出力されます。
User tried to add a root certificate as external
必ず独自CA証明書やコードサイニング証明書を分けて発行して使ってください。
補足②、Java 17以降の場合、以下のコマンドを利用して独自CA証明書やコードサイニング証明書を発行できます。
Java 17にて新しい引数「-signer」(参考資料)が追加されたことによって、証明書の発行が少し楽になりました。
1.独自CA証明書を発行:
keytool.exe -storepass rootpass -keystore ktroot.pfx -genkeypair -keyalg RSA -keysize 2048 -validity 3650 -alias ktroot -ext "bc:c=ca:true,pathlen:0" -ext ku:c=keyCertSign -dname "CN=ktroot,OU=internal use only"
keytool.exe -storepass rootpass -keystore ktroot.pfx -exportcert -alias ktroot -rfc -file ktroot.crt
2.コードサイニング証明書を発行:
keytool.exe -storepass rootpass -keystore ktroot.pfx -genkeypair -keyalg RSA -keysize 2048 -validity 3650 -signer ktroot -alias signer1 -ext ku:c=dig -ext eku:c=codeSigning -dname "CN=signer1,OU=internal use only"
keytool.exe -storepass rootpass -keystore ktroot.pfx -exportcert -alias signer1 -rfc -file signer1.crt
keytool.exe -importkeystore -srckeystore ktroot.pfx -srcstorepass rootpass -destkeystore signer1.pfx -deststorepass certpass -srcalias signer1 -noprompt
補足③、セキュリティリスクを考慮し本記事記載の手順で発行した独自CA証明書やコードサイニング証明書をOSの証明書ストアにインストールしないでください。
また、本記事記載の手順で発行した独自CA証明書をAnalystやWeb PlayerサーバーOSの証明書ストア(信頼されたルート証明機関)にインストールした場合、該当独自CA証明書から発行したコードサイニング証明書は信頼されたものと見なされますが、対象コードサイニング証明書で署名したModsをAnalystやWeb Playerで利用する際には失効検証情報(CRLやOCSPなど)が不足しているため「無効な署名」と判断されます(Spotfire Serverではなく、Windows OSの証明書ストアにて検証を行う場合)。
上記の場合、AnalystやWeb PlayerサービスのDEBUGログに以下の情報が出力されます。
2024-12-31T15:17:56,102+09:00 2024-12-31 06:17:56,102 admin [Main Thread] INFO Spotfire.Dxp.Framework.SignatureTrust.CertificateVerifier [(null)] - The certificate with subject CN=signer1, OU=internal use only and serial 3AC8B8717B9087C1 could not be verified.
The following verification errors occurred:
RevocationStatusUnknown:失効の関数は証明書の失効を確認できませんでした。
2024-12-31T15:17:56,102+09:00 2024-12-31 06:17:56,102 admin [Main Thread] DEBUG Spotfire.Dxp.Framework.SignatureTrust.CertificateVerificationService [(null)] - Verification error result for CN=signer1, OU=internal use only was 証明書が取り消されているかを判別することができません。証明書サーバーがオフラインになっているか、使用できない可能性があります。