wildfly:如何为 xa 数据源使用加密密码?

wildfly: How to use encrypted password for a xa-datasource?

我有一个 wildfly 8.2.0.Final运行。我使用两个 oracle 数据源,一个 和一个 。我想加密我的数据库密码,并设法使用安全域为数据源执行此操作,但不为 xa 数据源执行此操作。 我没有找到解决此问题的文档或其他帖子。

这是我所做的:

        <datasources>
            <datasource jta="false" jndi-name="java:/myproject/jdbc/datasources/jdbc" pool-name="my_JDBC_DS" enabled="true" use-ccm="false">
                <connection-url>jdbc:oracle:thin:@localhost:1521:DB</connection-url>
                <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
                <driver>oracle</driver>
                <pool>
                    <min-pool-size>1</min-pool-size>
                    <max-pool-size>50</max-pool-size>
                </pool>
                <security>
                    <security-domain>databaseSecure</security-domain>
                </security>
                <validation>
                    <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
                    <validate-on-match>true</validate-on-match>
                    <background-validation>false</background-validation>
                </validation>
            </datasource>
            <xa-datasource jndi-name="java:/myproject/jdbc/datasources/db_tx" pool-name="MYTXDS" enabled="true" use-ccm="false">
                <xa-datasource-property name="URL">
                    jdbc:oracle:thin:@localhost:1521:DB
                </xa-datasource-property>
                <xa-datasource-property name="User">
                    scott
                </xa-datasource-property>
                <xa-datasource-property name="Password">
                    tiger
                </xa-datasource-property>
                <driver>oracle</driver>
                <security>
                  <user-name>scott</user-name>
                    <password>tiger</password>
                </security>
                <xa-pool>
                    <min-pool-size>1</min-pool-size>
                    <max-pool-size>50</max-pool-size>
                    <wrap-xa-resource>false</wrap-xa-resource>
                </xa-pool>
                <validation>
                    <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
                    <validate-on-match>true</validate-on-match>
                    <background-validation>false</background-validation>
                </validation>
                <statement>
                    <prepared-statement-cache-size>32</prepared-statement-cache-size>
                    <share-prepared-statements>true</share-prepared-statements>
                </statement>
            </xa-datasource>
            <drivers>
                <driver name="oracle" module="oracle">
                    <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
                </driver>
            </drivers>
        </datasources>
...
            <security-domain name="databaseSecure" cache-type="default">
                <authentication>
                    <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
                        <module-option name="username" value="scott"/>
                        <module-option name="password" value="-170dd0fbd8c13748"/>
                    </login-module>
                </authentication>
            </security-domain>

我已经尝试删除用户和密码的 xa-datasource-属性 条目,并引用嵌套在安全标记中并与属性处于同一级别的安全域。两种尝试均无效,后者由于解析 standalone.xml 的问题导致 wildfly 提前退出,而后者部署失败。

为了展示最有希望的尝试,这就是我尝试引用安全域的方式:

<xa-datasource jndi-name="java:/myproject/jdbc/datasources/db_tx" pool-name="MYTXDS" enabled="true" use-ccm="false">
            <xa-datasource-property name="URL">
                jdbc:oracle:thin:@localhost:1521:DB
            </xa-datasource-property>
            <driver>oracle</driver>
            <security>
              <security-domain>databaseSecure</security-domain>
            </security>
            <xa-pool>
                <min-pool-size>1</min-pool-size>
                <max-pool-size>50</max-pool-size>
                <wrap-xa-resource>false</wrap-xa-resource>
            </xa-pool>
            <validation>
                <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
                <validate-on-match>true</validate-on-match>
                <background-validation>false</background-validation>
            </validation>
            <statement>
                <prepared-statement-cache-size>32</prepared-statement-cache-size>
                <share-prepared-statements>true</share-prepared-statements>
            </statement>
        </xa-datasource>

这样做,野蝇会遇到 javax.resource.ResourceException: No matching credentials in Subject! 我已经调试了代码,虽然我在调用堆栈中缺少最后几个 类 的代码,但我看到 Subject 实际上具有凭据作为属性,但 AccessController.doPrivileged 调用仍然失败,导致上述异常。

