perl - SSL 连接适用于 mysql 客户端,但不适用于 perl DBI :MariaDB

标签 perl ssl mariadb dbi

我有一个 MariaDB 服务器,它设置了自签名证书以使用 TLS 进行连接。当我与相应的客户端连接时,这有效

$ mysql -u xxxx -h xx.xx.xx.xx -p 
\s shows:
mysql  Ver 15.1 Distrib 10.1.37-MariaDB, for debian-linux-gnu (x86_64)     
SSL:   Cipher in use is DHE-RSA-AES256-SHA

.my.cnf 包含:
$ cat ~/.my.cnf 
[client]
ssl-cert=/---path-deleted---/client-cert.pem
ssl-key=/---path-deleted---/client-key.pem

问题:我无法使用这些设置从 Perl 脚本进行连接。没有 SSL,脚本可以工作。只要我在脚本中启用 SSL(并在服务器上强制执行),我就会得到:
failed: SSL connection error: ASN: bad other signature confirmation

当我使用 openssl 检查证书时,我得到
$ openssl verify ca-cert.pem client-cert.pem server-cert.pem 

error 18 at 0 depth lookup: self signed certificate

证书确实是自签名的,我想保持这种状态。

如果我使用“mariadb_ssl_verify_server_cert=0”,我会得到
failed: SSL connection error: Enforcing SSL encryption is not supported without mariadb_ssl_verify_server_cert=1

我需要更改什么才能让 TLS 连接从 Perl 工作?

我复制了我的连接子中的代码行以供引用。一个非常相似的代码用于使用 mysql(不是 mariadb)在旧系统上工作,只使用 mysql_ssl=1 IIRC:
$self->{dsn} = "DBI:MariaDB:database=$database;host=$db_host;mariadb_ssl=1;".
    "mariadb_ssl_verify_server_cert=1;".
    "mariadb_ssl_ca_file=/---path---/ca-key.pem;".
    "mariadb_ssl_client_key=/---path---/client-key.pem;".
    "mariadb_ssl_client_cert=/---path---/client-cert.pem";
$self->{dbh} = DBI->connect($self->{dsn}, $db_user, $db_passwd,
            {'RaiseError' => 1, 'PrintError' => 1, AutoCommit => 1});

最佳答案

我有一个类似的问题,虽然使用 DBI:mysql。
问题是我在连接字符串中指定了 IP 地址,而不是在 SSL 证书 CN 中指定的服务器名称。 mysql 命令行客户端不介意,但 DBI:mysql 可以。
为了获得证书的 CN,我按照 https://serverfault.com/a/931652/243186 使用了 openssl
然后我需要在我的/etc/hosts 文件中添加一个条目,以使 CN 与我正在连接的接口(interface)的 IP 相匹配。
另一种解决方案是让 MySQL 服务器所有者生成一个 SSL SAN 证书,指定它可以连接到的所有可能的服务器名称和 IP。

关于perl - SSL 连接适用于 mysql 客户端,但不适用于 perl DBI :MariaDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55189991/

相关文章:

perl - 使用 perl 将\x3c/div\x3e 转换为 <div>

ssl - NGINX 说 "client sent no required SSL certificate while reading client request headers"我们如何排除故障?

ssl - 带 https 的 HTTP 客户端

mysql - 从同一个表mysql存储过程中选择具有不同条件的多个计数

mysql - MariaDB 没有 ST_Distance_Sphere 的等效函数

测试 "0"、 "-0"、 "0.0"、 "00"时的 PHP 和 Perl 行为

perl - 在 Perl 中,如何向操作系统释放内存?

perl - 在文件中发送音频时,Google Speech API 不给出正确的结果

perl - 如何让 Frontier::Client/LWP 停止验证 CGI::Application Web 应用程序中的 SSL 证书?

python - 将值存储到 mySQL 表时出错