我们的目标是从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作为项目/外部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数据库配置未获取此类文件。我查看了互联网,它说要在java.security文件中指定提供者。SOF上的另一个帖子。我也这样做过。尽管如此,它仍然无法在Anypoint Studio中工作。若你们中有人在过去成功地做到了,请分享这个想法。
[Update 1]我在Anypoint Studio流中添加了Invoke Static Moulde,它正在工作。所以接下来尝试在数据库配置(全局元素(中给出相同的设置,但它现在在TestConnection上给出了新的错误。我已经更改了提供程序,它从InvokeStatic流开始工作。
调用静态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
但当我在数据库配置中进行相应设置时,如下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}}''
现在正在调查,为什么会出现这种错误?
[Update 2]通过添加&RETRY_WITH_NO_ENCRYPTION在URL中为true,但原始错误仍然存在。JZ0LA:未能实例化密码对象。转换RSA/NONE/OAEWithSHA1AndMGF1填充未实现
终于开始工作了!由于流在AnypointStudio中工作,因此这意味着jar是正确的,但数据库配置的测试连接没有进入其类路径。可能是类加载器的问题。因此,我在互联网上搜索了将这个jar放入路径的位置,以便数据库配置可以加载和使用它。发现在文件%MULE_HOME%/conf/wrapper.conf中有一些属性可以设置jar的类路径。我把这个BouncyCastle罐子放在图书馆的小路上,然后它就工作了。在我的例子中,librbary路径位于%MULE_HOME%/lib/boot,所以除了位于%MULE_HOME%/lib/usr之外,我也保留在这里。然后它工作