本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
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 選項新增至選項群組
-
建立新的選項群組,或識別現有的選項群組,以便在其中新增
SSL
選項。如需建立選項群組的相關資訊,請參閱建立選項群組。
-
將
SSL
選項新增至選項群組。如果您只想針對 SSL 連線使用經 FIPS 驗證的密碼套件,請將選項
FIPS.SSLFIPS_140
設定為TRUE
。如需 FIPS 標準的相關資訊,請參閱 FIPS 支援。如需將選項新增至選項群組的相關資訊,請參閱將選項新增至選項群組。
-
建立新的 RDS for Oracle 資料庫執行個體,將其與選項群組建立關聯,或修改 RDS for Oracle 資料庫執行個體,使其與選項群組建立關聯。
如需建立資料庫執行個體的相關資訊,請參閱 建立 Amazon RDS 資料庫執行個體。
如需修改資料庫執行個體的相關資訊,請參閱 修改 Amazon RDS 資料庫執行個體。
將 SSL 選項新增至選項群組
-
建立新的選項群組,或識別現有的選項群組,以便在其中新增
SSL
選項。如需建立選項群組的相關資訊,請參閱建立選項群組。
-
將
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}]'
-
-
建立新的 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 資料庫執行個體
-
將
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 安裝指南。 -
將
$ORACLE_HOME/lib
附加至LD_LIBRARY_PATH
環境變數。下列範例設定 LD_LIBRARY_PATH 環境變數。
prompt>export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
-
在
$ORACLE_HOME/ssl_wallet
建立 Oracle 錢包的目錄。下列範例建立 Oracle 錢包目錄。
prompt>mkdir $ORACLE_HOME/ssl_wallet
-
下載適用於所有人的憑證組合 .pem 檔案, AWS 區域 並將檔案放在 ssl_wallet 目錄中。如需相關資訊,請參閱。
-
在
$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
") ) ) -
在相同的目錄中,修改或建立 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
設為較高的值。 -
執行下列命令以建立 Oracle 公事包。
prompt>orapki wallet create -wallet $ORACLE_HOME/ssl_wallet -auto_login_only
-
使用 OS 公用程式,將 .pem 服務包檔案中的每個憑證解壓縮至個別的 .pem 檔案中。
-
使用不同的
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 說明文件中的 < 建立金鑰儲存庫
keytool -genkey -alias
client
-validity365
-keyalgRSA
-keystoreclientkeystore
請執行下列步驟來信任 Amazon RDS 根 CA 憑證。
信任 Amazon RDS 根 CA 憑證
-
下載適用於所有人的憑證組合 .pem 檔案, AWS 區域 並將檔案放在 ssl_wallet 目錄中。
-
使用 OS 公用程式,將 .pem 檔案中的每個憑證解壓縮至不同的檔案。
-
使用單獨的
openssl
命令將每個證書轉換為 .der 格式,用證書 .pem 文件的名稱替換為證書 .pem 文件
的名稱(不帶 .pem 擴展名)。openssl x509 -outform der -in
certificate-pem-file
.pem -outcertificate-pem-file
.der -
使用下列命令將每個憑證匯入金鑰儲存庫。
keytool -import -alias rds-root -keystore
clientkeystore.jks
-filecertificate-pem-file
.der如需詳細資訊,請參閱 輪換您的 SSL/TLS 憑證。
-
確認金鑰存放區已成功建立。
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