对于需要控制如何建立加密连接的应用程序,C API 提供了以下功能:
该
mysql_options()
函数使应用程序能够在调用之前设置适当的 SSL/TLS 选项mysql_real_connect()
。例如,要要求使用加密连接,请参阅 实施加密连接。该
mysql_get_ssl_cipher()
函数使应用程序能够在建立连接后确定连接是否使用加密。NULL
返回值表示未使用加密。非NULL
返回值表示加密连接并命名加密密码。参见 第 5.4.33 节,“mysql_get_ssl_cipher()”。
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 证书和密钥文件等信息的选项用于建立加密连接(如果此类连接可用),但不强制要求对获得的连接进行加密。要要求加密连接,请使用以下技术:
必要时调用
mysql_options()
提供适当的 SSL 参数(证书和密钥文件、加密密码等)。-
对于 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()
调用是成功还是失败来处理这种可能性。 调用
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_MODE
SSL_MODE_REQUIRED
mysql_real_connect()
mysql_get_ssl_cipher()
为了相对于默认加密提供的额外安全性,客户端可以提供与服务器使用的证书相匹配的 CA 证书并启用主机名身份验证。通过这种方式,服务器和客户端信任同一个 CA 证书,并且客户端验证它连接到的主机是预期的主机:
要指定 CA 证书,请调用
mysql_options()
以传递MYSQL_OPT_SSL_CA
(orMYSQL_OPT_SSL_CAPATH
) 选项。要启用主机名身份验证,请调用
mysql_options()
以启用该MYSQL_OPT_SSL_VERIFY_SERVER_CERT
选项。要要求加密连接,请调用
mysql_options()
以传递MYSQL_OPT_SSL_MODE
值为 的选项SSL_MODE_REQUIRED
。(有关详细信息SSL_MODE_REQUIRED
,请参阅 实施加密连接。)