Microsoft ODBCドライバ for SQL Serverの主要バージョンの違い

この記事では、Microsoft ODBC Driver 18 for SQL Serverとバージョン17間の不規則な変更について説明します。 ドライバーのバージョンを選んだり、アプリケーションをバージョン17からバージョン18にアップグレードしたり、接続文字列を両方のバージョンで一貫して動作させる必要があるときに使ってください。

バージョン17からバージョン18にアップグレードするほとんどのアプリケーションは、接続がデフォルトで暗号化されているという単一の変更によって影響を受けます。 アップグレード後にアプリケーションが接続しなくなった場合は、まず 「デフォルトの暗号化動作 」を読んでください。

バージョン17かバージョン18を選んでください

ドライバー18が現在の主要バージョンです。 ドライバー17は引き続きサポートされていますが、それを使用するアプリケーションは修正を受けるためにドライバー17ラインの最新のマイナーバージョンが必要です。 サポート日およびサービスルールについては、 サポートライフサイクルを参照してください。

Scenario 推奨パス
新しい応用 ドライバー18から始めましょう。 本番環境の前に暗号化と証明書検証を設定しましょう。
既存のDriver 17アプリケーション ドライバー18をドライバー17と一緒にインストールし、接続文字列またはDSNでドライバー名を変更し、明示的にEncryptを設定します。 証明書検証が失敗した場合は、サーバー証明書かクライアントのトラストストアを修正してください。
Encrypt=Strict、HostnameInCertificate、RetryExec、または他のDriver 18キーワードが必要なアプリケーション 設定をサポートするDriver 18のリリースを使ってください。 ドライバー17はEncryptのStrict値を受け入れず、新しいキーワードも認識しません。
証明書ファイルのピンニングが必要なアプリケーション ServerCertificate Encrypt=StrictにはDriver 18.1またはそれ以降のバージョンを使ってください。 ドライバー17はこの設定をサポートしていません。

メジャーバージョンを変更するには、通常、ドライバー名や選択したパッケージを変更することが含まれます:

Platform ドライバー17 ドライバー18
接続文字列ドライバー名 ODBC Driver 17 for SQL Server ODBC Driver 18 for SQL Server
Linuxパッケージ名 msodbcsql17 msodbcsql18

変更の概要

デフォルト行と検証行は、DSNEncrypt設定、SQL_COPT_SS_ENCRYPT属性、またはWindows強制プロトコル暗号化オーバーライドなしの通常のリモート接続を表します。 LocalDBはリモートTLSターゲットではありません。

領域 バージョン 17 バージョン18以降のバージョン
デフォルトの Encrypt 設定 no Authenticationがnone以外の値に設定されているか、アプリケーションがSQL_COPT_SS_ACCESS_TOKENに設定されている場合を除きます。yes yes (18.0.1以降)
Encrypt 受け入れられた価値観 yes、no yes、no、Mandatory、Optional、Strict
暗号化モード オンかオフか オフ、オン、厳格
サーバー証明書の検証 Encrypt=yes;TrustServerCertificate=noを使えば、証明書が検証されます。 サーバー必須の暗号化だけでは検証が選択できません。 デフォルトで検証されます。 非厳密モードでは、 TrustServerCertificate=yes 通常の検証をスキップし、サーバーが暗号化を必要とする場合も含まれます。
接続文字列キーワード 基本セット ベースセットと新しいキーワード

暗号化の変更

既定の暗号化動作

ドライバー17は、Authenticationキーワードがnone以外の値に設定されているか、アプリケーションがSQL_COPT_SS_ACCESS_TOKEN属性を設定しない限り、デフォルトでEncrypt=noとなります。 どちらでもデフォルトが yesに変わります。 明示的な Encrypt=no でも暗号化は無効になります。 ドライバー18.0.1以降はデフォルトで Encrypt=yesです。 バージョンを比較する際に Encrypt を明示的に設定してください。

フルコネクション暗号化は、クエリのテキストや結果、そしてログイン情報を保護します。 Encrypt=noでも、サーバーは完全な接続暗号化を必要とすることがあります。 クライアントとサーバーの両方が暗号化をオフにした場合、非厳格交渉はログインのみ暗号化を使用します。これは後続のアプリケーションデータを保護しません。

