【问题标题】:How do I connect to a MySQL database over SSL with Laravel 5.3如何使用 Laravel 5.3 通过 SSL 连接到 MySQL 数据库
【发布时间】:2017-10-19 01:26:15
【问题描述】:

我一直在互联网上搜索,但没有任何成功。

例如:https://laravel.io/forum/06-18-2014-connecting-mysql-over-ssl?page=1 https://laracasts.com/discuss/channels/lumen/connecting-to-mysql-via-ssl-from-lumen

我正在尝试从我的 laravel 应用程序通过 ssl 连接到 azure mysql 数据库。

我已经确认,如果我关闭 ssl,我可以连接到数据库。所以设置是正确的。什么让我绊倒了,我找不到关于如何通过 ssl 连接的文档。我有一个 sslkey——我已经确认它可以用来通过我的一个数据库管理程序连接到数据库——所以这些部件就在那里。

然而,Laravel 似乎失败了。

这是我的数据库驱动程序:

'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
            'sslmode' => env('DB_SSLMODE', 'prefer'),
            'options'   => array(
                            PDO::MYSQL_ATTR_SSL_KEY    => '\ssl\DatabaseCACert.pem'),
        ],

我错过了什么?数据库目前只是拒绝连接。 SQLSTATE[HY000] [2002] 所以它很接近。

【问题讨论】:

    标签: mysql database ssl laravel-5


    【解决方案1】:

    您需要提供文件的完整路径。如果它们在您的 laravel 应用程序文件夹中,那么您可以使用 base_path 方法生成完整的 Poth。您可能还需要定义 cert 和 ca。

    'options' => [
        PDO::MYSQL_ATTR_SSL_KEY => base_path('ssl/client-key.pem'),
        PDO::MYSQL_ATTR_SSL_CERT => base_path('ssl/client-cert.pem'),
        PDO::MYSQL_ATTR_SSL_CA => base_path('ssl/ca-cert.pem')
    ]
    

    【讨论】:

    • base_path 注释有帮助,尽管它不能解决问题。 Microsoft 的所有 azure 文档仅指定一个 .pem 文件用于连接到 azure。但会尝试生成其他的,看看你的解决方案是否有效。
    • 这适用于 2 路 SSL(相互 ssl)。但有可能服务器正在使用一种方式 SSL(如 Azure)
    【解决方案2】:

    好的。解决了这个问题。跳上微软的电话,发现其中一个日志错误是:

    PDO::__construct(): Peer certificate CN=`resourceregion-a.control.database.windows.net' did not match expected CN=`db.mysql.database.azure.com'
    

    @alexejenko 指出的文档中的那一行,之后的一点:

    " 如果您需要使用"--ssl-mode=VERIFY_IDENTITY",那么您可以ping您的服务器名称来解析区域服务器名称,例如westeurope1-a.control.database.windows.net,然后使用它连接中的区域服务器名称,直到此问题得到解决。我们计划在未来消除此限制。”

    原来这就是正在发生的事情。数据库连接路由到区域数据库,而不是我的。所以是的,对于不完全完成的产品。

    一旦我将我的 DB_HOST 更改为它成功连接的区域(注意:确保您已将您的 ips 列入白名单)。

    【讨论】:

      【解决方案3】:

      有时,当您没有远程访问数据库的权限时,也会显示相同的错误。

      这里的例子:

      • Server1-app: 123.123.123.12
      • Server2-数据库:456.456.456.45

      所以,你可以从 Server1-app 试试:

      $ mysql -u youruser -h yourpassword;
      

      进入mysql终端,检查是否可以访问数据库:

      $ show databases;
      

      如果显示您的数据库,则您有权限并且一切正常,如果没有,您必须访问您的 Server2 数据库并向您的用户授予权限。

      曾经在 Server2-database 中;

      $ mysql -u root -p
      $ GRANT ALL PRIVILEGES ON your_database.* TO 'youruser'@'123.123.123.12';
      $ FLUSH PRIVILEGES;
      $ exit;
      

      希望对你有所帮助;

      【讨论】:

        猜你喜欢
        • 2011-05-18
        • 1970-01-01
        • 2018-10-23
        • 2016-09-20
        • 2019-04-03
        • 1970-01-01
        • 1970-01-01
        • 2015-03-29
        • 2014-06-17
        相关资源
        最近更新 更多