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,我还把它放在这里。
然后成功了
我们的目标是从 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,我还把它放在这里。 然后成功了