Oracle Secure Sockets Layer - Amazon Relational Database Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Oracle Secure Sockets Layer

您可以在與資料庫執行個體相關聯的選項群組中新增 Oracle SSL 選項,就能對 RDS for Oracle 資料庫執行個體啟用 SSL 加密。Amazon RDS 會使用第二個連接埠 (依 Oracle 要求) 作為 SSL 連線用途。此方法可讓資料庫執行個體與 SQL*Plus 之間同時進行純文字和 SSL 加密的通訊。例如,您可以使用連接埠搭配純文字通訊與 VPC 內的其他資源通訊,同時使用連接埠搭配 SSL 加密的通訊與 VPC 外部的資源通訊。

注意

您可以在相同的 RDS for Oracle 資料庫執行個體上使用 SSL 或原生網路加密 (NNE),但不能同時使用這兩者。如果您使用 SSL 加密,請務必關閉任何其他連線加密。如需詳細資訊,請參閱 Oracle 原生網路加密

SSL/TLS 和 NNE 不再是 Oracle 進階安全性的一部分。您可以對下列 Oracle 資料庫版本的所有版本使用 SSL 加密:

  • Oracle Database 21c (21.0.0)

  • Oracle 資料庫 19c (19.0.0)

Oracle SSL 選項的 TLS 版本

Amazon RDS for Oracle 現已支援 Transport Layer Security (TLS) 版本 1.0 和 1.2。新增 Oracle SSL 選項時,請明確地將 SQLNET.SSL_VERSION 設為有效值。此選項設定允許下列值:

  • "1.0" – 用戶端只能使用 TLS 1.0 版連線至資料庫執行個體。若為現有的 Oracle SSL 選項,SQLNET.SSL_VERSION 會自動設為 "1.0"。您可以視需要變更此設定。

  • "1.2"– 用戶端只能使用 TLS 1.2 來連線至資料庫執行個體。

  • "1.2 or 1.0"– 用戶端可以使用 TLS 1.2 或 1.0 來連線至資料庫執行個體。

Oracle SSL 選項的密碼套件

Amazon RDS for Oracle 支援多個 SSL 密碼套件。根據預設,Oracle SSL 選項設定為使用 SSL_RSA_WITH_AES_256_CBC_SHA 密碼套件。若要指定在 SSL 連線上使用不同的密碼套件,請使用 SQLNET.CIPHER_SUITE 選項設定。

下表總結列出所有版本的 Oracle 資料庫 19c 和 21c 中對於 Oracle 的 RDS 版本的 SSL 支援。

密碼套件 (SQLNET.CIPHER_SUITE) TLS 版本支援 (SQLNET.SSL_VERSION) FIPS 支援 FedRAMP 合規
SSL_RSA_WITH_AES_256_CBC_SHA (預設) 1.0 和 1.2
SSL_RSA_WITH_AES_256_CBC_SHA256 1.2
SSL_RSA_WITH_AES_256_GCM_SHA384 1.2
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 1.2
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 1.2
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 1.2
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 1.2
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 1.2
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 1.2

FIPS 支援

RDS for Oracle 可讓您針對 140-2 使用美國聯邦資訊處理標準 (FIPS)。FIPS 140-2 是定義加密模組安全性要求的美國政府標準。您可以針對 Oracle SSL 選項,將設定 FIPS.SSLFIPS_140 設為 TRUE,來開啟 FIPS 標準。針對 SSL 設定 FIPS 140-2 時,密碼編譯程式庫會在用戶端與 RDS for Oracle 資料庫執行個體之間加密資料。

用戶端必須使用符合 FIPS 規定的密碼套件。建立連線時,用戶端和 RDS for Oracle 資料庫執行個體會協商來回傳輸訊息時所使用的密碼套件。Oracle SSL 選項的密碼套件 中的資料表會顯示適用於每個 TLS 版本的 FIPS 相容 SSL 密碼套件。如需詳細資訊,請參閱 Oracle 資料庫文件中的 Oracle 資料庫 FIPS 140-2 設定

新增 SSL 選項

若要使用 SSL,您的 RDS for Oracle 資料庫執行個體必須與包含 SSL 選項的選項群組建立關聯。

