Spotfire Server 12.3において、製品にバンドルされているMS SQL Server接続用のJDBCドライバがバージョンアップされ、暗号化関連のパラメータのデフォルト値が変更されました(参考資料)。
これによりMS SQL ServerへのJDBC接続が正常に動作しなくなる可能性がありますので、本記事ではSpotfireへの影響や対処方法などについて説明します。
動作確認環境
本資料はSpotfire Server 14.0.1 LTSにて動作確認して作成しています。
本記事の内容はバージョン12.3以降に対し有効です。
- Spotfire Server 14.0.1 LTS
- Microsoft SQL Server 2022 Express
SpotfireにバンドルされているMS SQL Server接続用のJDBCドライバ
Spotfire ServerにバンドルされているMS SQL Server接続用のJDBCドライバは以下のSpotfire Serverインストール先フォルダーに格納されています。
C:\spotfire\spotfireserver\14.0.1\tomcat\webapps\spotfire\WEB-INF\lib\mssql-jdbc.jar
Spotfire Server 12.3~14.0.1においては上記のドライバのバージョンが「11.2.3」です。
MS SQL Server接続用JDBCドライバにおける仕様変更
MS SQL Server接続用のJDBCドライバにおいては、下記2つのパラメータのデフォルト値が以下のように変更されました。
JDBC接続URLに該当パラメータが指定されていない場合には以下のデフォルト値が使用されます。
パラメータ |
説明 |
encrypt=true |
TLS暗号化はデフォルトで有効になっている ・false:暗号化なしでの接続を行う。ただしMS SQL Server側に強制的に暗号化を構成している場合はこの設定が無視されて必ず暗号化が有効化される ・true:MS SQL Serverへの接続に暗号化が有効化される |
trustServerCertificate=false |
信頼関係を検証するために証明書チェーンを順に調べる処理をバイパスしない(MS SQL Serverのサーバ証明書を必ず信頼する) この引数はMS SQL Serverへの接続に暗号化が有効化されている(接続URLにencrypt=falseが未指定、またはMS SQL Server側に強制的に暗号化を構成している)場合にのみ使用されます。 ・false:クライアント側ではMS SQL Serverのサーバ証明書のチェーンを検証し、正しく検証できない場合は接続ができない ・true:クライアント側ではMS SQL Serverのサーバ証明書のチェーンを検証せずに(該当サーバ証明書を信頼する)、接続が必ず成功する(暗号化以外の異常を除く) |
参考資料:
Spotfireへの影響
Spotfireでは以下の製品機能利用時にはJDBC経由でMS SQL Serverへ接続するため、上記の仕様変更による影響を受けます。
特にSpotfire 12.3より前のバージョンから12.3以降へアップグレードした場合には、MS SQL Serverへの接続が失敗し、正常に動作しなくなる可能性があります。
- リポジトリDBにMS SQL Serverが使用されている場合
- ユーザーアクションログDBにMS SQL Serverが使用されている場合
- デフォルトの結合用データベースにMS SQL Serverが使用されている場合
- インフォメーションリンク経由でMS SQL Serverへ接続する場合
上記のいずれかの機能にてJDBC接続文字列を使ってMS SQL Serverへ接続する際には影響を受けます。
リポジトリDB / アクションログDBの新規作成スクリプト「create_databases.bat / create_actionlog_db.bat」を実行する際には影響を受けません。
例えば下記のJDBC接続URLを設定したデータソースを参照しているインフォメーションリンクを実行する際に暗号化関連でSpotfire ServerからMS SQL Serverへの接続が失敗した場合には以下のエラーが発生します。
jdbc:sqlserver://srv3:1433;DatabaseName=dms;
エラーメッセージ:
詳細なエラーメッセージ(ドライバーが SSL (Secure Sockets Layer) 暗号化による SQL Server への安全な接続を確立できませんでした。):
エラー メッセージ:インフォメーションリンクを開けませんでした。
ImportException at Spotfire.Dxp.Data:
Failed to open information link "デジカメ売上". (HRESULT: 80131500)
Stack Trace:
場所 Spotfire.Dxp.Data.DataSource.ConnectWithoutPrompting(IServiceProvider serviceProvider, DataSourcePromptMode promptMode, Boolean updateInternalState, DataLoadSettings loadSettings)
場所 Spotfire.Dxp.Data.DataSource.Connect(IServiceProvider serviceProvider, DataSourcePromptMode promptMode, Boolean updateInternalState, DataLoadSettings loadSettings)
場所 Spotfire.Dxp.Forms.Data.Import.DataSourceFactoryService.OpenDataSource(InformationLinkDataSource dataSource, DocumentOpenSettings documentOpenSettings, IServiceProvider serviceProvider)
場所 Spotfire.Dxp.Framework.ApplicationModel.Progress.<>c__DisplayClass22_0.<Start>b__0()
場所 Spotfire.Dxp.Framework.ApplicationModel.MonitorableProgress.Start[T](Func`1 action)
場所 Spotfire.Dxp.Forms.Application.FormsProgressService.ProgressThread.<DoOperationLoop>b__11_0()
InformationModelException at Spotfire.Dxp.Data:
Failed to initialize connection pool: ドライバーが SSL (Secure Sockets Layer) 暗号化による SQL Server への安全な接続を確立できませんでした。エラー: "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target"。 ClientConnectionId:4144fc45-d404-435f-b391-7c642ae83174 (HRESULT: 80131500)
Stack Trace:
場所 Spotfire.Dxp.Data.InformationModel.InternalInformationModelManager.GetJobSpecForId(Guid informationLinkId)
場所 Spotfire.Dxp.Data.Import.InformationLinkDataSource.GetJobSpec(IServiceProvider serviceProvider)
場所 Spotfire.Dxp.Data.Import.InformationLinkDataSource.ConnectCore(IServiceProvider serviceProvider, DataSourcePromptMode promptMode, DataLoadSettings loadSettings)
場所 Spotfire.Dxp.Data.DataSource.ConnectWithoutPrompting(IServiceProvider serviceProvider, DataSourcePromptMode promptMode, Boolean updateInternalState, DataLoadSettings loadSettings)
InformationModelServiceException at Spotfire.Dxp.Services:
Failed to initialize connection pool: ドライバーが SSL (Secure Sockets Layer) 暗号化による SQL Server への安全な接続を確立できませんでした。エラー: "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target"。 ClientConnectionId:4144fc45-d404-435f-b391-7c642ae83174 (HRESULT: 80131509)
Stack Trace:
場所 Spotfire.Dxp.Services.WcfSoapService`2.InvokeService[T](Func`1 serviceMethod, String customMethodNameForLogging)
場所 Spotfire.Dxp.Data.InformationModel.InternalInformationModelManager.GetJobSpecForId(Guid informationLinkId)
MS SQL Serverの暗号化設定
MS SQL Serverのサーバ端末上で「SQL Server 2022 構成マネージャー」を起動して、「SQL Serverネットワークの構成」の下にある「SQLEXPRESSのプロトコル」を右クリックして「プロパティ」を実行し、暗号化関連の設定画面を開けます。
MS SQL Serverに強制的に暗号化を構成する場合は以下のように設定します。
- 強制的に暗号化:
- いいえ(デフォルト):強制的に暗号化を構成していない、クライアント側の設定に従って暗号化有無を決める
- はい:強制的に暗号化を構成している、必ず暗号化が有効になっている
暗号化用のサーバ証明書は以下のようにMS SQL Serverに設定します。
- 証明書:
- 選択なし(デフォルト):この場合にはMS SQL Serverが内部で自己署名証明書を発行して使用します。
- サーバ証明書が選択されている、※利用できる証明書は一定な要件に満たしている必要があります(参考資料)。
対処方法
MS SQL Server側にて強制的に暗号化の構成有無やサーバ証明書の設定によって接続可否や対処方法が異なります。
MS SQL Serverのサーバ設定 |
クライアント(Spotfire)設定 |
接続動作 | |||
暗号化設定 | サーバ証明書 | JDBC接続URL | 暗号化有無 | 接続可否 | 対処方法 |
強制的に暗号化を構成していない |
選択無し ※MS SQL Serverが内部で発行した自己署名証明書を使用 |
・encrypt未指定 ・encrypt=true |
あり | × | |
・encrypt=false |
なし | 〇 | |||
パブリック認証局によって発行された証明書 |
・encrypt未指定 ・encrypt=true |
あり | 〇 |
|
|
・encrypt=false | なし | 〇 |
|
||
独自で発行したサーバ証明書 |
・encrypt未指定 ・encrypt=true |
あり | × | ||
・encrypt=false | なし | 〇 | |||
強制的に暗号化を構成している |
選択無し ※MS SQL Serverが内部で発行した自己署名証明書を使用 |
・encrypt未指定 ・encrypt=true |
あり |
× |
対処方法② |
・encrypt=false ※falseの指定が無視されます |
あり |
× |
対処方法② | ||
パブリック認証局によって発行された証明書 |
・encrypt未指定 ・encrypt=true |
あり |
〇 |
||
・encrypt=false ※falseの指定が無視されます |
あり |
〇 |
|||
独自で発行したサーバ証明書 |
・encrypt未指定 ・encrypt=true |
あり |
× |
||
・encrypt=false ※falseの指定が無視されます |
あり |
× |
対処方法① encrypt=false
を指定
MS SQL Server側に強制的に暗号化を構成していない場合には、接続URLの後ろに明示的に「encrypt=false」を指定することで、従来通りに暗号化なしでの接続を行えます。
例:
jdbc:sqlserver://srv3:1433;DatabaseName=dms;encrypt=false;
対処方法② trustServerCertificate=true
を指定
接続URLの後ろに明示的に「trustServerCertificate=true」を指定することでMS SQL Serverのサーバ証明書を検証しなくなりますので、暗号化が有効な状態でもMS SQL Serverへ接続できるようになります。ただし、このオプションを利用する場合にはセキュリティリスクがあるため、注意が必要です。
例:
jdbc:sqlserver://srv3:1433;DatabaseName=dms;trustServerCertificate=true;
対処方法③ MS SQL Serverにパブリック認証局に発行されたサーバ証明書をインストール
暗号化が必要な場合にはMS SQL Serverにパブリック認証局によって発行されたサーバ証明書をインストールして使用することを推奨します。該当サーバ証明書を検証するのに必要な情報(パブリック認証局のルート証明書など)がすでにSpotfire Serverに同梱のJava内に存在しているため、証明書のチェーンを正しく検証でき、暗号化通信が行えいます。
Spotfire Serverに同梱のJava内に存在しているルート証明書の一覧はSpotfire Server端末内で以下のコマンドを実行して取得できます。
C:\spotfire\spotfireserver\14.0.1\jdk\bin\keytool.exe -list -cacerts -storepass changeit -v
以下の引数を指定します。
-
-list
:キーストアの中身を一覧表示するコマンド。 -
-cacerts
:cacertsキーストアを一覧表示することを指定します。 -
-storepass changeit
:cacertsキーストアのパスワード、デフォルトではchangeitとなります。 -
-v
:詳細情報を出力するように指定します。
補足、引数「-cacerts」を指定する場合には以下のJava同梱のcacertsキーストアファイルが操作対象になります。
C:\spotfire\spotfireserver\14.0.1\jdk\lib\security\cacerts
対処方法④ MS SQL Server側のサーバ証明書をSpotfire Serverにインポート
MS SQL Serverにサーバ証明書(独自に発行したもの、もしくはパブリック認証局に発行されたもの)をインストールして使用する場合、Spotfire Server端末内で以下のコマンドを実行して該当証明書をSpotfire Serverに同梱のJavaのcacertsキーストアにインポートすれば、Spotfireは暗号化オプションが有効(encrypt=true)でもMS SQL Serverへ接続できるようになります。
※インポート実施後にSpotfire Serverサービスを再起動する必要があります。
C:\spotfire\spotfireserver\14.0.1\jdk\bin\keytool.exe -importcert -cacerts -storepass changeit -file <path-to-certificate.cer>
以下の引数を指定します。
-
-importcert
:証明書をインストールするコマンド。 -
-cacerts
:cacertsキーストアにインポートすることを指定します。 -
-storepass changeit
:cacertsキーストアのパスワード、デフォルトではchangeitとなります。 - -file <path-to-certificate.cer>:証明書ファイル(*.cert/*.crt)のフルパス。
補足として、MS SQL Serverにサーバ証明書を指定していない場合にはMS SQL Serverの内部で発行した自己署名証明書を使用することになりますが、こちらの証明書はエクスポートできないため上記は実施できません。
対処の例
対処方法② trustServerCertificate=true
を指定を各Spotfire Server機能で実施する場合の例は以下に説明します。
リポジトリDB
リポジトリDBにMS SQL Serverが使用されている場合、Upgrade Toolを利用してリポジトリDBをアップグレードする際には、MS SQL Serverへの接続URLの後ろに「trustServerCertificate=true」を追加する例は以下です。
Configuration Toolを利用して、リポジトリDBへの接続情報にtrustServerCertificate=true
を追加する例は以下です。追加後はにbootstrapを保存してください。
ユーザーアクションログDB
ユーザーアクションログDBにMS SQL Serverが使用されている場合、ユーザーアクションログDBへの接続URLの後ろにtrustServerCertificate=true
を追加する例は以下です。
デフォルトの結合用データベース
デフォルトの結合用データベースにMS SQL Serverが使用されている場合、接続URLの後ろにtrustServerCertificate=true
を追加する例は以下です。
インフォメーションリンク
インフォメーションリンク経由でMS SQL Serverへ接続する場合、インフォメーションデザイナーにて、MS SQL Serverへ接続するデータソースを編集して、接続URLの後ろに「trustServerCertificate=true」を追加する例は以下です。
接続URL:
jdbc:sqlserver://srv3:1433;DatabaseName=dms;trustServerCertificate=true;
インフォメーションリンクでの利用時の補足
インフォメーションリンクの場合、上記のようにインフォメーションデザイナーにて個別にデータソースを編集して接続URLを変更できますが、以下の2つの方法も利用できます。
方法①、MS SQL Server接続用データソーステンプレートを変更
Configuration Toolを起動して、MS SQL Serverへ接続用データソーステンプレート(本例:MS SQL Server)を編集して、以下のようにtrustServerCertificate=true
を追加できます。
※追加後に「Save configuration」ボタンを押して「Database」へ保存し、Spotfire Serverサービスを再起動して設定変更を反映させてください。
<connection-property>
<key>trustServerCertificate</key>
<value>true</value>
</connection-property>
注意事項としては、上記の設定変更を実施した後に新規作成や編集したデータソースには該当設定が反映されますが、すでに存在しているデータソースの場合は反映されませんので、対象データソースを一度編集して保存しなおす必要があります。
方法②、対象データソースを抽出して一括変更
以下の手順に従って、ライブラリ内に存在している、MS SQL Serverへ接続するデータソースを検証して、接続できない可能性のあるものを抽出して一括変更することができます。
1.Spotfire Server端末内で、OSの管理者権限でコマンドプロンプトを起動し、Spotfire Serverのインストール先フォルダへ移動します。
C:\spotfire\spotfireserver\14.0.1\tomcat\spotfire\bin
2.以下のコマンドを実行して、ライブラリにあるMS SQL Serverへ接続しているすべてのデータソースを検証し、接続ができない可能性のあるものを抽出します。
※コマンド実行時にはConfiguration Toolのパスワードが必要です。
config.bat sqlserver-datasource-update-script
実行例:
以下の引数を指定できます。
-
-t <Configuration Toolのパスワード>
:Configuration Toolのパスワードを指定、未指定の場合は入力が求められます。 -
-p true|false
:DB接続テストの実施有無を指定します。Trueの場合はDB接続テストを行います。未指定の場合はFalseとなります。
-
- 引数
-p true
が未指定の場合には接続URLにencrypt=true
やtrustServerCertificate
(true/falseを問わず)のいずれも指定されていないデータソースが抽出され、接続URLの後ろにtrustServerCertificate=true;
がつけられてファイルに出力されます。 - 引数
-p true
を指定した場合にはDB接続テストが行われて、暗号化が原因で接続が失敗したデータソースが抽出され、接続URLの後ろにtrustServerCertificate=true;
がつけられてファイルに出力されます。DB接続テストが成功した、または暗号化以外の原因で失敗したデータソースはファイルには出力されません。
- 引数
3.コマンド実行後には該当するデータソースが抽出された場合には以下のファイルが現在のフォルダに出力されます。抽出されなかった場合にはファイルが出力されません。
C:\spotfire\spotfireserver\14.0.1\tomcat\spotfire-bin\SQLServerDatasourceUpgradeScript.txt
ファイルには、抽出されたデータソースのJDBC接続URLを修正(後ろに「trustServerCertificate=true;」を追記)するためのコマンド(update-datasource)が記載されています。
例(下記例では引数「-p true」を指定しておりません):
# Updating datasource /mssql/srv3a 補足、元の接続URL:jdbc:sqlserver://srv3:1433;DatabaseName=dms;
update-datasource -t ${toolpassword} -u ${libraryAdmin} -i 864d2d9c-d066-40e9-9221-da35139f76eb --validate=${validate} --database-url="jdbc:sqlserver://srv3:1433;DatabaseName=dms;trustServerCertificate=true;"
# Updating datasource /mssql/srv3b_encrypt_false 補足:元の接続URL:jdbc:sqlserver://srv3:1433;DatabaseName=dms;encrypt=false;
update-datasource -t ${toolpassword} -u ${libraryAdmin} -i 0fe58fe6-b4de-4cb9-b8a0-57041f153447 --validate=${validate} --database-url="jdbc:sqlserver://srv3:1433;DatabaseName=dms;encrypt=false;trustServerCertificate=true;"
また、以下のようなデータソースは抽出されません(encrypt=true
やtrustServerCertificate
(true/falseを問わず)のいずれかが指定されているため)。
/mssql/srv3c_enctypt_true:jdbc:sqlserver://srv3:1433;DatabaseName=dms;encrypt=true;
/mssql/srv3d_trust_false:jdbc:sqlserver://srv3:1433;DatabaseName=dms;trustServerCertificate=false;
/mssql/srv3e_trust_true:jdbc:sqlserver://srv3:1433;DatabaseName=dms;trustServerCertificate=true;
引数-p true
を指定した場合、DB接続テストが暗号化以外の原因で失敗した場合にはそのエラーが以下のファイルに出力されます。
C:\spotfire\spotfireserver\14.0.1\tomcat\spotfire-bin\SQLServerDatasourceUpgradeProbing.txt
4.以下のコマンド(run)を実行して、上記のファイルに記載されているコマンドを呼び出して対象データソースを一括更新することができます。ファイルを実行する前に必要に応じて編集しても構いません。
config.bat run --fail-on-undefined-variable ^
-Vtoolpassword=<config tool password> -VlibraryAdmin=<library admin user> ^
-Vvalidate=true SQLServerDatasourceUpgradeScript.txt
実行例:
以下の引数(必須)を指定します。
-
-Vtoolpassword=
:Configuration Toolのパスワードを指定 -
-VlibraryAdmin=
:管理者権限のあるSpotfireアカウント名 -
-Vvalidate=true
:変更後の接続URLでDB接続テストの実施有無を指定、Trueの場合は実施します。接続テストが失敗した場合には対象データソースが更新されません(ファイル内の次のコマンドへ進みます)。