【问题标题】:Perl DBI:mysql connection over SSL failsPerl DBI:通过 SSL 的 mysql 连接失败
【发布时间】:2014-05-09 14:20:02
【问题描述】:

长期阅读,但这是我在这里的第一个问题。

我在数据中心有一个 MySQL 服务器,在另一个地方有处理服务器,因此我需要加密从我的 Perl 脚本到数据库的连接。在 MySQL 上进行了所有必要的设置(创建新用户、创建 ca、服务器和客户端密钥),并且通过 SSL 的 MySQL 连接工作正常。

root@server:# mysql -h _HOST_ --port 3306 -u _SSL_USER_ --ssl-cert=/etc/mysql/certs/client-cert.pem --ssl-key=/etc/mysql/certs/client-key.pem -p _DATABASE_
Enter password:
Welcome to the MySQL monitor.
Commands end with ; or \g. 
Your MySQL connection id is 49694205 
Server version: 5.0.96 Source distribution ...

所以,我相信设置是好的。问题是我无法让我的 Perl 脚本连接到数据库。返回的错误很简单:

在 temp.pl 第 7 行拒绝用户 '_SSL_USER_'@'HOST' 的访问(使用密码:YES)。

为简化起见,我在脚本中仅添加了以下代码:

#!/usr/bin/perl 
use strict; 
use DBI; 

#DBI->trace(5); 
my $dbh = DBI->connect( 
  "DBI:mysql:database=_DATABASE_;host=_HOST_; 
  mysql_ssl=1; 
  mysql_ssl_client_key=/etc/mysql/certs/client-key.pem; 
  mysql_ssl_client_cert=/etc/mysql/certs/client-cert.pem; 
  mysql_ssl_ca_file=/etc/mysql/certs/ca-cert.pem", 
  '_SSL_USER_', 
  '_SSL_USER_PWD_' 
) || die DBI->errstr; 
exit(0);

Perl 版本是为 i486-linux-thread-multi 构建的 v5.10.0。 DBD::mysql 模块是使用“-ssl”选项编译的。

我无法弄清楚或找到进一步调试的方法。任何帮助将不胜感激。

谢谢!

【问题讨论】:

    标签: mysql perl ssl


    【解决方案1】:

    您是否使用所有 Perl 模块的最新版本?

    我找到了这个帖子:http://forums.mysql.com/read.php?51,78084,78264#msg-78264

    修复它。从 2.9007 -> 3.0002 升级 DBD-mysql,它就像一个 魅力。

    也许删除用户名/密码会有所帮助?

    my $dbh = DBI->connect( 
      "DBI:mysql:database=_DATABASE_;host=_HOST_; 
      mysql_ssl=1; 
      mysql_ssl_client_key=/etc/mysql/certs/client-key.pem; 
      mysql_ssl_client_cert=/etc/mysql/certs/client-cert.pem; 
      mysql_ssl_ca_file=/etc/mysql/certs/ca-cert.pem", 
      '', 
      '' 
    ) || die DBI->errstr; 
    

    不能说你有什么问题,但我假设你有 在 DBI->connect 行中包含用户名和密码, 另一件事是 cacert 和客户端证书需要在您的 远程计算机(带有 PERL 脚本的计算机)。除此之外我会 如果您有更多详细信息,我们很乐意为您提供帮助。

    您可以尝试追踪错误:http://search.cpan.org/perldoc/DBI#TRACING

    DBI_TRACE=8=/tmp/dbitrace.log
    export DBI_TRACE
    ./your_program.pl
    

    你可以使用 shell 变量来确保你在 Perl 和 shell 中做同样的事情:

    export DB_HOST="your host"
    export DB_USER=""
    export DB_PWD=""
    export DB_DATABASE=""
    mysql -h "$DB_HOST" --port 3306 -u "DB_USER" --ssl-cert=/etc/mysql/certs/client-cert.pem --ssl-key=/etc/mysql/certs/client-key.pem -p "$DB_DATABASE"
    
    my $dbh = DBI->connect( 
      "DBI:mysql:database=$ENV{"DB_HOST"};host=$ENV{"DB_HOST"}; 
      mysql_ssl=1; 
      mysql_ssl_client_key=/etc/mysql/certs/client-key.pem; 
      mysql_ssl_client_cert=/etc/mysql/certs/client-cert.pem; 
      mysql_ssl_ca_file=/etc/mysql/certs/ca-cert.pem", 
      '', 
      '' 
    ) || die DBI->errstr; 
    

    【讨论】:

    • 感谢您的建议,我已经在运行 DBD-mysql-4.027 并且删除用户/密码没有帮助,用户身份验证需要此信息。
    • 不幸的是,在 Perl v5.14.2 上测试,结果相同。任何关于如何调试它的想法都将不胜感激。谢谢。
    • 您收到的错误信息是什么? DBI 跟踪日志文件中有什么内容?
    • 我得到一个常规的权限被拒绝错误,不知道如何进一步调试它:“失败:用户'SSL_USER'@'DB_HOST的访问被拒绝>'(使用密码:YES)”。我不会如何启用 DBI 跟踪日志,您能帮我解决吗?
    • 这是 DBI 跟踪日志的内容:
    猜你喜欢
    • 2020-09-14
    • 1970-01-01
    • 2021-10-16
    • 2012-03-13
    • 2012-05-02
    • 1970-01-01
    • 2012-08-25
    • 2012-05-24
    • 1970-01-01
    相关资源
    最近更新 更多