使用带有--ssl的PHP PDO连接MySQL / MariaDB而不使用证书

我可以从Sequel Pro连接到MySQL / MariaDB(参见这篇文章)和控制台提供 没有任何证书的--ssl选项</ strong>:</ p>

  $ mysql -u myusername -p -h 10.123.45.67 --ssl 
输入密码:
欢迎来到 MariaDB监视器。
</ code> </ pre>

由于用户需要SSL,因此无法使用--ssl进行连接:</ p>

  $  mysql -u myusername -p -h 10.123.45.67 
输入密码:
ERROR 1045(28000):拒绝访问用户'myusername'@'10.123.45.67'(使用密码:YES)
</ code> </ pre >

如何在PHP中使用PDO实现相同的目标? </ p>

我已经研究了过去几个小时但没有找到解决方案。 我尝试修改提供给PDO构造函数的dsn和options参数,但没有成功。 我最终得到错误代码1045(访问被拒绝)或2002(无法通过套接字连接):</ p>

  $ pdo = new PDO('mysql:dbname = ..  。; host = 10.123.45.67; port = 3306','myusername','...'); 
</ code> </ pre>


PHP致命错误: 未捕获的PDOException:SQLSTATE [HY000] [1045]用户'myusername'@'10.123.45.67'的访问被拒绝(使用密码:是)</ p>
</ blockquote>

添加 PDO :: MYSQL_ATTR_SSL_KEY </ code>(和其他)作为PDO构造函数的选项,导致2002(这些选项毫无意义,因为我没有密钥等)。 虽然我不知道如何以与从控制台或Sequel Pro内部相同的方式设置连接。</ p>
</ div>

展开原文

原文

I can connect to MySQL/MariaDB from Sequel Pro (see this post) and from the console by providing the --ssl option without any certificate:

$ mysql -u myusername -p -h 10.123.45.67 --ssl
Enter password:
Welcome to the MariaDB monitor.

Connecting without --ssl is not possible, as the user requires SSL:

$ mysql -u myusername -p -h 10.123.45.67
Enter password:
ERROR 1045 (28000): Access denied for user 'myusername'@'10.123.45.67' (using password: YES)

How can I achieve the same in PHP with PDO?

I've researched for the past hours and did not find a solution. I tried with modifying the dsn and options parameters which are provided to the PDO constructor without success. I either end up with error code 1045 (access denied) or 2002 (can't connect through socket):

$pdo = new PDO('mysql:dbname=...;host=10.123.45.67;port=3306', 'myusername', '...');

PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000] [1045] Access denied for user 'myusername'@'10.123.45.67' (using password: YES)

Adding PDO::MYSQL_ATTR_SSL_KEY(and others) as options to the PDO constructor, lead to 2002 (these options make no sense, as I don't have a key etc.). Though I do not know how to set up the connection in the same way as it is done from the console or internally in Sequel Pro.

drpkcwwav20524605
drpkcwwav20524605 问题是SequelPro和mysql控制台正在使用--ssl选项做什么,以及如何可以连接到那里但不能从PDO连接。当需要SSL为给定用户登录时,我无法在没有SSL的情况下访问这一点。但是再说一遍:我没有证书/钥匙等。提供(与链接的SequelPro问题相同)。
接近 3 年之前 回复
dongxun1142
dongxun1142 如果您没有证书,则无法使用SSL。副本代表,因为这是您报告的错误。由于缺乏SSL,您不会报告连接错误。
接近 3 年之前 回复
douqiao7188
douqiao7188 正如问题中所提到的,这是我尝试使用像MYSQL_ATTR_SSL_KEY这样的常量,但没有任何意义,因为我没有证书,我显然也不需要它们。所以除了这些常数之外必须有一些东西。你能否删除“重复”链接?
接近 3 年之前 回复
dongrong5189
dongrong5189 php.net/manual/en/ref.pdo-mysql.php“使用适当的PDO_MySQL常量启用SSL支持,这相当于调用»MySQLCAPI函数mysql_ssl_set()。”特别是php.net/manual/en/ref.pdo-mysql.php#103501
接近 3 年之前 回复
dongzhi7763
dongzhi7763 我再次重述了这个问题。它不是你链接的问题的副本,因为我需要使用SSL登录,它可以在控制台和SequelPro上运行-但是还没有PDO,因为我不知道如何传递选项/参数或者它需要什么。你可以因此删除链接吗?
接近 3 年之前 回复
dqyq88053
dqyq88053 虽然您可能认为它实际上提供了有关您正在尝试的内容以及可能无法正常运行的原因的更多信息。
接近 3 年之前 回复
dongmozhui3805
dongmozhui3805 我添加了更多信息。我认为添加更多不起作用的事例(因为它们显然没有任何意义)并没有改善这个问题;他们增加了阅读问题的努力,而没有增加任何价值。
接近 3 年之前 回复
doujing1858
doujing1858 向我们展示您尝试连接的PHP代码,并向我们提供错误的完整文本。
接近 3 年之前 回复
dongmo6937
dongmo6937 我已经更新了我的问题。还有其他你认为有用的东西吗?
接近 3 年之前 回复
douao1579
douao1579 我们总是很乐意帮助和支持新的程序员,但您需要先帮助自己。:-)做了更多的研究,如果你有问题发布你已尝试过的,清楚地解释了什么不起作用,并提供一个最小的,完整的,可验证的例子。阅读如何提出一个好问题。一定要参加游览并阅读本文。
接近 3 年之前 回复