Encrypt=yes;TrustServerCertificate=noでは、両方のドライバーは通常のサーバー証明書検証を選択します。 サーバーがフルコネクション暗号化と TrustServerCertificate=no (デフォルト)を必要とする場合、ドライバー18は証明書を検証します。 TrustServerCertificate=yesストックモード外の場合、ドライバー18はその検証をスキップします。 ドライバー17はサーバー要件だけが理由で検証されるわけではありません。 Windows強制プロトコル暗号化や内部証明書検証コールバックパスはこの比較対象外です。

デフォルトの暗号化設定では、バージョン17からバージョン18へのアップグレードで信頼できないサーバー証明書が露出する可能性があります。 バージョン18で証明書が拒否された場合は、認証設定を変更する前に証明書チェーンと名前を診断してください。

暗号化とサーバーのアイデンティティ検証を有効にしてください:

  • 有効なサーバー証明書とクライアントの信頼ストアを設定し、クライアントが発行する証明書発行機関を信頼できるようにします。 証明書の名前を使って接続してください。
  • エイリアスで接続する場合は、サーバー証明書の有効な名前に HostnameInCertificate 設定してください。 この設定は信頼できない証明書チェーンを修復しません。
  • Encrypt=Strictでは、ドライバー18.1以降のバージョンでは、サーバー証明書と証明書ファイルを照合するためのServerCertificateもサポートしています。 この設定は証明書をピン留めします。ホスト名は指定されません。 使用前にODBC DSNや接続文字列キーワードの制限を確認してください。

Caution

孤立したテスト環境では、 Encrypt=yes;TrustServerCertificate=yes 暗号化を要求しますが、サーバーのアイデンティティ検証をスキップするため、接続が敵対者による中間攻撃にさらされます。 プロダクショントラストの修理として使わないでください。 厳格モードでは TrustServerCertificate は無視されます。

既存のアプリケーションが制御された互換性テストでバージョン17のデフォルトを必要とする場合は、「 バージョン17の暗号化を復元する」を参照してください。 Encrypt=no また、 Encrypt=optional 証明書の信頼を修復せず、アプリケーションデータを暗号化せずに放置することもあります。

暗号化の価値

バージョン17は yes と noのみを受け入れています。 バージョン18以降のバージョンではこれらの値が受け入れられ、さらに3つが追加されています:

Value これは Behavior
Mandatory yes 接続は暗号化されています。
Optional no フルコネクション暗号化を要求しません。 サーバー側は依然として要求できます;ログイン専用暗号化は完全なセッション保護ではありません。
Strict なし 接続はTDS 8.0暗号化を使用しています。 サーバーはSQL Server 2022以降のバージョンなどのTDS 8.0をサポートしなければなりません。

Strict バージョン17に相当するものはありません。 TDS 8.0を選ぶ唯一の値であり、暗号化はログイン交換中に交渉されます。

バージョン17の暗号化動作を復元する

信頼修正を確認した後、暗号化されていないアプリケーションデータを許可する制御された互換性テストにのみ以下の設定を使用してください。

Encrypt=no

ドライバー18もこの設定で Encrypt=optional を受け入れています。 どちらの値もサーバーが暗号化を必要とすることを妨げるものではありません。 テスト後に意図した暗号化構成を復元してください。無効化された暗号化を証明書・信頼の対策として使わないでください。

アップグレードチェックリスト

  1. インベントリ接続文字列、DSN、パッケージ参照、Driver 17を選択するデプロイスクリプト。
  2. Driver 18を本番環境に一致するテスト環境にインストールしてください。
  3. 各接続文字列のDriverキーワードをODBC Driver 18 for SQL Serverに変更し、各DSNをDriver 18に更新または再作成してください。 ドライバー18をインストールしても既存の接続は切り替わりません。なぜなら、ドライバー17と名付けられた接続は引き続きドライバー17を使い続けるからです。
  4. Encrypt明示的に設定します。 通常の証明書検証と組み合わせて、 Encrypt=Mandatory を使いましょう。 Encrypt=Strictは、サーバーがTDS 8.0をサポートしている場合、例えば2022年以降のバージョンSQL Serverのみ使用してください。 TDS 8.0をサポートしていないサーバーには Encrypt=Mandatoryを使いましょう。
  5. 通常の検証のために、 TrustServerCertificate=no に接続し、信頼されたチェーンと承認されたサーバー名を確認してください。 Strictファイルピンディングが可能なDriver 18.1以降のバージョンでは、証明書の正確な一致と有効日を確認してください。 TrustServerCertificate はStrictモードで無視されます。
  6. アプリケーションの認証、クエリ、トランザクション、一括コピー、フェイルオーバー、再試行のパスを実行します。
  7. 認証やネットワークエラーとして扱う前に、証明書検証エラーの診断を確認しましょう。
  8. ドライバー17はインストールしたまま、検証が完了するまでステップ1のインベントリを保持しておき、 バージョン17にロールバックできるようにしてください。

