如何通过SSL访问远程数据库?

时间:2015-11-16 00:52:23

标签: php mysql ssl ssh

[AP Server] --> [DB Server] (over SSL)

我需要通过SSL访问远程数据库服务器,但是当我执行mysql命令时,我无法连接到数据库服务器。任何帮助将不胜感激。

我做了什么:

  1. 创建了.pem文件。

    /tmp/ca-cert.pem
    /tmp/server-cert.pem
    /tmp/server-no-password-key.pem
    
  2. 更改了my.cnf

    [mysqld]
    ssl-ca=/tmp/ca-cert.pem
    ssl-cert=/tmp/server-cert.pem
    ssl-key=/tmp/server-no-password-key.pem
    
  3. 重启mysql并检查设置

    $mysql -u user1 -p --ssl-ca=/tmp/ca-cert.pem
    
    mysql> show variables like '%ssl%';
    +---------------+---------------------------------+
    | Variable_name | Value                           |
    +---------------+---------------------------------+
    | have_openssl  | YES                             |
    | have_ssl      | YES                             |
    | ssl_ca        | /tmp/ca-cert.pem                |
    | ssl_capath    |                                 |
    | ssl_cert      | /tmp/server-cert.pem            |
    | ssl_cipher    |                                 |
    | ssl_crl       |                                 |
    | ssl_crlpath   |                                 |
    | ssl_key       | /tmp/server-no-password-key.pem |
    +---------------+---------------------------------+
    
    mysql> SHOW STATUS LIKE 'Ssl_cipher';
    +---------------+--------------------+
    | Variable_name | Value              |
    +---------------+--------------------+
    | Ssl_cipher    | DHE-RSA-AES256-SHA |
    +---------------+--------------------+
    
  4. 从AP服务器到数据库服务器密钥的SSH访问

    ssh dbserver // pubkey login is ok.
    
  5. 尝试从AP服务器到数据库服务器的mysql访问

    $ mysql -u user1 -p -h dbserver --ssl-ca=/tmp/ca-cert.pem
    Enter password: 
    ERROR 2003 (HY000): Can't connect to MySQL server on 'dbserver' (110)
    
  6. 供参考:

    DB Server不允许ssh密码验证。只允许使用pubkey登录

    由于

    更新

    我的第一个目标是从AP服务器运行此PHP脚本。此脚本在DB Server中有效。

    <?php
    
    $dbh   = mysqli_init();
    
    $isSSL = mysqli_ssl_set(
        $dbh,
        '/tmp/server-no-password-key.pem',
        '/tmp/server-cert.pem',
        '/tmp/ca-cert.pem',
        null,
        null
    );
    $isConnected = mysqli_real_connect(
        $dbh,
        'dbserver',
        'user1',
        'user1-pass',
        'dbname1',
        3306,
        null,
        MYSQLI_CLIENT_SSL
    );
    $result = $dbh->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
    $row = $result->fetch_assoc();
    echo htmlentities($row['_message']);
    ?>
    

    UPDATE2

    我觉得Grants没问题。

    mysql> SHOW GRANTS FOR user1;
    ------------------------------------------------+
    | GRANT ALL PRIVILEGES ON *.* TO 'user1'@'%' IDENTIFIED BY PASSWORD '*******************' WITH GRANT OPTION |
    +---------------------------------------------------------------------------------------------------------------------------------+
    

    关于防火墙,端口3306已关闭。我想在使用SSL时我不需要打开。事实上,续集pro(sql客户端应用程序)可以连接到DB甚至3306正在关闭。 SSH私钥设置可能是原因......

    UPDATE3

    有些网站显示SSH端口转发。这更容易......创建.pem文件和设置只是浪费我的时间....?我会检查一下。

    UPDATE4

    有效!

    ssh user1@dbserver -p 22 -g -N -f -L 12345:localhost:3306
    mysql -uuser1 -p -h 127.0.0.1 –port=12345
    

    我还不确定.pem设置是否必要。当我删除mysqli_ssl_set时,我可以通过tcpdump看到原始数据。我认为ssh转发会加密整个公共网络的数据......这没有意义......

    sudo tcpdump -nxX -s 2000 port 3306 -ilo
    

0 个答案:

没有答案