暂无图片
暂无图片
12
暂无图片
暂无图片
暂无图片

使用 JDBC、TLSv1.2、JKS 或 Oracle Wallets(12.2 及更低版本)与 Oracle DB 的 SSL 连接

原创 哇哈哈 2022-11-25
2932

#SSL简介
Oracle 数据库产品在其标准版(自 12c 起)中支持 SSL/TLS 连接。安全套接字层 (SSL) 协议提供网络级身份验证、数据加密和数据完整性。当通过 SSL 建立网络连接时,客户端和服务器执行握手,其中包括:
-协商用于加密、数据完整性和身份验证的密码套件
-通过验证客户端的证书对客户端进行身份验证 
-通过验证服务器的专有名称 (DN) 是否符合要求来对服务器进行身份验证
-客户端和服务器使用公钥加密交换密钥信息。
为了建立 SSL 连接,Oracle 数据库发送其存储在wallets中的证书。因此,在服务器端配置需要wallets,而在客户端,JDBC Thin驱动程序可以使用不同的格式来存储客户端的证书和密钥:JKS、wallets或 PKCS12。
#使用 TLSv1.2 的 SSL 连接
JDK 7 和 JDK 8版本支持 TLSv1.2 协议。TLSv1.1、TLSv1、SSLv3、SSLv2等其他协议存在安全漏洞,建议使用最新标准版本TLSv1.2,并使用更安全的SSL密码套件。请遵循以下这些先决条件以使用 TLSv1.2。
##1:确保有正确的 JDBCThin驱动程序
建议使用12.2.0.1版本的ojdbc8.jar,如果使用的是12.1.0.2 JDBC驱动程序,那么需要下载12.1.0.2补丁驱动程序或应用19030178补丁允许TLSv1.2连接。请注意,该补丁允许TLSv1.2,但默认情况下不启用它。因此,必须设置属性oracle.net.ssl_version=1.2。此属性可以设置为系统属性(使用-D)或通过数据源属性设置。

##2:JDK版本和JCE文件

如果不使用JDK9或JDK8u162,请下载JCE Unlimited Strength Jurisdiction Policy Files。有关安装说明,请参阅自述文件。如果没有Java加密扩展(JCE)文件,将不会启用强密码套件(例如 TLS_RSA_WITH_AES_256_CBC_SHA256)。

PS:如果使用的是JDK7,并且使用强加密套件如TLS_RSA_WITH_AES_256_CBC_SHA256,那么必须通过属性启用它
-Doracle.net.ssl_cipher_suites="(TLS_RSA_WITH_AES_256_CBC_SHA256)"

##3:设置数据库连接字符串

-从Github下载DataSourceSample.java或UCPSample.java
https://github.com/oracle/oracle-db-examples/blob/master/java/jdbc/ConnectionSamples/DataSourceSample.java
https://github.com/oracle/oracle-db-examples/blob/master/java/jdbc/ConnectionSamples/UCPSample.java

-修改Java代码以包含有权访问的数据库的正确DB_URL、DB_USER和DB_PASSWORD。确保使用TCPS协议及其相应的端口并配置服务器的DN以进行相互身份验证。
示例:DB_USER =“hr”、DB_PASSWORD =“hr” 和
DB_URL = “jdbc:oracle:thin:@(DESCRIPTION= (ADDRESS=
(PROTOCOL=TCPS)(PORT=1522)(HOST=myhost))
(CONNECT_DATA=(SERVICE_NAME=myorcldbservicename))
(SECURITY=(ssl_server_cert_dn=“CN=testcert.oracle.com, O=Oracle Corporation,L=Redwood City,ST=California,C=US”)))”

注意:可以在URL中使用TNS别名,例如DB_URL=“jdbc:oracle:thin:@dbaccess”。
#使用带JKS的TLSv1.2的SSL连接

Java Key Store (JKS) 用作在服务器和客户端之间交换的客户端证书的容器。使用JKS的优势在于它在JRE中的本机支持,并且不需要任何额外的安全提供程序,因为Sun的默认PKI提供程序支持JKS格式。
trustStore存储来自受信任的证书颁发机构(CA)的证书,这些证书将用于验证服务器在SSL连接中提供的证书。keyStore包含将用于身份验证的客户端证书,它还包含一组将用于加密的私钥/公钥。当客户端需要在服务器上进行身份验证时,应用程序应该提供 keyStore。
按照以下步骤使用JDBC Thin驱动程序和JKS连接到Oracle DB:

第1步:完成"使用TLSv1.2的SSL连接"部分的先决条件1-3

第2步:使用JKS(keyStore.jks和trustStore.jks)文件

确保将文件keyStore.jks和trustStore.jks放在应用程序可访问的位置,并使用连接属性提供 JKS 文件位置和密码。有关属性,请参阅示例命令。

第3步:启用服务器DN匹配
服务器DN匹配用于SSL握手期间的相互身份验证。使用oracle.net.ssl_server_dn_match=true系统属性进行设置。

第4步:使用JKS文件运行Java程序的示例命令