你看我有点迷路了,有什么建议吗?

我在尝试使用加密的安全域配置 xa-datasource 时遇到了同样的问题。经过一段时间的努力,我按照本指南 https://developer.jboss.org/wiki/JBossAS7SecuringPasswords 中的描述配置了保管库加密,它成功地与数据源和 xa-datasources 一起工作。

希望对您有所帮助。

我弄清楚了我做错了什么(通过调试 wildfly 并仔细观察我正在工作的 JBoss 4 配置..)。 在我的安全域配置中,我只设置了用户名和密码。为了让它工作,我还需要添加 "managedConnectionFactoryName" 并为每个数据源声明一个安全域。

我现在的配置如下:

    <datasources>
        <datasource jta="false" jndi-name="java:/myproject/jdbc/datasources/jdbc" pool-name="my_JDBC_DS" enabled="true" use-ccm="false">
            <connection-url>jdbc:oracle:thin:@localhost:1521:DB</connection-url>
            <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
            <driver>oracle</driver>
            <pool>
                <min-pool-size>1</min-pool-size>
                <max-pool-size>50</max-pool-size>
            </pool>
            <security>
                <security-domain>jdbcDatabaseSecure</security-domain>
            </security>
            <validation>
                <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
                <validate-on-match>true</validate-on-match>
                <background-validation>false</background-validation>
            </validation>
        </datasource>
        <xa-datasource jndi-name="java:/myproject/jdbc/datasources/db_tx" pool-name="MYTXDS" enabled="true" use-ccm="false">
            <xa-datasource-property name="URL">
                jdbc:oracle:thin:@localhost:1521:DB
            </xa-datasource-property>
            <driver>oracle</driver>
            <security>
                <security-domain>txDatabaseSecure</security-domain>
            </security>
            <xa-pool>
                <min-pool-size>1</min-pool-size>
                <max-pool-size>50</max-pool-size>
                <wrap-xa-resource>false</wrap-xa-resource>
            </xa-pool>
            <validation>
                <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
                <validate-on-match>true</validate-on-match>
                <background-validation>false</background-validation>
            </validation>
            <statement>
                <prepared-statement-cache-size>32</prepared-statement-cache-size>
                <share-prepared-statements>true</share-prepared-statements>
            </statement>
        </xa-datasource>
        <drivers>
            <driver name="oracle" module="oracle">
                <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
            </driver>
        </drivers>
    </datasources>
    ...
        <security-domain name="jdbcDatabaseSecure" cache-type="default">
            <authentication>
                <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
                    <module-option name="username" value="scott"/>
                    <module-option name="password" value="-170dd0fbd8c13748"/>
                    <module-option name = "managedConnectionFactoryName" value="jdbcDatabaseSecure" />
                </login-module>
            </authentication>
        </security-domain>
        <security-domain name="txDatabaseSecure" cache-type="default">
            <authentication>
                <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
                    <module-option name="username" value="scott"/>
                    <module-option name="password" value="-170dd0fbd8c13748"/>
                    <module-option name = "managedConnectionFactoryName" value="txDatabaseSecure" />
                </login-module>
            </authentication>
        </security-domain>

现在可以使用了。

我通过从 standalone.xml 的安全域中删除 cache-type="default" 来禁用安全域的缓存,它对我有用 这种情况发生在多个数据源被定义为由同一个安全域支持的情况下, - 为每个数据源制作单独的安全域或 - 如果安全域要与多个数据源一起使用,则不应为该域启用缓存,这意味着每次从安全域获取 PasswordCredential 时,它将是一个新实例,并执行此操作 remove cache-type= "default" 来自 standalone.xml

中的安全域

参考资料: https://community.appian.com/support/w/kb/299/kb-1074-cannot-open-connection-caused-by-javax-resource-resourceexception-no-matching-credentials-in-subject-error-thrown-during-jboss-startup

https://bugzilla.redhat.com/show_bug.cgi?id=1103684