go-mssqldbドライバは、SQL ServerおよびAzure SQLへの接続に対して複数の暗号化モードと証明書検証戦略をサポートしています。 この記事では、各暗号化モード、証明書検証の設定方法、TDS 8.0厳格モードの使用時について説明します。
TLS構成を選択します
この表を使って、個々のパラメータを調整する前に、自分の環境に最も合った安全な方法を選びましょう。
| シナリオ | 推奨設定 | なぜでしょうか |
|---|---|---|
| Azure SQL または SQL Server 2022 以降のバージョンで、最も強力なデフォルト保護を望むでしょう | encrypt=strict |
TDS 8.0はTDS交渉前にTLSハンドシェイクを実行し、常に証明書を検証します。 |
| サーバー証明書は信頼できるパブリックまたはコーポレートCAにチェーンされます | encrypt=true |
ホスト名と信頼チェーンがすでに正しい場合、標準的な証明書検証で通常十分です。 |
| サーバーはシステムトラストストアにないプライベートCAを使っています | encrypt=true&certificate=/path/to/ca-cert.pem |
CA証明書をカスタムトラストプールに追加し、通常のチェーン検証を維持します。 |
| サーバーは自己署名証明書を使用しており、証明書ピンニングを必要としています | encrypt=true&serverCertificate=/path/to/server.pem |
CAチェーンに頼らず、正確なサーバー証明書のバイト単位で比較できます。 |
| ローカル開発または一時的なテスト環境のみ | encrypt=true&TrustServerCertificate=true |
暗号化は維持しますが、サーバーのアイデンティティ検証は省略されます。 この設定は本番環境で使わないでください。 |
暗号化モード
encrypt接続パラメータを以下のいずれかの値に設定します:
| 価値 | Behavior |
|---|---|
strict |
TDS 8.0暗号化。 TLSのハンドシェイクはTDS接続交渉の前に行われます。 SQL Server 2022またはAzure SQLが必要です。 |
true または mandatory |
TDS事前ログインのハンドシェイク後、接続は暗号化されます。 |
false または optional |
暗号化はサーバーが要求する場合のみ使用されます。
encryptが指定されていない場合、これがデフォルトです。 Azure SQLは常にサーバー側で暗号化が必要なため、Azure SQLへの接続はこの設定に関わらず暗号化されます。 |
disable |
暗号化なし。 運用環境での使用は推奨されません。 |
Example
接続文字列で暗号化を有効にするには、encryptパラメータを使用します:
sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true
証明書の検証
暗号化(encrypt=true または encrypt=strict)を有効にすると、 TrustServerCertificate=trueを設定しない限り、ドライバーはサーバー証明書を検証します。 この検証には2つの独立したアプローチがあります。
certificateパラメータを用いたチェーン検証
PEMまたはDERの証明書ファイルを提供します。 ドライバーは証明書をカスタムトラストプールに追加し、そのプールに対して標準的なX.509チェーン検証を行います:
sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&certificate=/path/to/ca-cert.pem
serverCertificateパラメータを用いたバイトレベルの比較
Note
serverCertificateパラメータはドライバーv1.9.6で導入されました。
正確なサーバー証明書を含むPEMまたはDERファイルを提供します。 ドライバーはサーバーの証明書バイトを提供されたファイルとバイト単位で比較します。 ドライバーはチェーン検証を行いません。 この方法は自己署名証明書に有用です:
sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&serverCertificate=/path/to/server.pem
[ホスト名の上書き]
デフォルトでは、ドライバーは証明書の共通名(CN)または主体代替名(SAN)がサーバーホスト名と一致していることを検証します。 期待されるホスト名を上書きするために hostnameincertificate を使います:
sqlserver://<user>:<password>@10.0.0.5:1433?database=AdventureWorks2025&encrypt=true&hostnameincertificate=<server>.domain.com
証明書検証をスキップする
TrustServerCertificate=true証明書検証をすべてスキップするように設定してください。 接続自体は暗号化されていますが、サーバーの識別は検証されていません:
sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&TrustServerCertificate=true
注意事項
TrustServerCertificate=true を設定すると、接続が悪意のある第三者による中間者攻撃にさらされます。 このオプションは開発とテストにのみ使用してください。
TDS 8.0 厳格モード
TDS 8.0(厳密暗号化)は、TDSプロトコル交渉の前にTLSハンドシェイクを実行します。 この方法により、攻撃者が接続全体をダウングレードするのを防ぎます。 TDS 8.0 は SQL Server 2022 または Azure SQL が必要です:
sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=strict
厳密モードでは TrustServerCertificate パラメータは無視されます。 証明書の検証は常に行われ、デフォルトではシステムトラストストアを使用します。 カスタム検証のために certificate や serverCertificate を提供できます。
TLS の最小バージョン
tlsminパラメータを使って最低限のTLSバージョンを強制します:
sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&tlsmin=1.2
有効な値: 1.0、 1.1、 1.2、 1.3。
暗号化パラメータ概要
| パラメーター | Default | Description |
|---|---|---|
encrypt |
false |
暗号化モード。 Azure SQLは、この設定に関わらずサーバーサイドで常に暗号化を必要とします。 |
TrustServerCertificate |
encrypt に依存 |
true時は証明書検証を省略してください。 デフォルトはfalseが指定されている場合encrypt、trueが省略されるとencryptとなります。 |
certificate |
- | チェーン検証用のPEM/DERファイルパス。 |
serverCertificate |
- | バイトレベル比較のためのPEM/DERファイルパス。 |
hostnameincertificate |
- | 証明書で想定されるホスト名を上書きします。 |
tlsmin |
- | 最低限のTLSバージョン。 |