GO-MSSQLDB 暗号化と証明書

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 パラメータは無視されます。 証明書の検証は常に行われ、デフォルトではシステムトラストストアを使用します。 カスタム検証のために certificateserverCertificate を提供できます。

TLS の最小バージョン

tlsminパラメータを使って最低限のTLSバージョンを強制します:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&tlsmin=1.2

有効な値: 1.01.11.21.3

暗号化パラメータ概要

パラメーター Default Description
encrypt false 暗号化モード。 Azure SQLは、この設定に関わらずサーバーサイドで常に暗号化を必要とします。
TrustServerCertificate encrypt に依存 true時は証明書検証を省略してください。 デフォルトはfalseが指定されている場合encrypttrueが省略されるとencryptとなります。
certificate - チェーン検証用のPEM/DERファイルパス。
serverCertificate - バイトレベル比較のためのPEM/DERファイルパス。
hostnameincertificate - 証明書で想定されるホスト名を上書きします。
tlsmin - 最低限のTLSバージョン。