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 協定 (直到 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_ssl_set()函數可以用作方便的常式,等同於一組mysql_options()呼叫,這些呼叫會指定憑證和金鑰檔案、加密密碼等等。請參閱第 5.4.82 節「mysql_ssl_set()」

強制加密連線

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

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

  2. 呼叫mysql_options(),以使用 SSL_MODE_REQUIRED 值或更嚴格的選項值之一來傳遞 MYSQL_OPT_SSL_MODE 選項。

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

提高加密連線的安全性

為了提高相對於預設加密所提供的安全性,用戶端可以提供與伺服器使用的 CA 憑證相符的 CA 憑證,並啟用主機名稱身分驗證。如此一來,伺服器和用戶端會將其信任置於相同的 CA 憑證中,而用戶端會驗證其連線的主機是否為預期的主機

  • 若要指定 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 選項。

注意

使用SSL_MODE_VERIFY_IDENTITY 的主機名稱身分驗證不適用於伺服器自動建立的自我簽署憑證,或使用 mysql_ssl_rsa_setup 手動建立的自我簽署憑證 (請參閱使用 MySQL 建立 SSL 和 RSA 憑證和金鑰)。此類自我簽署憑證不包含伺服器名稱作為通用名稱值。

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