【发布时间】:2020-01-06 16:32:37
【问题描述】:
我有一个带有 MariaDB 数据库的远程服务器,它只接受特定用户的 SSL 连接,并使用以下方法生成了一些自签名 SSL 证书
# Create CA certificate
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
# Create server certificate, remove passphrase, and sign it
# server-cert.pem = public key, server-key.pem = private key
openssl req -newkey rsa:2048 -days 3600
-nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3600 \
-CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
# Create client certificate, remove passphrase, and sign it
# client-cert.pem = public key, client-key.pem = private key
openssl req -newkey rsa:2048 -days 3600 \
-nodes -keyout client-key.pem -out client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -req -in client-req.pem -days 3600 \
-CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
(取自https://dev.mysql.com/doc/refman/5.6/en/creating-ssl-files-using-openssl.html)
我为每个证书填写了如下的详细信息
- 国家/地区名称:GB
- 地区名称:公司镇
- 组织名称:公司名称
- 通用名称:DEV CA、DEV Server、DEV Client(分别)
并将所有其他字段留空
远程服务器在my.cnf中有以下内容
[mariadb]
ssl-ca=/path/to/ca.pem
ssl-cert=/path/to/server-cert.pem
ssl-key=/path/to/server-key.pem
我可以通过在其my.cnf 中包含以下内容从本地计算机的命令行进行连接
[client]
ssl-ca=/path/to/ca.pem
ssl-cert=/path/to/client-cert.pem
ssl-key=/path/to/client-key.pem
我可以使用以下命令从本地计算机创建 PDO 连接
$pdo = new PDO(
'mysql:host=xxx.xxx.xxx.xxx;dbname=database_1',
'database_user',
'database_password',
[
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
PDO::MYSQL_ATTR_SSL_KEY => '/path/to/client-key.pem',
PDO::MYSQL_ATTR_SSL_CERT => '/path/to/client-cert.pem',
PDO::MYSQL_ATTR_SSL_CA => '/path/to/ca.pem',
]
);
很遗憾,如果我删除该行
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
我收到内部服务器错误,并且在我的 MAMP PRO apache 错误日志中显示以下内容
… FastCGI: incomplete headers (0 bytes) received from server …
我的 PHP 错误日志中没有任何错误
我只能假设证书验证出了问题,
- 我错过了什么吗? 和/或
-
将
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT设置为 false 是否安全?
【问题讨论】:
-
对于您的最后一个问题,对于自签名证书,您必须将其保留为 false,因为由于不涉及根 CA,因此永远无法验证证书。对于您所描述的单个连接,它应该是安全的,尽管解决问题的正确方法是由根 CA 签名的“真实”证书,它可以让您将该变量设置为 true。
-
你的服务器证书中的CN是什么?您可以检查它,例如
openssl x509 -noout -subject -in server.pem. -