將 SSL 選項新增至選項群組
  1. 建立新的選項群組,或識別現有的選項群組,以便在其中新增 SSL 選項。

    如需建立選項群組的相關資訊,請參閱建立選項群組

  2. SSL 選項新增至選項群組。

    如果您只想針對 SSL 連線使用經 FIPS 驗證的密碼套件,請將選項 FIPS.SSLFIPS_140 設定為 TRUE。如需 FIPS 標準的相關資訊,請參閱 FIPS 支援

    如需將選項新增至選項群組的相關資訊,請參閱將選項新增至選項群組

  3. 建立新的 RDS for Oracle 資料庫執行個體,將其與選項群組建立關聯,或修改 RDS for Oracle 資料庫執行個體,使其與選項群組建立關聯。

    如需建立資料庫執行個體的相關資訊,請參閱 建立 Amazon RDS 資料庫執行個體

    如需修改資料庫執行個體的相關資訊,請參閱 修改 Amazon RDS 資料庫執行個體

將 SSL 選項新增至選項群組
  1. 建立新的選項群組,或識別現有的選項群組,以便在其中新增 SSL 選項。

    如需建立選項群組的相關資訊,請參閱建立選項群組

  2. SSL 選項新增至選項群組。

    指定下列選項設定:

    • Port – SSL 連接埠號碼

    • VpcSecurityGroupMemberships – 已啟用選項的 VPC 安全群組

    • SQLNET.SSL_VERSION – 用戶端可用來連線至資料庫執行個體的 TLS 版本

    例如,下列 AWS CLI 指令會將SSL選項新增至名為的選項群組ora-option-group

    範例

    對於LinuxmacOS、或Unix:

    aws rds add-option-to-option-group --option-group-name ora-option-group \ --options 'OptionName=SSL,Port=2484,VpcSecurityGroupMemberships="sg-68184619",OptionSettings=[{Name=SQLNET.SSL_VERSION,Value=1.0}]'

    在 Windows 中:

    aws rds add-option-to-option-group --option-group-name ora-option-group ^ --options 'OptionName=SSL,Port=2484,VpcSecurityGroupMemberships="sg-68184619",OptionSettings=[{Name=SQLNET.SSL_VERSION,Value=1.0}]'
  3. 建立新的 RDS for Oracle 資料庫執行個體,將其與選項群組建立關聯,或修改 RDS for Oracle 資料庫執行個體,使其與選項群組建立關聯。

    如需建立資料庫執行個體的相關資訊,請參閱 建立 Amazon RDS 資料庫執行個體

    如需修改資料庫執行個體的相關資訊,請參閱 修改 Amazon RDS 資料庫執行個體

設定 SQL*Plus 以使用 SSL 搭配 RDS for Oracle 資料庫執行個體

在可以連線至使用 Oracle SSL 選項的 RDS for Oracle 資料庫執行個體之前,您必須先設定 SQL*Plus,然後才能連線。

注意

若要允許從適當的用戶端存取資料庫執行個體,請確定您的安全群組已正確設定。如需更多詳細資訊,請參閱 使用安全群組控制存取。此外,這些指示僅適用於 SQL*Plus 和其他直接使用 Oracle 主目錄的用戶端。如需了解 JDBC 連線,請參閱 設定透過 JDBC 的 SSL 連線

