.NET 不提供对 PEM 格式的本机支持。相反,Windows 包含一个证书存储区,它提供 PFX 格式的平台相关证书。出于本示例的目的,使用来自 MySQL 服务器存储库 ( ./mysql-test/std_data
) 的测试客户端证书。首先将这些转换为 PFX 格式。这种格式也称为 PKCS#12。
要完成本教程中针对 PFX 证书的步骤,您必须安装 Open SSL。可以从 Shining Light Productions免费下载适用于 Microsoft Windows 的软件。
从目录
中,发出以下命令。server-repository-root
/mysql-test/std_dataopenssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -certfile cacert.pem -out client.pfx
当要求输入导出密码时,输入密码 “ pass ”。
client.pfx
将生成该文件 。本教程的其余部分将使用该文件。
使用
client.pfx
您在上一步中创建的文件对客户端进行身份验证。以下示例演示了如何使用SslMode
、CertificateFile
和CertificatePassword
连接字符串选项进行连接。using (MySqlConnection connection = new MySqlConnection( "database=test;user=sslclient;" + "CertificateFile=H:\\git\\mysql-trunk\\mysql-test\\std_data\\client.pfx;" + "CertificatePassword=pass;" + "SslMode=Required ")) { connection.Open(); }
需要更改证书文件的路径以反映您的个人安装。使用 PFX 格式证书时,
SslMode
连接选项会验证所有 SSL 模式值的证书,Disabled
或None
(在 Connector/NET 8.0.29 中已弃用)除外。
第一步是将 PFX 文件导入
client.pfx
个人商店。在 Windows 资源管理器中双击该文件。这将启动证书导入向导。按照向导指示的步骤进行操作,当提示输入 PFX 文件的密码时,输入 “ pass ”。
单击完成关闭向导并将证书导入个人存储。
mmc.exe
通过在命令提示符处 输入来启动 Microsoft 管理控制台 。从 文件菜单中 选择添加/删除管理单元。单击 添加。从可用管理单元列表中 选择 证书。
在对话框中,单击“添加” ,然后选择“我的用户帐户”选项。此选项用于个人证书。
单击完成。
单击“确定”关闭“添加/删除管理单元”对话框。
您现在在 Microsoft 管理控制台的左侧面板中显示了证书 - 当前用户。展开 Certificates-Current User 树项并选择Personal、 Certificates。右侧面板显示颁发给之前导入的 MySQL 的证书。双击证书以显示其详细信息。
将证书导入个人存储后,您可以使用更简洁的连接字符串连接到数据库,如以下代码所示:
using (MySqlConnection connection = new MySqlConnection( "database=test;user=sslclient;" + "Certificate Store Location=CurrentUser;" + "SslMode=Required")) { connection.Open(); }
如果您的商店中有大量证书,并且许多证书具有相同的颁发者,这可能会造成混淆并导致使用错误的证书。为了缓解这种情况,有一个可选的 Certificate Thumbprint 参数可以额外指定为连接字符串的一部分。如前所述,您可以在 Microsoft 管理控制台中双击证书以显示证书的详细信息。显示“证书”对话框时,单击“
详细信息”选项卡并向下滚动以查看指纹。指纹通常是一个数字,例如
47 94 36 00 9a 40 f3 01 7a 14 5c f8 47 9e 76 94 d7
aa de f0
. 此指纹可用于连接字符串,如以下代码所示:
using (MySqlConnection connection = new MySqlConnection(
"database=test;user=sslclient;" +
"Certificate Store Location=CurrentUser;" +
"Certificate Thumbprint=479436009a40f3017a145cf8479e7694d7aadef0;"+
"SSL Mode=Required"))
{
connection.Open();
}
thumbprint 参数中的空格是可选的,值不区分大小写。