3.6.1 加密連線支援

本節描述 C 應用程式如何使用 C API 功能來進行加密連線。預設情況下,如果伺服器支援加密連線,MySQL 程式會嘗試使用加密連線,如果無法建立加密連線,則會回退到未加密的連線(請參閱設定 MySQL 使用加密連線)。對於需要超出預設行為來控制如何建立加密連線的應用程式,C API 提供了以下功能

加密連線選項

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 1.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:用戶端允許使用 TLS 1.3 版連線的加密密碼套件清單。

  • MYSQL_OPT_TLS_VERSION:用戶端允許的加密協定。

MySQL 8.2 及更早版本提供了 mysql_ssl_set() 函式,但該函式已移除。請改用mysql_options()來指定憑證和金鑰檔案、加密密碼等。

強制加密連線

mysql_options()選項(例如 SSL 憑證和金鑰檔案)用於在有此類連線可用時建立加密連線,但不會強制要求所取得的連線必須加密。若要強制要求加密連線,請使用下列技術

  1. 根據需要呼叫mysql_options(),以提供適當的 SSL 參數(憑證和金鑰檔案、加密密碼等)。

  2. 呼叫mysql_options()以傳遞 MYSQL_OPT_SSL_MODE 選項,並將值設定為 SSL_MODE_REQUIRED 或更嚴格的選項值之一。

  3. 呼叫mysql_real_connect()以連線到伺服器。如果無法取得加密連線,則呼叫將會失敗;請使用錯誤結束。

提高加密連線的安全性

為了提高相對於預設加密所提供的安全性,用戶端可以提供與伺服器使用的憑證相符的 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 憑證和金鑰)。此類自我簽署憑證不包含伺服器名稱作為通用名稱值。

主機名稱身分驗證也不適用於使用萬用字元指定通用名稱的憑證,因為該名稱會與伺服器名稱逐字比較。