4.6.7.2 在连接器/NET 中使用 PFX 证书

.NET 不提供对 PEM 格式的本机支持。相反,Windows 包含一个证书存储区,它提供 PFX 格式的平台相关证书。出于本示例的目的,使用来自 MySQL 服务器存储库 ( ./mysql-test/std_data) 的测试客户端证书。首先将这些转换为 PFX 格式。这种格式也称为 PKCS#12。

要完成本教程中针对 PFX 证书的步骤,您必须安装 Open SSL。可以从 Shining Light Productions免费下载适用于 Microsoft Windows 的软件。

创建用于 .NET 客户端的证书文件
  1. 从目录 server-repository-root/mysql-test/std_data中,发出以下命令。

    openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -certfile cacert.pem -out client.pfx
  2. 当要求输入导出密码时,输入密码 passclient.pfx将生成该文件 。本教程的其余部分将使用该文件。

使用基于文件的证书连接到服务器
  1. 使用client.pfx您在上一步中创建的文件对客户端进行身份验证。以下示例演示了如何使用 SslModeCertificateFileCertificatePassword连接字符串选项进行连接。

    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 模式值的证书,DisabledNone(在 Connector/NET 8.0.29 中已弃用)除外。

使用基于商店的证书连接到服务器
  1. 第一步是将 PFX 文件导入 client.pfx个人商店。在 Windows 资源管理器中双击该文件。这将启动证书导入向导。

  2. 按照向导指示的步骤进行操作,当提示输入 PFX 文件的密码时,输入 pass

  3. 单击完成关闭向导并将证书导入个人存储。

在个人商店中检查证书
  1. mmc.exe通过在命令提示符处 输入来启动 Microsoft 管理控制台 。

  2. 文件菜单中 选择添加/删除管理单元。单击 添加。从可用管理单元列表中 选择 证书。

  3. 在对话框中,单击“添加” ,然后选择“我的用户帐户”选项。此选项用于个人证书。

  4. 单击完成

  5. 单击“确定”关闭“添加/删除管理单元”对话框。

  6. 您现在在 Microsoft 管理控制台的左侧面板中显示了证书 - 当前用户。展开 Certificates-Current User 树项并选择PersonalCertificates。右侧面板显示颁发给之前导入的 MySQL 的证书。双击证书以显示其详细信息。

  7. 将证书导入个人存储后,您可以使用更简洁的连接字符串连接到数据库,如以下代码所示:

    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 参数中的空格是可选的,值不区分大小写。