【发布时间】:2016-11-12 02:27:48
【问题描述】:
最近继承了一个旧的 Java 代码库,该代码库使用 apache 的 tomcat6,并正在尝试建立一个开发环境。通过前端 JSP 登录屏幕调用 DriverManager.getConnection() 时,我收到 ORA-12649 代码(“未知加密或数据完整性算法”)。
有很多事情没有意义:
- 我们已经在运行 Oracle 11gR2 的目标数据库上实现了加密(通过 slqnet.ora 中的设置),它适用于相同代码库的生产版本;它也适用于传入的 sqldeveloper 连接等;基本上db端的加密实现没有问题
- 开发代码库与生产代码库完全相同(此时)
- 开发版tomcat6安装与生产版安装相同
- 如果我将连接器指向另一个未实施加密的数据库,则使用有效的用户名和密码授权成功
在广泛阅读 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 的 <webapps> 文件夹中提供一个符号链接,该链接指向我的仓库中的正确位置。目录权限没问题,因为 tomcat 正在从该位置提供页面。
<Context path="/<my_app_name>" allowLinking="true">
【问题讨论】:
标签: java oracle tomcat encryption oracle11g