Amazon Relational Database Service
用户指南 (API Version 2014-10-31)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

Oracle SSL

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

通过向与数据库实例关联的选项组添加 Oracle SSL 选项,可实现针对 Oracle 数据库实例的 SSL 加密。Amazon RDS 按照 Oracle 的要求使用另一个端口进行 SSL 连接,这允许数据库实例和 Oracle 客户端之间能够同时进行明文通信和 SSL 加密通信。例如,您可使用用于明文通信的端口与 VPC 内的其他资源通信,同时使用用于 SSL 加密通信的端口与 VPC 外部的资源通信。

注意

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

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

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

  • 12.1.0.1:所有版本

  • 11.2.0.4:所有版本,Enterprise Edition

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

  • 11.2.0.2:所有版本,Enterprise Edition

注意

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

将 Oracle 客户端配置为对 Oracle 数据库实例使用 SSL

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

将 Oracle 客户端配置为使用 SSL 连接到 Oracle 数据库实例

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

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

    Copy
    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 环境变量的示例:

    Copy
    prompt>export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
  3. 为 $ORACLE_HOME/ssl_wallet 处的 Oracle wallet 创建一个目录。

    以下是一个创建 Oracle wallet 目录的示例:

    Copy
    prompt>mkdir $ORACLE_HOME/ssl_wallet
  4. https://s3.amazonaws.com/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 文件并包含以下条目:

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

    Copy
    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:

    Copy
    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 数据库实例

在如前所述将 Oracle 客户端配置为使用 SSL 之后,您可使用 SSL 选项连接到 Oracle 数据库实例。例如,要使用 SQL*Plus 连接到数据库实例,请使用以下命令:

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

您还可在不使用 SSL 的情况下连接到 Oracle 数据库实例。例如,以下命令通过不带 SSL 加密的明文端口连接到数据库实例:

Copy
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 连接,您必须创建 keystore,信任 Amazon RDS 根 CA 证书并使用下面指定的代码段。

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

Copy
keytool -keystore clientkeystore -genkey -alias client

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

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

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

    Copy
    openssl x509 -outform der -in rds-ca-2015-root.pem -out rds-ca-2015-root.der
  3. 使用以下命令将证书导入 keystore:

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

以下代码段显示如何设置使用 JDBC 的 SSL 连接:

Copy
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/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 匹配:

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

使用 SSL 时使用以下连接字符串强制执行 DN 匹配:

Copy
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);

相关主题