You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony6+PHP8.1连接MariaDB10.9仅关闭SSL证书验证才可工作

问题分析与解决

核心问题

你用IP连接MariaDB,但服务器证书的CN是fake-server,SSL验证时IP和证书里的身份信息不匹配,导致必须关闭PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT才能建立连接。

SSL证书验证服务器身份时,会检查证书的**CN(通用名称)或SAN(主题备用名称)**是否包含你用来连接的主机标识(这里是IP)。你的服务器证书CN是fake-server,和连接用的127.0.0.1/生产IP完全不匹配,所以验证失败,只能临时关闭证书校验。另外原证书脚本里生成CA时用了错误变量OPENSSL_ROOT_CA,这也可能导致证书链异常。

修复步骤

1. 修改证书生成脚本,给服务器证书添加IP作为SAN

修改后的脚本会生成包含IP地址SAN字段的服务器证书,确保IP能通过SSL身份验证:

OPENSSL_SUBJ="/C=US/ST=California/L=Santa Clara"
OPENSSL_CA="${OPENSSL_SUBJ}/CN=fake-ca"
OPENSSL_SERVER="${OPENSSL_SUBJ}/CN=fake-server"
OPENSSL_CLIENT="${OPENSSL_SUBJ}/CN=fake-client"

# 创建SAN配置文件,添加开发/生产环境的IP
cat > certs/server-san.cnf << EOF
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name

[req_distinguished_name]

[v3_req]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]
IP.1 = 127.0.0.1
# 生产环境IP请添加到这里,比如:
# IP.2 = 192.168.xxx.xxx
EOF

# 生成CA证书(修正原脚本的变量错误)
openssl genrsa 2048 > certs/ca-key.pem
openssl req -new -x509 -sha256 -nodes -days 3600 \
        -subj "${OPENSSL_CA}" \
        -key certs/ca-key.pem -out certs/ca-cert.pem

# 生成服务器证书请求时引用SAN配置
openssl req -newkey rsa:2048 -sha256 -days 3600 -nodes \
        -subj "${OPENSSL_SERVER}" \
        -keyout certs/server-key.pem -out certs/server-req.pem \
        -config certs/server-san.cnf

openssl rsa -in certs/server-key.pem -out certs/server-key.pem

# 签名服务器证书时带上SAN扩展
openssl x509 -req -in certs/server-req.pem -sha256 -days 3600 \
        -CA certs/ca-cert.pem -CAkey certs/ca-key.pem \
        -set_serial 01 -out certs/server-cert.pem \
        -extfile certs/server-san.cnf -extensions v3_req

openssl verify -CAfile certs/ca-cert.pem certs/server-cert.pem

# 客户端证书生成逻辑保持不变
openssl req -newkey rsa:2048 -sha256 -days 3600 -nodes \
        -subj "${OPENSSL_CLIENT}" \
        -keyout certs/client-key.pem -out certs/client-req.pem
openssl rsa -in certs/client-key.pem -out certs/client-key.pem
openssl x509 -req -in certs/client-req.pem -sha256 -days 3600 \
        -CA certs/ca-cert.pem -CAkey certs/ca-key.pem \
        -set_serial 01 -out certs/client-cert.pem
openssl verify -CAfile certs/ca-cert.pem certs/client-cert.pem

2. 调整Symfony数据库配置

移除禁用证书验证的选项,确保配置指向正确的证书路径:

# config/packages/doctrine.yaml
doctrine:
    dbal:
        url: '%env(resolve:DATABASE_URL)%'
        ssl: true
        ssl_ca: '%kernel.project_dir%/certs/ca-cert.pem'
        ssl_cert: '%kernel.project_dir%/certs/client-cert.pem'
        ssl_key: '%kernel.project_dir%/certs/client-key.pem'
        # 删除以下禁用验证的配置
        # options:
        #     !php/const PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT: false

若使用DATABASE_URL环境变量配置:

DATABASE_URL="mysql://用户名:密码@127.0.0.1:3306/数据库名?sslmode=verify_ca&sslrootcert=%kernel.project_dir%/certs/ca-cert.pem&sslcert=%kernel.project_dir%/certs/client-cert.pem&sslkey=%kernel.project_dir%/certs/client-key.pem"

验证

重新生成证书后,重启MariaDB和Symfony应用,即可正常建立SSL连接,无需关闭证书验证。

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:30:58