在这篇文章中,我们将向您展示如何成功设置与 Amazon Relational Database Service (Amazon RDS) for Oracle 的 SSL 连接。本文考虑的场景包括使用 SQL Plus 客户端在 Linux 上的 SSH 和 Java 应用程序客户端。
建立安全的 SSL 连接对于保护客户端和伺服器之间的通信至关重要。Amazon RDS 支持在所有 AWS 区域中为 Oracle 数据库实例提供 SSL 加密。在部署新证书之前,更新使用 SSL/TLS 的客户端信任存储或钱包非常重要,这样能确保应用程序在连接时信任服务器证书。
安全套接字层SSL是用于安全客户端和伺服器之间网络连接的行业标准协议。在 SSL 版本 30 之后,该协议更名为传输层安全性TLS,但仍常被称为 SSL。要启用 Oracle DB 实例的 SSL 加密,必须向与该 DB 实例相关联的 选项组 添加 Oracle SSL 选项。Amazon RDS 使用额外的端口来处理 SSL 连接,这样可以在 DB 实例和 Oracle 客户端之间同时进行明文和 SSL 加密通信。
提示 为了确保连接安全,强烈建议与应用程序开发人员合作,确定是否使用证书验证。

您可以从 所有 AWS 区域的证书捆绑 下载证书,以便在过渡期间顺利升级应用程序并保持持续连接。
AWS 提供两种类型的证书捆绑:
证书类型说明全球捆绑包含现有的根证书和中介证书,以及该区域的新根证书,适合需要广泛兼容性与信任的应用程序。区域捆绑每个区域一个捆绑,包含该区域的根证书授权机构CA、中介证书以及新根证书,通常在重视本地化信任或受到监管框架要求的情况下使用。连接到 Oracle 实例时,需要创建 Oracle 钱包,这样可以安全地进行身份验证并加密客户端与伺服器之间交换的数据。钱包中包含了建立安全连接所需的数字证书和密钥。
设置您可以用于导出的钱包位置: bash export WALLET=ltYOURORACLEWALLETLOCATIONHEREgt
创建 Oracle SSL 钱包: bash orapki wallet create wallet WALLET autologinonly
使用以下 curl 命令下载 globalbundlepem 文件: bash curl sS https//truststorepkirdsamazonawscom/global/globalbundlepem gt globalbundlepem
从 globalbundlepem 中拆分证书: bash awk splitafter == 1 {nsplitafter=0} /END CERTIFICATE/ {splitafter=1}{print gt rdsca n pem} lt globalbundlepem
将所有拆分后的证书添加到钱包中: bash for CERT in rdsca do alias=(openssl x509 noout text in CERT perl ne next unless /Subject/ s/(CN=CN = )// print) echo Importing alias orapki wallet add wallet WALLET trustedcert cert {CERT} autologinonly rm CERT done
更新应用程序以使用 SSL/TLS 证书连接到 Oracle DB 实例是建立 SSL 连接的必要步骤。这样可以验证应用程序是否信任由 Oracle 数据库服务器提供的 SSL 证书。
飞机加速器免费设置 JAVAHOME 和 PATH: bash export JAVAHOME=/usr/lib/jvm/jdk180301 export PATH=PATHJAVAHOME/bin export storepassword=ltKEYSTOREPASSWORDHEREgt
下载 globalbundlepem 文件: bash curl sS https//truststorepkirdsamazonawscom/global/globalbundlepem gt globalbundlepem
拆分捆绑 pem 文件并导入证书到 keytool: bash awk splitafter == 1 {nsplitafter=0} /END CERTIFICATE/ {splitafter=1}{print gt rdsca n1 pem} lt globalbundlepem
将所有拆分后的证书添加到 keytool: bash for CERT in rdsca do alias=(openssl x509 noout text in CERT perl ne next unless /Subject/ s/(CN=CN = )// print) echo Importing alias keytool import file {CERT} alias {alias} storepass {storepassword} keystore clientkeystorejks noprompt rm CERT done
列出 keystore: bash keytool list v keystore clientkeystorejks storepass storepassword grep E Alias nameValid fromuntil
使用 JDBC 连接时,JDKJava 版本和 Oracle JDBC 驱动程序的版本兼容性也很重要。
Oracle 数据库版本特定于版本的 JDBC Jar 文件23xojdbc11jar 对应 JDK11、JDK17、JDK19、JDK21 ojdbc8jar 对应 JDK8 和 JDK1121xojdbc11jar 对应 JDK11、JDK17、JDK19 ojdbc8jar 对应 JDK8 和 JDK1119xojdbc10jar 对应 JDK11 和 JDK17 ojdbc8jar 对应 JDK8、JDK11、JDK17 和 JDK19其他版本相关信息参见最新的 Oracle JDBC 版本与 JDK 版本兼容性矩阵。建议使用最新的 Oracle 客户端版本,因为这些版本支持适当的证书验证,并要求客户端拥有有效的签名证书。这样可以排除使用源 Oracle 客户端钱包中错误证书成功建立 SSL 连接的可能性。
在此,我们强烈建议始终使用可用的最新数据库客户端版本以及最新的修补程序。
sqlnetora 文件是配置文件,存放在客户端机器和数据库服务器上。可以通过该文件对客户端进行访问控制。其位置默认在 ORACLEHOME/network/admin 目录下,也可以由 TNSADMIN 环境变量指定。
以下是 SSL 客户端身份验证的示例 SQLNETora 文件:
plaintextWALLETLOCATION = (SOURCE = (METHOD = FILE) (METHODDATA = (DIRECTORY = ltWALLETLOCATIONgt)))SSLCLIENTAUTHENTICATION = TRUESSLVERSION = 12SSLCIPHERSUITES = (SSLRSAWITHAES256CBCSHA)SSLSERVERDNMATCH = ON
在进行 SQL Plus 连接时,您可以使用以下查询来验证是否使用了 TCPS 连接。
sqlSELECT SYSCONTEXT(USERENV networkprotocol) FROM DUAL
在这篇文章中,我们展示了如何成功建立与 RDS for Oracle 实例的 SSL 连接,并讨论了最佳实践和建议。我们还涵盖了在使用 Java 应用程序和 SQL Plus 客户端时需要考虑的常见事项,以及成功建立 SSL 连接所需的 sqlnetora 参数的示例文件内容。
感谢您的反馈。如有任何问题或建议,请在评论区分享。
Chandan Maheshwari 是 AWS 的云支持工程师,拥有 85 年的 RDBMS 引擎经验,主要专注于 Oracle。Chandan 协助客户完成 Amazon RDS 的迁移、升级,并简化其云数据库旅程。
Tushar Rajput 是 AWS 的云支持工程师,拥有 6 年的 Oracle 和各种 RDBMS 引擎的工作经验。他在 Amazon RDS 客户中发挥重要作用,帮助他们建立和维护稳定的、可靠的和安全的数据库操作。