【问题标题】:tomcat6 sqlnet encryption failuretomcat6 sqlnet加密失败
【发布时间】:2016-11-12 02:27:48
【问题描述】:

最近继承了一个旧的 Java 代码库,该代码库使用 apache 的 tomcat6,并正在尝试建立一个开发环境。通过前端 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文件中使用的db url:

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

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

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

【问题讨论】:

    标签: java oracle tomcat encryption oracle11g


    【解决方案1】:

    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 的宏伟想法。我什至不想知道为什么。 :)

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 2013-02-17
      • 1970-01-01
      • 2023-01-30
      • 2014-07-01
      • 2018-02-23
      • 2012-06-04
      • 2018-08-19
      • 2018-05-10
      相关资源
      最近更新 更多