我是新来的,主要是 Oracle 数据库开发人员 (admin/sql/plsql)。我对 java/jetty 不熟悉。
我目前正在尝试设置我们的 Web 应用程序以使用 tcps 连接到 oracle 数据库。现有的 Web 应用程序正在使用 tcp 协议并且正在运行。
我按照一些步骤在 Oracle 数据库服务器上设置钱包,还在运行 Web 应用程序的 LINUX (Oracle Linux 9) 服务器上设置钱包,互相交换两个服务器的证书,这样我就可以进行 sqlplus 连接使用 tcps 端口(在数据库服务器的 Listener.ora 和应用服务器的 Oracle 客户端的 tnsnames.ora 中定义)从应用程序服务器到 Oracle 数据库。 Oracle数据库和Oracle客户端都是Oracle 19c,Oracle客户端家$ORACLE_HOME/jdbc/lib中有ojdbc8.jar
应用服务器有jetty,jetty会启动webapp,所以.war文件放在jetty的webapps目录下。当 web 应用程序尝试连接到 Oracle 数据库时,我看到以下错误:
java.lang.IllegalStateException: Failed to get connection to the DB: [ssvm_odb@jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=usatl-ssdb02)(PORT=1523))(CONNECT_DATA=(SERVICE_NAME=r19000)))]
Caused by: java.sql.SQLRecoverableException: IO Error: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
在Oracle数据库服务器上,我想我已经在sqlnet.ora文件中列出了密码套件
SSL_CIPHER_SUITES = (TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA)
在应用服务器的 $ORACLE_HOME/network/admin/sqlnet.ora 文件中,设置了相同的密码套件列表。
在java文件中,我们有以下内容来设置url和用户名/密码,然后连接数据库
url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=" + serverName + ")(PORT=" + portNumber + "))(CONNECT_DATA=(SERVICE_NAME=" + serviceName + ")))";
username = odb.getUsername();
odbConnectionData = new java.util.Properties();
odbConnectionData.put( "user", username );
odbConnectionData.put( "password", odb.getPassword() );
public Connection getConnection( )
{
Connection connection;
try
{
connection = DriverManager.getConnection( url, odbConnectionData );
}
catch ( SQLException e )
{
// Could not connect to the database
throw Debug.wrap(e, "Failed to get connection to the DB: [%s@%s]", username, url);
}
从错误来看,我认为更多的是“密码套件不合适”,在我看来,jdbc连接没有读取sqlnet.ora或钱包的位置。我还尝试修改 $JAVA_HOME/jre/lib/security 中的一些配置文件,例如 java.security,但没有任何效果。
我希望在加密通信领域有更多知识的人可以给我一些关于如何进行这项工作的指示和提示。我知道这是一篇很长的文章。如果需要,我可以提供有关设置的更多信息。
谢谢, 詹姆斯
你是对的:“jdbc:oracle:thin”驱动程序不会读取 sqlnet.ora。但它会读取$TNS_ADMIN/tnsnames.ora。它还会读取 $TNS_ADMIN/ojdbc.properties,这有点像 Oracle JDBC 的 sqlnet.ora。
要为 Oracle JDBC 配置密码套件,您需要在 ojdbc.properties 文件中配置 “oracle.net.ssl_cipher_suites”连接属性。确保使用 JSSE 密码套件名称 配置该属性。有时,JSSE 名称会与 sqlnet.ora 中使用的名称不同
您还可以将钱包位置放入 ojdbc.properties 中,并使用 “oracle.net.wallet_location”属性进行配置。 所以你的文件最终可能看起来像这样:
# TODO: Add other cipher suite names
oracle.net.ssl_cipher_suites=TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256
oracle.net.wallet_location=/path/to/your/wallet.sso
或者,如果您的 wallet.sso 位于 TNS_ADMIN 目录中,您可以使用“${environment-variable-name}”表达式将 wallet_location 配置为 TNS_ADMIN 环境变量:
# TODO: Add other cipher suite names
oracle.net.ssl_cipher_suites=TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256
oracle.net.wallet_location=${TNS_ADMIN}
我在这里所写的只是解决 Oracle JDBC 不读取 sqlnet.ora,而是读取连接属性,并且这些属性可以存储在 ojdbc.properties 文件中。
但是,我通常不需要配置密码套件,因此我现在正在查看错误消息中的 or 条件的另一面:
协议被禁用或密码套件不合适
也许问题是 TLS 协议版本,而不是密码?您的 Java 安全提供程序可能需要 TLS 1.3,而数据库仅支持 1.2。如果您同意使用 TLS 1.2,那么您也可以尝试在属性文件中设置 “oracle.net.ssl_version”:
oracle.net.ssl_version=1.3 or 1.2
请告诉我这是否有帮助。