Oracle Secure Sockets Layer - Amazon Relational Database Service

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

Oracle Secure Sockets Layer

若要為 Oracle 資料庫執RDS行個體啟用SSL加密,請將 Oracle 選SSL項新增至與資料庫執行個體關聯的選項群組。Amazon 根據 Oracle 的要求RDS使用第二個連接埠進行SSL連接。這種方法允許在資料庫執行個體和 SQL *Plus 之間同時進行純文字和SSL加密通訊。例如,您可以使用具有純文本通信的端口與其他資源進行通信,VPC同時使用具有 SSL-encrypted 通信的端口與外部的資源進行通信。VPC

注意

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

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

  • Oracle Database 21c (21.0.0)

  • Oracle 資料庫 19c (19.0.0)

TLS適用於 Oracle 選SSL項的版本

Amazon RDS 適用於甲骨文支持傳輸層安全(TLS)1.0 和 1.2 版。當您新增 Oracle SSL 選項時,請SQLNET.SSL_VERSION明確設定為有效值。此選項設定允許下列值:

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

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

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

甲骨SSL文選項的密碼套件

Amazon RDS 的甲骨文支持多個SSL加密套件。默認情況下,Oracle SSL 選項配置為使用SSL_RSA_WITH_AES_256_CBC_SHA密碼套件。若要指定不同的加密套件以透過SSL連線使用,請使用選SQLNET.CIPHER_SUITE項設定。

您可以為指定多個值SQLNET.CIPHER_SUITE。如果您的資料庫執行個體之間有資料庫連結,並決定更新您的加密套件,則此技術非常有用。

下表摘要列出所有版本「Oracle RDS 資料庫 19c」和「21c」對 Oracle 的SSL支援。

密碼套件 (SQLNET. CIPHER_SUITE) TLS版本支援 (SQLNET. SSL_VERSION) FIPS支持 RAMP符合美聯儲
SSL_ RSA _ _ WITH _ AES _ (預設值CBC) SHA 1.0 和 1.2
SSL_ RSA WITH _ AES _ _ CBC SHA256 1.2
SSL_ RSA WITH _ AES _ _ GCM SHA384 1.2
TLS_ ECDHE _ RSA _ WITH _ AES _ _ GCM SHA384 1.2
TLS_ ECDHE RSA _ WITH _ AES _ _ GCM SHA256 1.2
TLS_ ECDHE _ RSA _ WITH _ AES _ _ CBC SHA384 1.2
TLS_ ECDHE RSA _ WITH _ AES _ _ CBC SHA256 1.2
TLS_ ECDHE _ RSA _ WITH _ AES _ _ CBC SHA 1.2
TLS_ ECDHE RSA _ WITH _ AES _ _ CBC SHA 1.2

FIPS支持

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

用戶端必須使用符FIPS合標準的加密套件。建立連線時,用戶端和 Oracle RDS 資料庫執行個體會協商在來回傳送訊息時要使用的加密套件。中的表格甲骨SSL文選項的密碼套件顯示了每個FIPS版本的相容SSL加密套件TLS。如需詳細資訊,請參閱 Oracle 資料庫說明文件中的 Oracle 資料庫 FIPS 140-2 設定值

添加選SSL項

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

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

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

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

    如果您只想要使用FIPS經過驗證的加密套件進行SSL連線,請將選項FIPS.SSLFIPS_140設定為。TRUE若要取得有關FIPS標準的資訊,請參閱FIPS支持

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

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

    如需建立資料庫執行個體的相關資訊,請參閱 建立 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為 Oracle 資料庫執行個體建立新的執行個體,並將選項群組與其關聯,或修改 Oracle 資料庫執RDS行個體的執行個體,以建立選項群組與其關聯。

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

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

將 SQL *Plus 設定為SSL與 Oracle 資料庫執RDS行個體搭配使用

連線前,您必須先設定 SQL *Plus,才能連線到使用 Oracle SSL 選項的RDS適用 Oracle 資料庫執行個體。

注意

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

若要將 SQL *Plus 設定為用於連線SSL至適用RDS於 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 目錄中。如需相關資訊,請參閱 使用SSL/TLS來加密資料庫執行個體或叢集集的連線

  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證書

使用連接到RDS適用於 Oracle 資料庫執行個體的 SSL

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

export TNS_ADMIN = ${ORACLE_HOME}/network/admin

連線到資料庫執行個體。例如,您可以使用 SQL *Plus 和 <net_service_name> 在一個 tnsname .ora 文件中。

sqlplus mydbuser@net_service_name

您也可以使用下列命令,在不使用 tnsnames.ora 檔案的情況下,使用 SQL *Plus 連線至資料庫執行個體。

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

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

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

如果要關閉「傳輸控制通訊協定」(TCP) 連接埠存取,請建立沒有 IP 位址擷取的安全群組,並將其新增至執行個體。此新增功能會關閉透過連接TCP埠的連線,同時仍允許透過從SSL選項安全性群組允許的範圍內的 IP 位址指定的連接SSL埠進行連線。

設定SSL連線 JDBC

若要透過SSL連線使用JDBC,您必須建立金鑰儲存庫、信任 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 目錄中。

    如需有關下載憑證的詳細資訊,請參閱使用SSL/TLS來加密資料庫執行個體或叢集集的連線

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

  3. 使用單獨的openssl命令將每個證書轉換為 .der 格式,替換 certificate-pem-file 具有憑證 .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

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

下列程式碼範例會示範如何使用來設定SSL連線JDBC。

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 } }
注意

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

透過連線強制執行 DN 相符項目 SSL

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

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

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

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

使用時,請使用下列連接字串來強制 DN 比對SSL。

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