2个回答

https://dev.mysql.com/doc/refman/5.7/en/encrypted-connection-options.html says:

--ssl-mode=mode

This option is available only for client programs, not the server. It specifies the security state of the connection to the server. These option values are permitted:

  • PREFERRED: Establish an encrypted connection if the server supports encrypted connections, falling back to an unencrypted connection if an encrypted connection cannot be established. This is the default if --ssl-mode is not specified.

  • REQUIRED: Establish an encrypted connection if the server supports encrypted connections. The connection attempt fails if an encrypted connection cannot be established.

What does this mean? When you use --ssl-mode=PREFERRED and the server has an SSL cert, then the client will use it to authenticate and then you get an encrypted connection.

But if the server does not have an SSL cert, in spite of your request by using the --ssl client option, you don't get an encrypted connection.

(Using the deprecated --ssl client option is equivalent to using --ssl-mode=PREFERRED. It allows connections to be opened without encryption.)

How can you know if you have an SSL connection? In the mysql client, run:

mysql> status

It'll tell you if SSL is in use or not. See https://dba.stackexchange.com/questions/36776/how-can-i-verify-im-using-ssl-to-connect-to-mysql

Bottom line:

  • You must have an SSL cert enabled on your MySQL server.
  • If you don't have a cert, then you can't get an encrypted connection.
douhu1990
douhu1990 好的,我没有任何建议。 据我所知,SSL连接需要客户端和服务器端的有效证书。 我发现一些引用虽然mysql客户端可以跳过CA验证,但PHP没有。
接近 3 年之前 回复
dpmrakfbx820320638
dpmrakfbx820320638 我唯一的my.cnf是/etc/mysql/my.cnf。 在[client]下只有端口和套接字,在[mysql]下没有一个条目。 唯一的SSL相关行被注释掉(例如:#ssl-ca = / etc / mysql / cacert.pem)。
接近 3 年之前 回复
duanmu6231
duanmu6231 您是否在$ HOME / .my.cnf或[client]或[mysql]部分下的/etc/my.cnf中为您的客户配置了SSL证书选项?
接近 3 年之前 回复
doudang4568
doudang4568 非常感谢,这很有帮助。 我发现我的机器上还没有支持“--ssl-mode = PREFERRED”,所以我选择了“--ssl”。 除了其他信息“SSL:使用的密码是DHE-RSA-AES256-SHA”之外,在活动连接输出中输入“status”。 所以似乎SSL连接已到位。 这让我想到如何使用这些新知识打开与PHP PDO的连接。
接近 3 年之前 回复

I was able to enable an SSL connection without enabling client certificate authentication by setting the options passed to the PDO constructor. I set the CA to true and turned off server certificate verification:

$options = [
    PDO::MYSQL_ATTR_SSL_CA => '/dev/null',
    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
];

If you want to verify the server cert, then you need to set the CA to a file containing a real CA cert chain (though this isn't currently possible if you're using an Azure MySQL instance - you always need to disable server cert verification because PDO doesn't follow the CNAME records, but that's another issue entirely).

This works as of PHP 7.3. Not sure about earlier versions of PHP.

EDIT It turns out that the PDO::MYSQL_ATTR_SSL_CA is completely ignored, as long as you disable server verification. You still must set it to SOMETHING non-empty:

$options = [
    PDO::MYSQL_ATTR_SSL_CA => true,
    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
];
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问