Amazon Relational Database Service
用户指南 (API 版本 2014-10-31)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

Oracle SSL

通过向与 Oracle 数据库实例关联的选项组添加 Oracle SSL 选项,可实现针对 Oracle 数据库实例的安全套接字层 (SSL) 加密。指定要用于使用 SSL 进行通信的端口。您必须如下节中所示配置 SQL*Plus。

通过向与数据库实例关联的选项组添加 Oracle SSL 选项,可实现针对 Oracle 数据库实例的 SSL 加密。Amazon RDS 根据 Oracle 需要对 SSL 连接使用第二个端口。此方法允许数据库实例与 SQL*Plus 之间能够同时进行明文通信和 SSL 加密通信。例如,您可使用用于明文通信的端口与 VPC 内的其他资源通信,同时使用用于 SSL 加密通信的端口与 VPC 外部的资源通信。

注意

您可以使用安全套接字层或本机网络加密,但不能同时使用二者。有关更多信息,请参阅 Oracle 本机网络加密

您可对下列 Oracle 数据库版本使用 SSL 加密:

  • 12.1.0.2:所有版本,包括 Standard Edition Two

  • 11.2.0.4:所有版本,Enterprise Edition

  • 11.2.0.4:版本 6 及更高版本、Standard Edition、Standard Edition One、Enterprise Edition

注意

您不能在同一实例上同时使用 SSL 和 Oracle 本机网络加密 (NNE)。如果您使用 SSL 加密,则必须禁用任何其他连接加密。

Oracle SSL 选项的 TLS 版本

Amazon RDS for Oracle 支持传输层安全性 (TLS) 版本 1.0 和 1.2。要使用 Oracle SSL 选项,必须使用 SQLNET.SSL_VERSION 选项设置。下面是此选项设置允许的值:

  • "1.0" – 客户端只能使用 TLS 1.0 连接到数据库实例。

  • "1.2" – 客户端只能使用 TLS 1.2 连接到数据库实例。

  • "1.2 or 1.0" – 客户端只能使用 TLS 1.2 或 1.0 连接到数据库实例。

要使用 Oracle SSL 选项,还需要 SQLNET.SSL_VERSION 选项设置:

  • 对于现有 Oracle SSL 选项,SQLNET.SSL_VERSION 自动设置为 "1.0"。您可以根据需要更改设置。

  • 在添加新的 Oracle SSL 选项时,必须明确将 SQLNET.SSL_VERSION 设置为有效值。

下表显示了不同的 Oracle 引擎版本支持的 TLS 选项设置。

Oracle 引擎版本 SQLNET.SSL_VERSION="1.0" SQLNET.SSL_VERSION="1.2" SQLNET.SSL_VERSION="1.2 或 1.0"

12.1.0.2 (所有版本)

支持

支持

支持

11.2.0.4 (Oracle EE)

支持

在 11.2.0.4.v8 和更高版本中支持

在 11.2.0.4.v8 和更高版本中支持

11.2.0.4 (Oracle SE1)

支持

不支持

不支持

11.2.0.4 (Oracle SE)

支持

不支持

不支持

配置 SQL*Plus 以将 SSL 用于 Oracle 数据库实例

您必须先配置 SQL*Plus,然后才能连接到使用 Oracle SSL 选项的 Oracle 数据库实例。

注意

这些说明适用于 SQL*Plus 和其他直接使用 Oracle 主目录的客户端。有关 JDBC 连接,请参阅设置通过 JDBC 的 SSL 连接

将 SQL*Plus 配置为使用 SSL 连接到 Oracle 数据库实例

  1. ORACLE_HOME 环境变量设置为 Oracle 主目录的位置。

    Oracle 主目录的路径取决于您的安装。以下示例设置 ORACLE_HOME 环境变量。

    prompt>export ORACLE_HOME=/home/user/app/user/product/12.1.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 wallet 创建一个目录。

    下面是一个创建 Oracle wallet 目录的示例。

    prompt>mkdir $ORACLE_HOME/ssl_wallet
  4. https://s3.amazonaws.com.cn/rds-downloads/rds-ca-2015-root.pem 下载 RDS CA 证书文件,然后将此文件放入 ssl_wallet 目录中。

    可在 https://s3-us-gov-west-1.amazonaws.com/rds-downloads/rds-ca-2012-us-gov-west-1.pem 上获得 AWS GovCloud (US) 的 RDS CA 证书文件。

  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 文件并包含下列参数。

    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
  7. 运行下列命令以创建 Oracle wallet。

    prompt>orapki wallet create -wallet $ORACLE_HOME/ssl_wallet -auto_login_only   prompt>orapki wallet add -wallet $ORACLE_HOME/ssl_wallet -trusted_cert -cert $ORACLE_HOME/ssl_wallet/rds-ca-2015-root.pem -auto_login_only

使用 SSL 连接到 Oracle 数据库实例

在如前所述将 SQL*Plus 配置为使用 SSL 之后,您可使用 SSL 选项连接到 Oracle 数据库实例。例如,您可以使用 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 的情况下连接到 Oracle 数据库实例。例如,以下命令通过不带 SSL 加密的明文端口连接到数据库实例。

sqlplus '<mydbuser>@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = <endpoint>) (PORT = <port number>))(CONNECT_DATA = (SID = <database name>)))'

如果要关闭传输控制协议 (TCP) 端口访问,请创建一个没有 IP 地址入口的安全组并将此组添加到实例。添加此组将会关闭通过 TCP 端口的连接,同时仍然允许从 SSL 选项安全组允许的范围内的 IP 地址通过 SSL 端口进行指定的连接。

设置通过 JDBC 的 SSL 连接

要使用通过 JDBC 的 SSL 连接,您必须创建密钥存储,信任 Amazon RDS 根 CA 证书并使用下面指定的代码段。

要创建 JKS 格式的 keystore,请使用以下命令。有关创建 keystore 的更多信息,请参阅 Oracle 文档

keytool -keystore clientkeystore -genkey -alias client

接着,按照下列步骤信任 Amazon RDS 根 CA 证书。

信任 Amazon RDS 根 CA 证书

  1. https://s3.amazonaws.com.cn/rds-downloads/rds-ca-2015-root.pem 下载 Amazon RDS 根 CA 证书。

  2. 使用以下命令将证书转换为 .der 格式。

    openssl x509 -outform der -in rds-ca-2015-root.pem -out rds-ca-2015-root.der
  3. 使用以下命令将证书导入密钥存储。

    keytool -import -alias rds-root -keystore clientkeystore -file rds-ca-2015-root.der

以下代码说明如何设置使用 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: https://s3.amazonaws.com.cn/rds-downloads/rds-ca-2015-root.pem 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);