27.7.14 C API 对加密连接的支持
本节介绍 C 应用程序如何使用 C API 功能进行加密连接。默认情况下,如果服务器支持加密连接,则 MySQL 程序会尝试使用加密进行连接;如果无法构建加密连接,则回退到未加密连接(请参见第 6.3.1 节“配置 MySQL 以使用加密连接”)。对于那些需要控制超出默认行为的应用程序的应用程序,如何构建加密连接,C API 提供了以下功能:
-
mysql_options()函数使应用程序可以在调用mysql_real_connect()之前设置适当的 SSL/TLS 选项。例如,要要求使用加密连接,请参见加强加密连接。
-
mysql_get_ssl_cipher()功能使应用程序可以在构建连接后确定该连接是否使用加密。返回值
NULL
table 示未使用加密。非NULL
返回值 table 示已加密的连接,并命名了加密密码。参见第 27.7.6.34 节“ mysql_get_ssl_cipher()”。
C 用于加密连接的 API 选项
mysql_options()提供以下选项来控制对加密连接的使用。有关选项的详细信息,请参见第 27.7.6.50 节“ mysql_options()”。
-
MYSQL_OPT_SSL_CA
:证书颁发机构(CA)证书文件的路径名。如果使用此选项,则必须指定服务器使用的相同证书。 -
MYSQL_OPT_SSL_CAPATH
:包含受信任的 SSL CA 证书文件的目录的路径名。 -
MYSQL_OPT_SSL_CERT
:Client 端公共密钥证书文件的路径名。 -
MYSQL_OPT_SSL_CIPHER
:SSL 加密的允许密码列 table。 -
MYSQL_OPT_SSL_CRL
:包含证书吊销列 table 的文件的路径名。 -
MYSQL_OPT_SSL_CRLPATH
:包含证书吊销列 table 文件的目录的路径名。 -
MYSQL_OPT_SSL_KEY
:Client 端私钥文件的路径名。 -
MYSQL_OPT_SSL_MODE
:连接安全状态。 -
MYSQL_OPT_SSL_VERIFY_SERVER_CERT
:是否对服务器证书的“公用名”值执行主机名身份验证。 -
MYSQL_OPT_TLS_VERSION
:Client 端允许的加密协议。
mysql_ssl_set()可用作便利例程,它等效于一组mysql_options()调用,这些调用指定了证书和密钥文件,加密密码等。参见第 27.7.6.73 节“ mysql_ssl_set()”。
加强加密连接
mysql_options()信息(例如 SSL 证书和密钥文件)的选项用于构建加密连接(如果可用),但不强制要求对获得的连接进行加密。要要求加密的连接,请使用以下技术:
-
根据需要调用mysql_options(),以提供适当的 SSL 参数(证书和密钥文件,加密密码等)。
-
调用mysql_options()以传递值为
SSL_MODE_REQUIRED
或限制性更强的选项值之一的MYSQL_OPT_SSL_MODE
选项。 -
呼叫mysql_real_connect()以连接到服务器。如果无法获得加密连接,则呼叫失败;否则,呼叫将失败。错误退出。
改善加密连接的安全性
为了获得相对于默认加密所提供的安全性更高的安全性,Client 端可以提供与服务器使用的证书相匹配的 CA 证书,并启用主机名身份验证。通过这种方式,服务器和 Client 端将他们的信任放在相同的 CA 证书中,并且 Client 端验证其连接的主机是否是预期的主机:
-
要指定 CA 证书,请调用mysql_options()传递
MYSQL_OPT_SSL_CA
(或MYSQL_OPT_SSL_CAPATH
)选项,并调用mysql_options()传递值为SSL_MODE_VERIFY_CA
的MYSQL_OPT_SSL_MODE
选项。 -
要同时启用主机名身份验证,请调用mysql_options()以将值
SSL_MODE_VERIFY_IDENTITY
而不是SSL_MODE_VERIFY_CA
传递给MYSQL_OPT_SSL_MODE
选项。
Note
使用SSL_MODE_VERIFY_IDENTITY
进行的主机名身份验证不适用于服务器自动创建的或使用mysql_ssl_rsa_setup手动创建的自签名证书(请参阅第 6.3.3.1 节“使用 MySQL 创建 SSL 和 RSA 证书和密钥”)。此类自签名证书不包含服务器名称作为“通用名称”值。
主机名身份验证也不适用于使用通配符指定“公用名”的证书,因为该名会与服务器名进行逐字比较。