docker 安装sqlserver 证书
时间: 2025-07-04 12:27:17 浏览: 8
### 如何在 Docker 中安装 SQL Server 并配置 SSL 证书
为了在 Docker 容器中的 SQL Server 配置 SSL 证书,可以按照以下方法操作:
#### 准备工作
首先需要准备一个有效的 SSL/TLS 证书。可以通过两种方式获得此证书:
- **从受信任的 CA 获取证书**:联系认证机构申请正式的 SSL 证书。
- **使用 OpenSSL 生成自签名证书**:适用于测试环境或开发用途。
对于后者,可执行如下命令创建自签名证书[^2]:
```bash
openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 365 -out server.crt
```
这会生成两个文件:`server.key` 和 `server.crt`,分别代表私钥和公钥证书。
---
#### 复制证书至容器内部
将上述生成的证书文件复制到正在运行的 SQL Server 容器中。假设已启动了一个名为 `sqlserver` 的服务,则可通过以下步骤完成操作:
1. 使用 `docker cp` 命令将主机上的证书文件拷贝到容器内的指定路径 `/var/opt/mssql/`.
```bash
docker cp ./server.crt <container_id>:/var/opt/mssql/
docker cp ./server.key <container_id>:/var/opt/mssql/
```
2. 登录到目标容器并验证文件是否存在:
```bash
docker exec -it <container_id> bash
ls /var/opt/mssql/
```
---
#### 修改 SQL Server 配置以启用 SSL 加密
进入容器后,编辑 SQL Server 的配置文件使其支持 SSL 连接。具体做法包括以下几个方面[^4]:
1. 设置环境变量 `MSSQL_TLS_CERTIFICATE_PATH` 和 `MSSQL_TLS_PRIVATE_KEY_PATH` 来指向刚才上传的 `.crt` 及 `.key` 文件位置。
```bash
export MSSQL_TLS_CERTIFICATE_PATH=/var/opt/mssql/server.crt
export MSSQL_TLS_PRIVATE_KEY_PATH=/var/opt/mssql/server.key
```
2. 更新 SQL Server 的启动参数,在原有基础上增加 `-k` 参数用于强制加密连接以及 `-l` 参数设置监听端口为 TLS 模式。
```bash
docker run -e 'ACCEPT_EULA=Y' \
-e 'SA_PASSWORD=YourStrong!Passw0rd' \
-e 'MSSQL_TLS_CERTIFICATE_PATH=/var/opt/mssql/server.crt' \
-e 'MSSQL_TLS_PRIVATE_KEY_PATH=/var/opt/mssql/server.key' \
-p 1433:1433 --name sqlserver \
-d mcr.microsoft.com/mssql/server:2019-latest
```
注意替换密码字段为实际使用的强密码,并确保其满足复杂度要求.
---
#### 测试 SSL 功能
最后一步是对新部署的服务进行功能检测,确认是否成功启用了 SSL 支持。通过客户端工具尝试建立安全链接即可实现这一目的。例如利用 Python 脚本配合 pyodbc 库访问数据库时加入额外选项 `Encrypt=yes;TrustServerCertificate=no`.
```python
import pyodbc
conn_str = (
r'DRIVER={ODBC Driver 17 for SQL Server};'
r'SERVER=localhost;'
r'DATABASE=testdb;'
r'UID=sa;'
r'PWD=YourStrong!Passw0rd;'
r'Encrypt=yes;'
r'TrustServerCertificate=no;'
)
try:
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()
print("Connection successful!")
except Exception as e:
print(f"Error connecting to database: {str(e)}")
finally:
if 'cursor' in locals():
cursor.close()
if 'conn' in locals() and conn is not None:
conn.close()
```
如果脚本能正常返回 “Connection successful!” 则说明整个流程无误[^3].
---
阅读全文
相关推荐


















