SQL Serverのサーバー側がTLS1を使用していると、セキュリティの制限でエラーとなることがある。
環境
Debian 10
OpenJDK 8 JRE Headless
Python 3.9
SQL Server JDBC 9.2.1.0 Jpn
エラー
com.microsoft.sqlserver.jdbc.SQLServerException: com.microsoft.sqlserver.jdbc.SQLServerException: ドライバーが SSL (Secure Sockets Layer) 暗号化による SQL Server への安全な接続を確立できませんでした。エラー: "The server selected protocol version TLS10 is not accepted by client preferences [TLS12]"。
Javaの場所を探す
$ /usr/sbin/update-java-alternatives -l
java-1.8.0-openjdk-amd64 1061 /usr/lib/jvm/java-1.8.0-openjdk-amd64
参考:https://symfoware.blog.fc2.com/blog-entry-1166.html
java.securityを編集
jre/lib/security/java.securityという設定ファイルを確認すると、
クライアント側のTLSについて下記の設定が見つかる。
ここでTLSv1が制限されていることが当初のエラーの原因
なお、JDK 11では、/conf/security/java.securityにある。
$ cat /usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/security/java.security
(略)
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
include jdk.disabled.namedCurves
(略)
↓
$ cat /usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/security/java.security
(略)
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
include jdk.disabled.namedCurves
(略)
としてやればok.
後ろの行が優先されるので、編集ではなく末尾に新たな行を作って追記しても動作する。