設定 SQL*Plus 以使用 SSL 連線至 RDS for Oracle 資料庫執行個體
  1. ORACLE_HOME 環境變數設為 Oracle 主目錄的位置。

    Oracle 主目錄的路徑取決於您的安裝。下列範例設定 ORACLE_HOME 環境變數。

    prompt>export ORACLE_HOME=/home/user/app/user/product/19.0.0/dbhome_1

    如需有關設定 Oracle 環境變數的資訊,請參閱 Oracle 文件中的 SQL*Plus 環境變數,以及您的作業系統適用的 Oracle 安裝指南。

  2. $ORACLE_HOME/lib 附加至 LD_LIBRARY_PATH 環境變數。

    下列範例設定 LD_LIBRARY_PATH 環境變數。

    prompt>export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
  3. $ORACLE_HOME/ssl_wallet 建立 Oracle 錢包的目錄。

    下列範例建立 Oracle 錢包目錄。

    prompt>mkdir $ORACLE_HOME/ssl_wallet
  4. 下載適用於所有人的憑證組合 .pem 檔案, AWS 區域 並將檔案放在 ssl_wallet 目錄中。如需相關資訊,請參閱

  5. $ORACLE_HOME/network/admin 目錄中,修改或建立 tnsnames.ora 檔案,並包含下列項目。

    net_service_name = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCPS) (HOST = endpoint) (PORT = ssl_port_number) ) ) (CONNECT_DATA = (SID = database_name) ) (SECURITY = (SSL_SERVER_CERT_DN = "C=US,ST=Washington,L=Seattle,O=Amazon.com,OU=RDS,CN=endpoint") ) )
  6. 在相同的目錄中,修改或建立 sqlnet.ora 檔案,並加入下列參數。

    注意

    若要透過 TLS 安全連線與實體之間進行通訊,Oracle 需要擁有必要憑證的錢包以進行身分驗證。您可以使用 Oracle 的 ORAPKI 公用程式來建立並維護 Oracle 錢包,如步驟 7 所示。如需詳細資訊,請參閱 Oracle 文件中的使用 ORAPKI 設定 Oracle 錢包

    WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = $ORACLE_HOME/ssl_wallet))) SSL_CLIENT_AUTHENTICATION = FALSE SSL_VERSION = 1.0 SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA) SSL_SERVER_DN_MATCH = ON
    注意

    若資料庫執行個體支援,您可將 SSL_VERSION 設為較高的值。

  7. 執行下列命令以建立 Oracle 公事包。

    prompt>orapki wallet create -wallet $ORACLE_HOME/ssl_wallet -auto_login_only
  8. 使用 OS 公用程式,將 .pem 服務包檔案中的每個憑證解壓縮至個別的 .pem 檔案中。

  9. 使用不同的orapki命令將每個憑證新增至您的公事包,並以 .pem 檔案的絕對檔案名稱取代certificate-pem-file

    prompt>orapki wallet add -wallet $ORACLE_HOME/ssl_wallet -trusted_cert -cert certificate-pem-file -auto_login_only

    如需詳細資訊,請參閱 輪換您的 SSL/TLS 憑證

使用 SSL 連線至 RDS for Oracle 資料庫執行個體

依先前所述將 SQL*Plus 設定為使用 SSL 之後,即可採用 SSL 選項連線至 RDS for Oracle 資料庫執行個體。(選用) 您可以先匯出指向包含 tnsnames.ora 和 sqlnet.ora 檔案目錄的 TNS_ADMIN 值。如此將確保 SQL*Plus 可一直找到這些檔案。以下範例將匯出 TNS_ADMIN 值。

export TNS_ADMIN = ${ORACLE_HOME}/network/admin

連線到資料庫執行個體。例如,您可以使用 SQL*Plus 和 tnsnames.ora 檔案中的 <net_service_name> 進行連線。

sqlplus mydbuser@net_service_name

您也可以使用以下命令,只利用 SQL*Plus 連線至資料庫執行個體,而不需要用到 tnsnames.ora 檔案。

sqlplus 'mydbuser@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCPS)(HOST = endpoint) (PORT = ssl_port_number))(CONNECT_DATA = (SID = database_name)))'

您也可以不使用 SSL 就連線至 RDS for Oracle 資料庫執行個體。例如,以下命令透過純文字連接埠來連線至資料庫執行個體,而不使用 SSL 加密。

sqlplus 'mydbuser@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = endpoint) (PORT = port_number))(CONNECT_DATA = (SID = database_name)))'

如果您要禁止傳輸控制通訊協定 (TCP) 連接埠存取,請建立不含 IP 地址傳入的安全群組,並新增至執行個體。如此新增之後就會關閉透過 TCP 連接埠的連線,但仍允許透過 SSL 連接埠的連線 (從 SSL 選項安全群組所允許範圍內的 IP 地址指定)。

設定透過 JDBC 的 SSL 連線

