本节介绍 C 应用程序如何使用 C API 功能来建立加密连接。默认情况下,MySQL 程序会尝试使用加密连接,前提是服务器支持加密连接,如果无法建立加密连接,则会回退到非加密连接(参见 配置 MySQL 使用加密连接)。对于需要超越默认行为对如何建立加密连接进行控制的应用程序,C API 提供了以下功能
mysql_options()
函数允许应用程序在调用mysql_real_connect()
之前设置适当的 SSL/TLS 选项。例如,要强制使用加密连接,请参见 强制加密连接.mysql_get_ssl_cipher()
函数允许应用程序在建立连接后确定连接是否使用加密。如果返回值为NULL
,则表示未使用加密。如果返回值不为NULL
,则表示已建立加密连接,并会显示加密密码。参见 第 5.4.36 节“mysql_get_ssl_cipher()”.
mysql_options()
提供以下选项来控制加密连接的使用。有关选项的详细信息,请参见 第 5.4.54 节“mysql_options()”.
MYSQL_OPT_SSL_CA
: 证书颁发机构 (CA) 证书文件的路径名。如果使用此选项,则必须指定与服务器使用的证书相同的证书。MYSQL_OPT_SSL_CAPATH
: 包含受信任 SSL CA 证书文件的目录的路径名。MYSQL_OPT_SSL_CERT
: 客户端公钥证书文件的路径名。MYSQL_OPT_SSL_CIPHER
: 客户端允许用于使用 TLS 协议(直至 TLSv1.2)的连接的加密密码列表。MYSQL_OPT_SSL_CRL
: 包含证书吊销列表的文件的路径名。MYSQL_OPT_SSL_CRLPATH
: 包含证书吊销列表文件的目录的路径名。MYSQL_OPT_SSL_KEY
: 客户端私钥文件的路径名。MYSQL_OPT_SSL_MODE
: 连接安全状态。MYSQL_OPT_SSL_SESSION_DATA
: 来自加密连接的序列化会话数据,这些数据是在连接处于活动状态时通过调用mysql_get_ssl_session_data()
函数返回的。MYSQL_OPT_TLS_CIPHERSUITES
: 客户端允许用于使用 TLSv1.3 的连接的加密密码套件列表。MYSQL_OPT_TLS_VERSION
: 客户端允许的加密协议。
MySQL 8.2 及更早版本提供了 mysql_ssl_set()
函数,该函数现已删除。请改用 mysql_options()
来指定证书和密钥文件、加密密码等。
mysql_options()
用于指定 SSL 证书和密钥文件等信息的选项用于建立加密连接(如果可用),但不会强制要求获得的连接必须是加密的。要强制使用加密连接,请使用以下方法
根据需要调用
mysql_options()
,并提供适当的 SSL 参数(证书和密钥文件、加密密码等)。调用
mysql_options()
传递MYSQL_OPT_SSL_MODE
选项,其值为SSL_MODE_REQUIRED
或其中一个更严格的选项值。调用
mysql_real_connect()
连接到服务器。如果无法获得加密连接,则调用失败;退出并显示错误。
为了比默认加密提供更高的安全性,客户端可以提供与服务器使用的 CA 证书匹配的 CA 证书,并启用主机名身份验证。这样,服务器和客户端就都信任同一个 CA 证书,而客户端则会验证其连接到的主机是否为目标主机
要指定 CA 证书,请调用
mysql_options()
传递MYSQL_OPT_SSL_CA
(或MYSQL_OPT_SSL_CAPATH
)选项,并调用mysql_options()
传递MYSQL_OPT_SSL_MODE
选项,其值为SSL_MODE_VERIFY_CA
。要同时启用主机名身份验证,请调用
mysql_options()
传递MYSQL_OPT_SSL_MODE
选项,其值为SSL_MODE_VERIFY_IDENTITY
而不是SSL_MODE_VERIFY_CA
。
使用 SSL_MODE_VERIFY_IDENTITY
进行主机名身份验证不适用于由服务器自动创建的自签名证书,也不适用于使用 mysql_ssl_rsa_setup 手动创建的自签名证书(参见 使用 MySQL 创建 SSL 和 RSA 证书和密钥)。此类自签名证书不包含服务器名称作为通用名称值。
主机名身份验证也不适用于使用通配符指定通用名称的证书,因为该名称将与服务器名称逐字比较。