gpt4 book ai didi

java - tomcat6 sqlnet加密失败

转载 作者:行者123 更新时间:2023-11-28 22:51:35 31 4
gpt4 key购买 nike

最近继承了一个旧的 Java 代码库,该代码库将 tomcat6 与 apache 结合使用,并且正在尝试建立一个开发环境。通过前端 JSP 登录屏幕调用 DriverManager.getConnection() 时,我收到了 ORA-12649 代码(“未知加密或数据完整性算法”)。

有很多事情没有意义:

  1. 我们已经在运行 Oracle 11gR2 的目标数据库上实现了加密(通过 slqnet.ora 中的设置),并且它与相同代码库的生产版本一起工作;它还适用于传入的 sqldeveloper 连接等;基本上,db端的加密实现没有问题
  2. 开发代码库与生产代码库完全相同(此时)
  3. 开发 tomcat6 安装与生产安装版本相同
  4. 如果我将连接器指向另一个未实现加密的数据库,则使用有效的用户名和密码授权成功

在大量阅读 Oracle 文档和论坛、tomcat6 文档(特别是它处理 CLASSPATH 变量的复杂方式)之后,我一无所获。

我的预感是开发系统上的 tomcat6 安装没有引用正确的 jar 文件,即使我在 tomcat 安装 lib 文件夹中有 ojdbc6.jar 文件。根据 Oracle 的说法,在从瘦客户端实现这种类型的加密时,提供 ojdbc6.jar 应该就可以了,这就是这个 tomcat 应用程序的实现方式。

这是在客户端实现加密的方式;这编译没有错误:

...
prop.setProperty(
OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVEL,
AnoServices.ANO_REQUIRED);
prop.setProperty(
OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPES,
"( " + AnoServices.ENCRYPTION_AES256 + "," +
AnoServices.ENCRYPTION_3DES168 + "," +
AnoServices.ENCRYPTION_AES192 + " )");

// require the use of the SHA1 algorithm for data integrity checking
prop.setProperty(
OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_LEVEL,
AnoServices.ANO_REQUIRED);
prop.setProperty(
OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_TYPES,
"( " + AnoServices.CHECKSUM_SHA1 + " )");
...

这里是数据库端的 sqlnet.ora 文件中的相关行,已知它可以与多个客户端一起工作:

SQLNET.ENCRYPTION_SERVER=required
SQLNET.ENCRYPTION_TYPES_SERVER=(AES256,AES192,3DES168)
sqlnet.crypto_checksum_server=required
sqlnet.crypto_checksum_types_server=(SHA1)

这是在应用程序目录中 tomcat 的 web.xml 文件中使用的数据库 url:

jdbc:oracle:thin:@<my_db_name>:1521:<my_db_sid>

我的 context.xml 文件实现了“allowLinking”功能,不确定这是否有所不同,但它是非标准的,所以我包含了这个细节。这允许我在 tomcat 的 <webapps> 中提供一个符号链接(symbolic link)。指向我的仓库中正确位置的文件夹。目录权限没有问题,因为 tomcat 正在从该位置提供页面。

<Context path="/<my_app_name>" allowLinking="true">

最佳答案

似乎在 servlet 编译期间在 CLASSPATH 中引用的 ojdbc6.jar 文件与 tomcat6 引用的 ojdbc6.jar 文件不同。我的工作假设是任何名为“ojdbc6.jar”的文件的内容都是静态的,但显然我错了! (谁能确认 Oracle 是否确实发布了名为“ojdbc6.jar”的文件的不同版本?我找不到他们这样做的任何证据)。

在这方面花费了更多时间后,我确信问题出在所使用的驱动程序版本上,即使在所有实例中 jar 文件名都是“ojdbc6.jar”。所以,我使用 md5sum 来确认两个 .jar 文件是相同的,果然,它们不是!所以我从 Oracle 重新下载 ojdbc6.jar 并将它复制到需要它的两个位置,重新编译我的 servlet 类,然后重新启动 tomcat6。通过加密连接登录时不会再出现错误。

因此,过去有人似乎有将 ojdbcX.jar 文件的旧/无效版本重命名为 ojdbc6.jar 的宏伟想法。我什至不想知道为什么。 :)

关于java - tomcat6 sqlnet加密失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38284953/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com