AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
如何使用 SSL 連線成功連線至 Amazon RDS 執行個體?
我想使用 Secure Socket Layer (SSL) 連線來連線至 Amazon Relational Database Service (Amazon RDS) 資料庫執行個體。
簡短說明
若要加密與執行 MySQL、MariaDB、Microsoft SQL Server、Oracle 或 PostgreSQL 之資料庫執行個體的連線,請使用應用程式中的 SSL 或 Transport Layer Security (TLS)。SSL/TLS 連線可提供一層安全性,因為連線會加密在用戶端和資料庫執行個體之間傳輸的資料。伺服器憑證可提供一層額外的安全性,因為伺服器憑證會驗證是否正在與 Amazon RDS 資料庫執行個體進行連線。
當您佈建資料庫執行個體時,Amazon RDS 會建立 SSL 憑證並在執行個體上安裝憑證。由憑證認證機構 (CA) 簽署這些憑證。SSL 憑證包括作為 SSL 憑證一般名稱的資料庫執行個體端點,以保護執行個體免受詐騙攻擊。由 Amazon RDS 建立的 SSL 憑證是受信任的根實體,在大多數情況下都可以使用。但是,如果您的應用程式不接受憑證鏈,則憑證可能會失敗。在這種情況下,請使用中繼憑證連線到 AWS 區域。例如,當您使用 SSL 連線到 AWS GovCloud (美國) 區域時,您必須使用中繼憑證。
您可以從 AWS 信任服務下載包含所有區域之中繼憑證和根憑證的憑證套件。如果應用程式位於 Microsoft Windows,且需要 PKCS7 檔案,則可以從 Amazon 信任服務下載 PKCS7 憑證套件。此套件包含中繼憑證和根憑證。
解決方法
每個資料庫引擎均有自己的程序來實作 SSL/TLS。若要實作資料庫叢集的 SSL/TLS 連線,請根據資料庫引擎使用下列其中一種方法。
Amazon RDS for Oracle
針對 Amazon RDS for Oracle 執行個體,若要開啟 SSL 模式,請在自訂選項群組中新增 SSL 選項。
Oracle 的 RDS 支援 TLS 第 1.0 版和第 1.2 版。若要使用 Oracle SSL 選項,請在選項群組中使用 SQLNET.SSL_VERSION 選項設定。此選項設定允許下列值:
- 「1.0」 - 用戶端僅能使用 TLS 1.0 連線到資料庫執行個體。
- 「1.2」 - 用戶端僅能使用 TLS 1.2 連線到資料庫執行個體。
- 「1.2 或 1.0」 - 用戶端可以使用 TLS 1.2 或 1.0 連線到資料庫執行個體。
對於現有的 Oracle SSL 選項,SQLNET.SSL_VERSION 會自動設定為「1.0」。如有必要,您可以變更設定。
您必須先將 SQL*Plus 用戶端設定為使用 SSL,然後才能連線到使用 Oracle SSL 選項的 Oracle 資料庫執行個體。若要透過 JDBC 使用 SSL 連線,您必須建立金鑰存放區、信任 Amazon RDS 根 CA 憑證,然後設定 SSL 連線。
使用 JDBC 設定 SSL 連線的範例程式碼:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; public class OracleSslConnectionTest { private static final String DB_SERVER_NAME = "example-dns"; private static final Integer SSL_PORT = "example-ssl-option-port-in-option-group"; private static final String DB_SID = "example-oracle-sid"; private static final String DB_USER = "example-username"; private static final String DB_PASSWORD = "example-password"; // This key store has only the prod root ca. private static final String KEY_STORE_FILE_PATH = "example-file-path-to-keystore"; private static final String KEY_STORE_PASS = "example-keystore-password"; public static void main(String[] args) throws SQLException { final Properties properties = new Properties(); final String connectionString = String.format( "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=%s)(PORT=%d))(CONNECT_DATA=(SID=%s)))", DB_SERVER_NAME, SSL_PORT, DB_SID); properties.put("example-username", DB_USER); properties.put("example-password", DB_PASSWORD); properties.put("oracle.jdbc.J2EE13Compliant", "true"); properties.put("javax.net.ssl.trustStore", KEY_STORE_FILE_PATH); properties.put("javax.net.ssl.trustStoreType", "JKS"); properties.put("javax.net.ssl.trustStorePassword", KEY_STORE_PASS); final Connection connection = DriverManager.getConnection(connectionString, properties); // If there is no exception, it means that an SSL connection can be opened } }
在您使用 SSL 連線到 Oracle 執行個體的 RDS 之前,請檢查下列項目:
- 下載 RDS 根憑證並將其新增至公事包檔案中。將此檔案儲存在 sqlnet.ora 檔案中 WALLET_LOCATION 參數指定的目錄中。
- 您的 TNS 項目中有正確的 SSL 連接埠號碼。
- Amazon RDS 安全群組設定為允許透過 SSL 連接埠從您的機器傳入連線。
- 已適當設定防火牆或安全政策,以允許來自 Amazon RDS SSL 連接埠上的流量。
Amazon RDS for MariaDB
Amazon RDS for MariaDB 支援 TLS 第 1.0 版、第 1.1 版、第 1.2 版和第 1.3 版。在單向 TLS 連線中,於沒有用戶端憑證的情況下使用 TLS,僅能驗證伺服器。因此,僅能在單向進行驗證。但是,仍然能在雙向上進行加密。如需詳細資訊,請參閱 MariaDB 網站上的啟用 MariaDB 用戶端的單向 TLS。
透過伺服器憑證驗證,用戶端會驗證憑證是否屬於伺服器。如需詳細資訊,請參閱 MariaDB 網站上的伺服器憑證驗證。
若要使用 RDS 憑證啟動 MySQL 5.7 用戶端或更新版本,請執行類似下列內容的命令:
mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-mode=VERIFY_IDENTITY
若要使用 RDS 憑證啟動 MariaDB 用戶端,請執行類似下列內容的命令:
mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-verify-server-cert
若特定使用者或帳戶需要 SSL 連線,請根據 MariaDB 版本執行下列查詢:
ALTER USER 'test'@'%' REQUIRE SSL;
對於 MariaDB 第 10.5 版及更新版本的 RDS,如果已開啟效能結構描述,且應用程式已連接到資料庫執行個體,請檢查哪些連線使用 SSL/TLS:
MariaDB> SELECT id, user, host, connection_type FROM performance_schema.threads pst INNER JOIN information_schema.processlist isp ON pst.processlist_id = isp.id;
**注意:**如需有關效能結構描述的詳細資訊,請參閱 MariaDB 網站上的效能結構描述。
Amazon RDS for MySQL
MySQL 使用 OpenSSL 進行安全連線。如需詳細資訊,請參閱 Amazon RDS 上 MySQL 資料庫執行個體的 SSL/TLS 支援。
依預設,MySQL 用戶端程式會嘗試在伺服器支援加密連線時建立加密連線。如需其他安全性,請使用 --ssl-ca 參數參考包含作為一般名稱之資料庫執行個體端點的 SSL 憑證。SSL 憑證可保護執行個體免受詐騙攻擊。
若要使用 MySQL 5.7 及更新版本的 --ssl-ca 參數來啟動用戶端,請執行類似下列內容的命令:
mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-mode=VERIFY_IDENTITY
若特定使用者或帳戶需要 SSL 連線,請根據 MySQL 版本請執行類似下列內容的命令:
mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-verify-server-cert
對於 MySQL 5.7 及更新版本,請執行下列命令:
ALTER USER 'testuser'@'%' REQUIRE SSL;
對於 MySQL 第 5.7 版或 第 8.0 版的 RDS,如果已開啟效能結構描述,且應用程式已連接到資料庫執行個體,請檢查哪些連線使用 SSL/TLS:
mysql> SELECT id, user, host, connection_type FROM performance_schema.threads pst INNER JOIN information_schema.processlist isp ON pst.processlist_id = isp.id;
**注意:**如需有關效能結構描述的詳細資訊,請參閱 MariaDB 網站上的效能結構描述。
Amazon RDS for Microsoft SQL Server
若要使用 SSL 連線到您的 Microsoft SQL Server 資料庫執行個體的 RDS,您可以對所有連線強制使用 SSL 或加密特定連線。
若要加密來自其他 SQL 用戶端的連線,請將 encrypt=true 附加至連線字串。此字串可以作為選項或作為 GUI 工具中連線頁面上的屬性。
若要確認連線是否已加密,請執行下列查詢:
SELECT ENCRYPT_OPTION FROM SYS.DM_EXEC_CONNECTIONS WHERE SESSION_ID = @@SPID;
確認查詢是否針對 encrypt_option 傳回 true。
**注意:**若要為使用 JDBC 連線的用戶端啟用 SSL 加密,您可能需要將 RDS SQL 憑證新增至 Java CA 憑證 (cacerts) 存放區。若要執行此動作,請使用 keytool 公用程式。
Amazon RDS for PostgreSQL
Amazon RDS 支援 PostgreSQL 資料庫執行個體的 SSL 加密。如需詳細資訊,請參閱將 SSL 與 PostgreSQL 資料庫執行個體搭配使用。
在透過 SSL 連線到 PostgreSQL 資料庫執行個體的 RDS 之前,請完成下列步驟:
- 下載該憑證。
- 將憑證匯入至您的作業系統中。
如需詳細資訊,請參閱透過 SSL 連線到 PostgreSQL 資料庫執行個體。
若要參考憑證,請使用 sslrootcert 參數。例如,sslrootcert=rds-ssl-ca-cert.pem:
psql "host=myinstance.123456789012.rds-us-east-1.amazonaws.com port=5432 user=testuser dbname=testpg sslmode=verify-full sslrootcert=global-bundle.pem"
若要將 PostgreSQL 執行個體的 RDS 連線設定為使用 SSL,請在自訂參數群組中將 rds.force\ _ssl 設定為 1 (開啟)。依預設,此值設定為 0 (關閉)。
在您將 rds.force_ssl 設定為 1 (開啟) 時,系統會修改資料庫執行個體的 pg_hba.conf 檔案,以支援新的 SSL 組態。若要查看 pg_hba.conf 檔案的內容摘要,請使用 pg_hba_file_rules 視圖。如需詳細資訊,請參閱 PostgreSQL 網站上的 pg_hba_file_rules。
當您將 rds.force_ssl 設定為 0 (關閉) 時,pg_hba.conf 檔案看起來類似下列內容:
SELECT * FROM pg_hba_file_rules; line_number | type | database | user_name | address | netmask | auth_method | options | error -------------+-------+-------------------+------------+----------+---------+-------------+---------+------- 4 | local | {all} | {all} | | | md5 | | 10 | host | {all} | {rdsadmin} | samehost | | md5 | | 11 | host | {all} | {rdsadmin} | all | | reject | | 12 | host | {rdsadmin} | {all} | all | | reject | | 13 | host | {all} | {all} | all | | md5 | | 14 | host | {replication} | {all} | samehost | | md5 | | 15 | host | {rds_replication} | {all} | all | | md5 | | (7 rows)
當您將 rds.force_ssl 設定為 1 (開啟) 時,pg_hba.conf 檔案看起來類似下列內容:
SELECT * FROM pg_hba_file_rules; line_number | type | database | user_name | address | netmask | auth_method | options | error -------------+---------+-------------------+------------+----------+---------+-------------+---------+------- 4 | local | {all} | {all} | | | md5 | | 10 | host | {all} | {rdsadmin} | samehost | | md5 | | 11 | host | {all} | {rdsadmin} | all | | reject | | 12 | host | {rdsadmin} | {all} | all | | reject | | 13 | hostssl | {all} | {all} | all | | md5 | | 14 | host | {replication} | {all} | samehost | | md5 | | 15 | hostssl | {rds_replication} | {all} | all | | md5 | |
注意:在 rds.force_ssl 設定為 1 (開啟) 後,line_number (13) 的類型值可能會更新為 hostssl。
在執行個體上啟用 SSL 連線並啟動 PostgreSQL 執行個體的 RDS 連線之後,您會看到類似下列內容的訊息:
psql "host=myinstance.123456789012.rds-us-east-1.amazonaws.com port=5432 user=testuser dbname=testpg"
. . . SL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) Type "help" for help.
拒絕所有非 SSL 連線,並顯示下列訊息:
psql "host=myinstance.123456789012.rds-us-east-1.amazonaws.com port=5432 user=testuser dbname=testpg sslmode=disable"psql: FATAL: no pg_hba.conf entry for host "host.ip", user "testuser", database "testpg", SSL off
相關資訊
相關內容
已提問 2 年前
已提問 3 年前