JDK8和12.2.0.1JDBC Thin驱动程序

java -Doracle.net.ssl_server_dn_match=“true”
-Doracle.net.tns_admin=./lib
-Djavax.net.ssl.trustStore=“truststore.jks”
-Djavax.net.ssl.trustStorePassword=“welcome1”
-Djavax.net.ssl.trustStoreType=“JKS”
-Djavax.net.ssl.keyStore="/client_credentials/keystore.jks"
-Djavax.net.ssl.keyStoreType=“JKS”
-Djavax.net.ssl.keyStorePassword=“welcome1” DataSourceSample

JDK7和12.1.0.2修补的Thin驱动程序

java -Doracle.net.ssl_version=“1.2”
-Doracle.net.tns_admin=./lib
-Doracle.net.ssl_server_dn_match=“true”
-Doracle.net.ssl_cipher_suites="(TLS_RSA_WITH_AES_256_CBC_SHA256)"
-Djavax.net.ssl.trustStore="/client_credentials/truststore.jks"
-Djavax.net.ssl.trustStorePassword=“welcome1”
-Djavax.net.ssl.keyStore="/client_credentials/keystore.jks"
-Djavax.net.ssl.keyStorePassword=“welcome1” DataSourceSample

##使用TLSv1.2与Oracle Wallets的SSL连接

由Oracle Wallet Manager或orapki创建的wallets使用标准PKCS12格式来存储X.509证书和私钥。wallets存储在名为"ewallet.p12"的文件中。如果您在wallets中启用自动登录,则会在文件"cwallet.sso"中创建wallets的混淆副本,然后无需提供密码即可使用。请注意,您必须使用名为"OraclePKI"的Oracle PKI提供程序从Java访问Oracle wallets。

按照以下步骤使用JDBC Thin驱动程序和Oracle Wallets连接到Oracle DB:

第1步:完成"使用 TLSv1.2 的 SSL 连接"部分中的先决条件 1-3

第2步:添加使用Oracle Wallets所需的依赖jar连同JDBC Thin驱动程序(例如,来自12.2.0.1的ojdbc8.jar),oraclepki.jar、osdt_cert.jar和osdt_core.jar文件(这些文件位于$ORACLE_HOME/lib) 或者您也可以从OTN上的JDBC下载页面下载这些文件并将它们放在CLASSPATH中。

第3步:启用Oracle PKI提供程序
按照两种方法中的任何一种启用Oracle PKI提供程序。
(a)按如下方式静态启用它:
如果您使用SSO wallets(cwallet.sso),请在文件java.security中提供程序列表末尾添加OraclePKIProvider(此文件是位于$JRE_HOME/jre/lib/security/java.security的JRE安装的一部分)通常看起来像:
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=com.sun.net.ssl.internal.ssl.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=com.sun.security.sasl.Provider
security.provider.7=oracle.security.pki.OraclePKIProvider

请注意,如果另一个提供商支持"SSO"类型,则应将其插入到Oracle的PKI提供商之后。

如果您使用PKCS12 wallets(ewallet.p12),请将Oracle的PKI提供程序移至位置#3或Sun提供程序之前的任何位置,该提供程序也支持 PKCS12 但与 Oracle 的wallets不兼容。所以java.security中的提供者列表如下所示:

security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=oracle.security.pki.OraclePKIProvider
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider

(b) 在Java程序中动态启用它,如下所示:
如果使用SSOwallets,只需"添加"Oracle的PKI提供程序,因为顺序无关紧要(假设没有其他 SSO 提供程序):

Security.addProvider(new oracle.security.pki.OraclePKIProvider());

如果使用PKCS12wallets,则需要在位置#3 插入 Oracle PKI 的提供程序:

Security.insertProviderAt(new oracle.security.pki.OraclePKIProvider(),3);

第4步:设置 Oracle wallets
位置 使用oracle.net.wallet_location="(SOURCE=(METHOD=file)(METHOD_DATA=(DIRECTORY=/home/test/cloud)))"
设置wallets位置wallets位置是SSO所在的位置放置wallets(cwallet.sso和ewallet.p12)。

第5步:启用服务器 DN 匹配
服务器 DN 匹配用于 SSL 握手期间的相互身份验证。使用oracle.net.ssl_server_dn_match=true系统属性进行设置。

第6步:使用 Oracle Wallets 运行 Java 程序的示例命令

如果您使用的是纯 Java 程序,则使用如下所示的命令使用 Oracle Wallets 和 JDBC 驱动程序进行连接。

java -classpath ./lib/ojdbc8.jar:./lib/oraclepki.jar:./lib/osdt_cert.jar:./lib/osdt_core.jar:.
-Doracle.net.tns_admin=./lib
-Doracle.net.wallet_location="(SOURCE=(METHOD=file)(METHOD_DATA=(DIRECTORY=/home/test/cloud/lib)))"
-Doracle.net.ssl_server_dn_match=true DataSourceSample

附录:

如果遇到更多问题,可以使用-Djavax.net.debug=all打开跟踪

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论