バージョン17へのロールバック

ドライバー17とドライバー18は並行してインストールできるので、ドライバー18をアンインストールせずにロールバックできます。 ダウンロードおよびインストールの詳細については、「SQL Server用のODBCドライバーをダウンロード」をご覧ください。

  1. 各クライアントにドライバー17がまだインストールされているか確認してください。
  2. アップグレードチェックリストのインベントリを使って、各接続文字列のDriverキーワードをODBC Driver 17 for SQL Serverに戻します。
  3. 各DSNをDriver 17に更新または再作成してください。
  4. パッケージ参照やデプロイスクリプトをDriver 17パッケージ(Linuxの msodbcsql17 など)に戻します。
  5. Driver 17でアプリケーションが使用していた Encrypt と TrustServerCertificate 値を復元します。 ドライバー17はEncryptに対してyesとnoのみを受け入れ、HostnameInCertificateやServerCertificateなどのドライバー18のキーワードを認識しないため、ドライバー18に追加された値やキーワードは削除されます。 エイリアスキーワードをドライバー17の名前に戻し、ConnectTimeoutをSQL_ATTR_LOGIN_TIMEOUTを設定するSQLSetConnectAttrコールに置き換えます。 マッピングについては New 接続文字列 キーワードを参照してください。

ロールバックを完了と扱う前に検証してください:

  • 各接続はドライバー17を報告しています。 SQLGetInfoに電話してSQL_DRIVER_VER、メジャーバージョンは17です。
  • アプリケーションの認証、クエリ、トランザクション、一括コピー、フェイルオーバー、再試行パスは成功します。
  • 接続文字列やDSNには、ドライバー18で追加された Encrypt 値やキーワードは含まれていません。

新しい接続文字列キーワード

バージョン18では、以下の接続文字列キーワードが追加されていますが、バージョン17では認識されません。 その中には、バージョン17がサポートしている設定の新しい名前で、バージョン 17の同等 の欄に記載されている別のキーワードや属性の名称もあります。

キーワード 最小バージョン Purpose バージョン17相当
ConcatNullYieldsNull 18.6 はnull値を連結することでnullが得られるかどうかを制御します。 なし
ConnectTimeout 18.7 ログインタイムアウトは数秒で設定されます。 アプリケーションも SQL_ATTR_LOGIN_TIMEOUTを設定する場合、属性が優先されます。 SQL_ATTR_LOGIN_TIMEOUT 属性を 次のように設定します。 SQLSetConnectAttr
FailoverPartner 18.7 データベースミラーリングのフェイルオーバーパートナーを指定します。 Windows のみ。 Failover_Partner キーワード
GetDataExtensions 18.0 ドライバーが有効にする拡張機能 SQLGetData 制御します。 なし
HostnameInCertificate 18.0 サーバーのTLS証明書で検証するホスト名を指定します。 なし
IpAddressPreference 18.1 ドライバーが最初に試行するIPアドレスファミリーを指定します。 なし
LongAsMax 18.0 長いデータ型を max の対応物にマッピングします。 なし
MultipleActiveResultSets 18.7 複数のアクティブ結果セット(MARS)を有効にします。 Yes または No を指定できます。 MARS_Connection キーワード
RetryExec 18.1 失敗したクエリに対してリトライルールを設定しましょう。 なし
ServerCertificate 18.1 Encrypt=Strictを使う際にサーバー証明書と照合する証明書ファイルを指定します。 なし
WorkstationID 18.7 サーバーに送信されるワークステーション名を指定します。 WSID キーワード

MultipleActiveResultSets、 WorkstationID、 FailoverPartner は、ODBCのキーワード名を Microsoft.Data.SqlClient プロパティ名に合わせるエイリアスです。 バージョン18は古い名称も受け入れています。 詳細については、 Connection string キーワード unification および ConnectTimeout キーワードを参照してください。

完全なキーワード参照については、ODBC DSNおよび接続文字列キーワードを参照してください。