3.5.1 支持加密连接

对于需要控制如何建立加密连接的应用程序,C API 提供了以下功能:

加密连接选项

mysql_options()提供以下选项来控制加密连接的使用。有关选项的详细信息,请参阅 第 5.4.49 节,“mysql_options()”

  • MYSQL_OPT_SSL_CA:证书颁发机构 (CA) 证书文件的路径名。如果使用此选项,则必须指定服务器使用的相同证书。

  • MYSQL_OPT_SSL_CAPATH:包含受信任的 SSL CA 证书文件的目录的路径名。

  • MYSQL_OPT_SSL_CERT:客户端公钥证书文件的路径名。

  • MYSQL_OPT_SSL_CIPHER:SSL 加密允许的密码列表。

  • MYSQL_OPT_SSL_CRL:包含证书吊销列表的文件的路径名。

  • MYSQL_OPT_SSL_CRLPATH:包含证书吊销列表文件的目录的路径名。

  • MYSQL_OPT_SSL_KEY: 客户端私钥文件的路径名。

  • MYSQL_OPT_SSL_MODE:连接安全状态。

  • MYSQL_OPT_SSL_VERIFY_SERVER_CERT:是否对服务器证书Common Name值进行主机名身份验证。

mysql_ssl_set()可以用作一个方便的例程,它等效于一组 mysql_options()指定证书和密钥文件、加密密码等的调用。参见第 5.4.70 节,“mysql_ssl_set()”

强制加密连接

mysql_options()SSL 证书和密钥文件等信息的选项用于建立加密连接(如果此类连接可用),但不强制要求对获得的连接进行加密。要要求加密连接,请使用以下技术:

  1. 必要时调用mysql_options()提供适当的 SSL 参数(证书和密钥文件、加密密码等)。

  2. 对于 MySQL 5.6.36 及更高版本, MYSQL_OPT_SSL_MODE可用,因此调用mysql_options()以传递MYSQL_OPT_SSL_MODE值为 的选项SSL_MODE_REQUIRED

    重要的

    MYSQL_OPT_SSL_MODE在 MySQL 5.6 中,次要的 C API 版本号在 MySQL 5.6.36 中没有增加 。为 MySQL 5.6 编译的应用程序MYSQL_OPT_SSL_MODE如果动态加载器提供不包含 MYSQL_OPT_SSL_MODE. 必须编写此类应用程序以通过检查 mysql_options()调用是成功还是失败来处理这种可能性。

  3. 调用mysql_real_connect() 以连接到服务器。从 MySQL 5.6.36 开始,如果无法获取加密连接,则调用失败;错误退出。在 5.6.36 之前 MYSQL_OPT_SSL_MODE(可用之前),客户端需要在调用 之后自行检查 mysql_real_connect()连接是否加密。如果 mysql_real_connect() 成功,请调用 mysql_get_ssl_cipher()以检查生成的连接是否已加密。如果不是,则退出并出错。

MySQL 客户端使用名为mysql_connect_ssl_check()建立和检查连接的包装函数来实现此技术,而不是 mysql_real_connect()直接调用。要了解这是如何工作的,请在client 任何标准 MySQL 客户端的源代码中查看 MySQL 源代码分发目录,以及 client_priv.h包含 mysql_connect_ssl_check()包装函数实现的文件。对 的调用 mysql_connect_ssl_check()采用参数,例如对 的参数 mysql_real_connect(),以及一个指示是否需要加密连接的额外参数:

if (!mysql_connect_ssl_check(&mysql, host, user, pass, db,
                             port, sock, flags,
                             opt_ssl_required))
{
  /* failure: connection not obtained, or not encrypted if required to be */
}
else
{
  /* success: connection obtained, encrypted if required to be */
}

版本说明:

  • 在 MySQL 5.6.30 中, --ssl-mode=REQUIRED 命令行选项从 MySQL 5.7 反向移植到 MySQL 5.6。客户端可以检查此选项并使用它来确定是否需要加密连接。如果是这样,客户端必须在调用后自行检查 mysql_real_connect()连接是否加密,否则失败。为此,调用 mysql_get_ssl_cipher()并检查返回值。

  • 在 MySQL 5.6.36 中,MYSQL_OPT_SSL_MODE 选项mysql_options() 从 MySQL 5.7 反向移植到 MySQL 5.6。 如果连接未加密 ,则将选项mysql_options()设置为值的调用足以导致失败。连接后仍然可以调用,尽管没有必要这样做。 MYSQL_OPT_SSL_MODESSL_MODE_REQUIREDmysql_real_connect()mysql_get_ssl_cipher()

提高加密连接的安全性

为了相对于默认加密提供的额外安全性,客户端可以提供与服务器使用的证书相匹配的 CA 证书并启用主机名身份验证。通过这种方式,服务器和客户端信任同一个 CA 证书,并且客户端验证它连接到的主机是预期的主机:

  • 要指定 CA 证书,请调用 mysql_options()以传递MYSQL_OPT_SSL_CA(or MYSQL_OPT_SSL_CAPATH) 选项。

  • 要启用主机名身份验证,请调用 mysql_options()以启用该MYSQL_OPT_SSL_VERIFY_SERVER_CERT 选项。

  • 要要求加密连接,请调用 mysql_options()以传递MYSQL_OPT_SSL_MODE值为 的选项SSL_MODE_REQUIRED。(有关详细信息SSL_MODE_REQUIRED,请参阅 实施加密连接。)