使用 MySQL 连接器版本 8.0.18,我尝试使用 SSL 证书连接到数据库。
我无法这样做,因为这段代码:
MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder();
builder.Server = "server";
builder.Port = 3307;
builder.Database = "databse";
builder.UserID = "user";
builder.Password = "************";
builder.SslMode = MySqlSslMode.Required;
builder.SslCa = "ca.pem";
builder.SslCert = "client-cert.pem";
builder.SslKey = "client-key.pem";
MySqlConnection conn = new MySqlConnection(builder.ToString());
conn.Open();
抛出以下异常:
MySql.Data.MySqlClient.MySqlException: 'Authentication to host 's-ce.srv.rxe.pl' for user 's-ce.client' using method 'mysql_native_password' failed with message: Access denied for user 'user'@'server' (using password: YES)'
我已将文件 ca.pem、client-cert.pem 和 client-key.pem 放在应用程序可执行文件所在的同一目录中。
使用 MySQL Workbench,我能够从同一台 PC 使用相同的参数和 pem 文件连接到该数据库。
什么给出了?
更新
根据评论中的建议,我已将 PEM 文件转换为具有所选密码的单个 PFX 证书。我能够连接更新代码(仅相关更改的行):
builder.SslMode = MySqlSslMode.Required;
builder.CertificateFile = "client-cert.pfx";
builder.CertificatePassword = "************";
MySqlConnection conn = new MySqlConnection(builder.ToString());
最佳答案
使用 PEM 文件进行相互身份验证不适用于 Connector/NET (MySql.Data);这是一个已知的错误:bug 97738 .
有两种解决方法:
- 使用
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -certfile ca.pem -out client.pfx
将客户端证书和 key 文件转换为 PFX 文件. - 切换到https://www.nuget.org/packages/MySqlConnector/ ,它正确支持 PEM 文件(和 fixes many other bugs )。
关于c# - MySQL .NET SSL 访问被拒绝异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59027497/