Docker容器中SQL Server 2017与Java应用的双向SSL认证配置问询
Docker容器中SQL Server的双向SSL配置与验证方法
结论先行:现在Docker部署的SQL Server已经支持双向SSL(客户端证书认证),2020年的限制已经在后续版本更新中移除了,放心配置就行。
一、SQL Server容器端配置
1. 准备证书文件
除了你已经配置好的服务器证书,还需要把客户端证书的根CA证书放到容器内的SQL Server证书目录(默认是/var/opt/mssql/secrets/),注意给证书设置正确的权限:
# 进入容器执行,或者在宿主机挂载时提前设置权限 chown mssql:mssql /var/opt/mssql/secrets/client-ca.crt
2. 更新mssql.conf
在你已有的SSL配置段里,新增客户端认证相关参数:
[network] tls = on tls-cert = /var/opt/mssql/secrets/server-cert.crt tls-key = /var/opt/mssql/secrets/server-key.key # 新增以下配置 tls-ca = /var/opt/mssql/secrets/client-ca.crt enforce-tls = on client-certificate = required
tls-ca指定SQL Server信任的客户端根CA,只有这个CA签发的客户端证书才会被认可client-certificate = required强制要求所有连接必须提供有效客户端证书,直接拒绝无证书的连接请求
3. 重启容器生效
docker restart <你的SQL Server容器名>
二、Java客户端适配
1. 处理客户端证书
如果你的客户端证书是pfx格式,先转成Java常用的JKS格式:
keytool -importkeystore -srckeystore client-cert.pfx -srcstoretype pkcs12 -destkeystore client-keystore.jks -deststoretype JKS
然后把根CA证书导入Java的系统信任库(也可以用自定义信任库):
keytool -importcert -file client-ca.crt -alias client-ca -keystore $JAVA_HOME/jre/lib/security/cacerts
默认cacerts的密码是changeit,按需修改即可。
2. 修改JDBC连接串
在原有加密连接的基础上,加上客户端证书的配置参数:
jdbc:sqlserver://<SQL Server容器IP/域名>:1433;databaseName=<你的数据库名>;encrypt=true;trustServerCertificate=false;clientCertificate=file:/path/to/client-keystore.jks;clientCertificatePassword=<你的密钥库密码>
三、验证双向SSL是否生效
1. 服务器端验证
- 查看容器日志,确认有客户端认证成功的日志:
docker logs <你的SQL Server容器名> | grep "Client certificate authentication succeeded" - 尝试用无证书的客户端连接(比如sqlcmd不带证书参数),应该直接被拒绝:
会返回类似sqlcmd -S <主机IP>,1433 -U <用户名> -P <密码> -d <数据库名> -NLogin failed. The server requires client authentication.的错误,说明强制认证规则生效。
2. 客户端验证
- 运行你的Java应用,能正常执行数据库操作就说明客户端证书认证通过;如果证书无效、未配置或者CA不被信任,应用会抛出
SQLServerException: Login failed. The server requires client authentication.或类似的信任异常。
内容的提问来源于stack exchange,提问作者marvelous
相关产品推荐
相关产品推荐