若要透過 JDBC 使用 SSL 連線,您必須建立金鑰存放區、信任 Amazon RDS 根 CA 憑證,以及使用如下指定的程式碼片段。

要創建 JKS 格式的密鑰庫,可以使用以下命令。如需有關建立金鑰儲存庫的詳細資訊,請參閱 Oracle 說明文件中的 < 建立金鑰儲存庫 >。有關參考信息,請參閱 Java 平台中的密鑰工具,標準版工具參考

keytool -genkey -alias client -validity 365 -keyalg RSA -keystore clientkeystore

請執行下列步驟來信任 Amazon RDS 根 CA 憑證。

信任 Amazon RDS 根 CA 憑證
  1. 下載適用於所有人的憑證組合 .pem 檔案, AWS 區域 並將檔案放在 ssl_wallet 目錄中。

    如需有關下載憑證的詳細資訊,請參閱

  2. 使用 OS 公用程式,將 .pem 檔案中的每個憑證解壓縮至不同的檔案。

  3. 使用單獨的openssl命令將每個證書轉換為 .der 格式,用證書 .pem 文件的名稱替換為證書 .pem 文件的名稱(不帶 .pem 擴展名)。

    openssl x509 -outform der -in certificate-pem-file.pem -out certificate-pem-file.der
  4. 使用下列命令將每個憑證匯入金鑰儲存庫。

    keytool -import -alias rds-root -keystore clientkeystore.jks -file certificate-pem-file.der

    如需詳細資訊,請參閱 輪換您的 SSL/TLS 憑證

  5. 確認金鑰存放區已成功建立。

    keytool -list -v -keystore clientkeystore.jks

    在提示出現時,請輸入金鑰存放區密碼。

下列程式碼範例示範如何使用 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 = "dns-name-provided-by-amazon-rds"; private static final Integer SSL_PORT = "ssl-option-port-configured-in-option-group"; private static final String DB_SID = "oracle-sid"; private static final String DB_USER = "user-name"; private static final String DB_PASSWORD = "password"; // This key store has only the prod root ca. private static final String KEY_STORE_FILE_PATH = "file-path-to-keystore"; private static final String KEY_STORE_PASS = "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("user", DB_USER); properties.put("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 no exception, that means handshake has passed, and an SSL connection can be opened } }
注意

指定此處所顯示提示以外的密碼,作為安全最佳實務。

使用 SSL 連線強制執行 DN 比對

您可以使用 Oracle 參數 SSL_SERVER_DN_MATCH,以強制資料庫伺服器的辨別名稱 (DN) 比對其服務名稱。如果強制使用比對驗證,則 SSL 會確保憑證來自伺服器。如果不強制使用比對驗證,則 SSL 會執行檢查,但無論是否符合都允許連線。如果您不強制執行匹配,則允許服務器可能偽造其身份。

若要強制使用 DN 比對,請新增 DN 比對屬性,並使用如下指定的連線字串。

將此屬性新增至用戶端連線,以強制使用 DN 比對。

properties.put("oracle.net.ssl_server_dn_match", "TRUE");

使用下列連線字串,即可在使用 SSL 時強制使用 DN 比對。

final String connectionString = String.format( "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=%s)(PORT=%d))" + "(CONNECT_DATA=(SID=%s))" + "(SECURITY = (SSL_SERVER_CERT_DN = \"C=US,ST=Washington,L=Seattle,O=Amazon.com,OU=RDS,CN=%s\")))", DB_SERVER_NAME, SSL_PORT, DB_SID, DB_SERVER_NAME);

對 SSL 連線進行疑難排解

您可能會查詢資料庫並收到 ORA-28860 錯誤。

ORA-28860: Fatal SSL error 28860. 00000 - "Fatal SSL error" *Cause: An error occurred during the SSL connection to the peer. It is likely that this side sent data which the peer rejected. *Action: Enable tracing to determine the exact cause of this error.

當用戶端嘗試使用伺服器不支援的 TLS 版本進行連線時,就會發生這個錯誤。若要避免此錯誤,請編輯 sqlnet.ora 並將 SSL_VERSION 設定為正確的 TLS 版本。如需詳細資訊,請參閱「My Oracle 支援」中的 My Oracle 支援文件 2748438.1