Anypoint Studio如何配置BouncyCastle

Anypoint Studio how to configure BouncyCastle

我们的目标是从 Anypoint Studio 连接到 Sybase ASE DB。此数据库服务器需要加密密码。所以我们写了 java 代码并且能够建立连接。在 java 项目中添加了外部 BouncyCastle jar (bcprov-jdk15on-170.jar) 和 jConnecter (jconn.jar) JDBC 驱动程序。并且有效。

        Class.forName(DRIVER_CLASS); //DRIVER_CLASS = "com.sybase.jdbc4.jdbc.SybDriver";
    prop.put("ENCRYPT_PASSWORD", "true"); // by default this is false.
    prop.put("java.security.Provider", "org.bouncycastle.jce.BouncyCastleProvider");
    
    prop.put("user", UID);
    prop.put("password", PWD);
    
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
            
    System.out.println("Trying to connect");
    Connection con = DriverManager.getConnection(JDBC_URL, prop);
    System.out.println("Connection success!");

接下来,我们希望在 Anypoint Studio 7.11 中实现同样的目标。我给出以下参数的数据库配置:

Connection: Generic
JDBC Driver: jconn4
URL: jdbc:sybase:Tds:<host>:<port>/<DB>?ENCRYPT_PASSWORD=true&java.security.Provider=org.bouncycastle.jce.provider.BouncyCastleProvider
Driver Class: com.sybase.jdbc4.jdbc.SybDriver
Followed by User: and Password.

然后在参考库中添加 bcprov-jdk15on-170.jar 作为 project/external jar。

但是当我进行测试连接时出现错误:

org.mule.runtime.api.connection.ConnectionException: Could not obtain connection from data source
Caused by: org.mule.db.commons.shaded.api.exception.connection.ConnectionCreationException: Could not obtain connection from data source
Caused by: java.sql.SQLException: Cannot get connection for URL jdbc:sybase:Tds:<host>:<port>/<DB>?ENCRYPT_PASSWORD=true&java.security.Provider=org.bouncycastle.jce.provider.BouncyCastleProvider : JZ0LA: Failed to instantiate Cipher object. Transformation RSA/NONE/OAEPWithSHA1AndMGF1Padding is not implemented by any of the loaded JCE providers.

在使用 Java 项目进行测试时发生了此错误,但后来我通过添加以下代码行解决了问题:

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

但是在Anypoint Studio中怎么办呢?或者如何解决? Anypoint Studio 数据库配置未获取此 class 文件。我查了一下互联网,上面说要在 java.security 文件中指定提供商。 the other post on SOF。我也这样做过。它仍然不适用于 Anypoint Studio。如果你们中有人在过去成功地做到了,请分享想法。

[更新 1] 我在 Anypoint Studio 流程中添加了 Invoke-Static Moulde,这很有效。因此接下来尝试在数据库配置(全局元素)中提供相同的设置,但它现在在 TestConnection 上给出了新的错误。 供应商我已经改变了,它从 Invoke-Static 流程开始工作。

建立连接(并且没问题)的 Invoke-Static Java 代码:

 Security.addProvider(new org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider()); // new provider
//Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

此外,在 Anypoint 使用的 jdk/conf/java.security 中,在顶部添加了 BouncyCastle:

security.provider.1=org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider

但是当我在Database Config中进行如下相应设置时url:

url="jdbc:sybase:Tds:<host>:<port>/<DB>?ENCRYPT_PASSWORD=true&java.security.Provider=org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider"
user and password same.

从数据库配置中单击 TestConnection 时出现新错误:

ToolingException{message='Got status code: 500 when trying to resolve a Mule Runtime operation. Reason: 'Server Error. {"errorType":null,"errorMessage":null,"errorDetail":null,"additionalProperties":{servlet=org.glassfish.jersey.servlet.ServletContainer-29fe8bdb, message=Request failed., url=/mule/tooling/applications/70c8b7ab-8bbc-4863-a0aa-718be6d803b9/components/Database_Sybase/connection, status=500}}''

正在调查,为什么会出现这个错误?

[更新 2] 上面提到的 Tooling 异常的新错误通过在 URL 中附加 &RETRY_WITH_NO_ENCRYPTION=true 消失了,但是原始错误仍然存​​在。 JZ0LA:无法实例化 Cipher 对象。转换 RSA/NONE/OAEPWithSHA1AndMGF1Padding 未实现

终于成功了!由于该流程在 Anypoint Studio 中运行,因此这意味着 jars 是正确的,但数据库配置的测试连接未进入其类路径。可能是一些类加载器问题。因此,我在 Internet 上搜索了将此 jar 放入路径的位置,以便数据库配置可以加载和使用它。发现在文件 %MULE_HOME%/conf/wrapper.conf.template 中有设置 jar 类路径的属性。我将这个 BouncyCastle jar 放在库路径中,然后它就可以工作了。在我的例子中,图书馆路径是在 %MULE_HOME%/lib/boot,所以除了保持在 %MULE_HOME%/lib/usr,我还把它放在这里。 然后成功了