1

我试图强制我的客户端应用程序使用 AES256 而不是 RC4_256 连接到加密的 Oracle 11g 服务器。我们已获悉 RC4_256 加密类型将“很快”禁用。

我们使用最新的 11g 驱动程序和 c3p0 作为我们的连接池。下面是bean配置。

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="oracle.jdbc.OracleDriver"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <!-- other pool properties -->
    <property name="properties">
        <props>
            <prop key="user">${jdbc.username}</prop>
            <prop key="password">${jdbc.password}</prop>

                            <!-- this is one set of many I've tried -->
            <prop key="oracle.net.encryption_client">REQUIRED</prop>
            <prop key="oracle.net.encryption_types_client">( AES256 )</prop>
        </props>
    </property>
</bean>

我使用 oracle.net.encryption_types_client 和 oracle.net.encryption_client、CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVEL、CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPES 尝试了许多排列。我在 Oracle 文档中将它们命名为 Java 属性等。

除了 RC4_256 之外,我无法让它连接。

我在数据库服务器上使用以下查询来查看我的客户端是如何连接的。v$session_connect_info 表中的 Network_Service_Banner 显示了它是如何连接的。这是我收到的当前消息

Oracle Advanced Security:适用于 Solaris 的 RC4_256 加密服务适配器:版本 11.2.0.3.0 - 产品

select s.username,s.machine,s.program,S.LOGON_TIME,s1.* 
from v$session s, v$session_connect_info s1 
where s.sid = s1.sid and s.username in ('MYAPP') and s.machine = 'MY-PC'
order by S.LOGON_TIME DESC, s.sid

任何帮助都将不胜感激,因为此时我正缠绕在车轴上。

4

2 回答 2

1

我会对此进行尝试,因为最近几天我也在阅读这个主题。看来我们需要对服务器和/或客户端上的 SQLNET.ora 文件进行更改才能使其正常工作。

请参阅链接,其中说明了如何使用 AES 连接到数据库。具体看示例 9-3 设置数据加密和完整性参数。此示例上方是启用 AES 加密所需的sqlnet.ora文件中的设置。这些是从链接下面引用的

SQLNET.ENCRYPTION_SERVER = ACCEPTED 
SQLNET.CRYPTO_CHECKSUM_SERVER = ACCEPTED 
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER= (MD5, SHA1) 
SQLNET.ENCRYPTION_TYPES_SERVER= (AES256, AES192, AES128)
SQLNET.CRYPTO_SEED = 2z0hslkdharUJCFtkwbjOLbgwsj7vkqt3bGoUylihnvkhgkdsbdskkKGhdk

引用链接:

对于数据加密和完整性算法,服务器选择其 sqlnet.ora 文件中列出的第一个算法,该算法与客户端 sqlnet.ora 文件中列出的算法相匹配,或者如果客户端在其 sqlnet 中没有列出任何算法,则在客户端安装列表中列出。 .ora 文件。如果服务器 sqlnet.ora 文件中没有条目,则服务器会依次搜索其安装列表以匹配客户端上的项目——无论是在客户端 sqlnet.ora 文件中还是在客户端安装列表中。如果无法进行匹配并且连接的一侧需要算法类型(数据加密或完整性),则连接失败。否则,连接成功,算法类型不活动。

如果您通读上面提到的页面并参考 A.2.1.5 SQLNET.ENCRYPTION_TYPES_SERVER 参数下的A -6 SQLNET.ENCRYPTION_TYPES_SERVER 参数属性,我们看到服务器要匹配的第一个加密算法是RC4_256在您的情况下,可能与已安装加密算法的客户端匹配,这就是连接可能成功的原因。但是,当您指定其他算法(例如 AES 256)时,客户端和服务器可能无法协商此算法,从而导致连接失败。

上面列出的页面详细介绍了启用数据完整性和加密的必要设置。

希望这能让您朝着解决方案迈出一步

于 2013-09-11T07:37:19.130 回答
1

事实证明,c3p0 配置确实很困难。

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="oracle.jdbc.OracleDriver"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <!-- other pool properties -->
    <property name="properties">
        <props>
            <prop key="user">${jdbc.username}</prop>
            <prop key="password">${jdbc.password}</prop>
            <prop key="oracle.net.encryption_client">REQUIRED</prop>
            <prop key="oracle.net.encryption_types_client">(AES256)</prop>
            <prop key="oracle.net.crypto_checksum_client">REQUIRED</prop>
            <prop key="oracle.net.crypto_checksum_types_client">(SHA1)</prop>
        </props>
    </property>
</bean>

它在我们的案例中不起作用,因为我们在类路径中有两个不同版本的 jdbc 驱动程序,而较旧的驱动程序首先被加载。

删除旧的 jdbc jar 后,它根据配置切换到 AES256。

于 2013-09-16T17:59:46.660 回答