java - 使用 MS SQL Server 的 DriverManager 上的 ExceptionInInitializerError

标签 java sql-server jdbc securityexception

我正在尝试使用 JDBC 连接到 MS SQL Server 数据库,并在这一行上:

String connectionUrl = "jdbc:" + url + ";user=dummy;password=dummy;";
conn = DriverManager.getConnection(connectionUrl);

我收到了一个巨大的错误文本墙:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at javax.crypto.JceSecurityManager.<clinit>(JceSecurityManager.java:65)
    at javax.crypto.Cipher.getConfiguredPermission(Cipher.java:2543)
    at javax.crypto.Cipher.getMaxAllowedKeyLength(Cipher.java:2567)
    at sun.security.ssl.CipherSuite$BulkCipher.isAvailable(CipherSuite.java:548)
    at sun.security.ssl.CipherSuite$BulkCipher.isAvailable(CipherSuite.java:527)
    at sun.security.ssl.CipherSuite.isAvailable(CipherSuite.java:194)
    at sun.security.ssl.SSLContextImpl.getApplicableCipherSuiteList(SSLContextImpl.java:350)
    at sun.security.ssl.SSLContextImpl.getDefaultCipherSuiteList(SSLContextImpl.java:308)
    at sun.security.ssl.SSLSocketImpl.init(SSLSocketImpl.java:607)
    at sun.security.ssl.SSLSocketImpl.<init>(SSLSocketImpl.java:549)
    at sun.security.ssl.SSLSocketFactoryImpl.createSocket(SSLSocketFactoryImpl.java:110)
    at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:1606)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1323)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:991)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:827)
    at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1012)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:270)
    at BusinessManager.Session.<init>(Session.java:33)
    at BusinessManager.BusinessManager.getSession(BusinessManager.java:172)
    at example.Example.ConfigureEnvironment(Example.java:198)
    at example.Example.main(Example.java:50)
Caused by: java.lang.SecurityException: Can not initialize cryptographic mechanism
    at javax.crypto.JceSecurity.<clinit>(JceSecurity.java:89)
    ... 22 more
Caused by: java.lang.SecurityException: Cannot locate policy or framework files!
    at javax.crypto.JceSecurity.setupJurisdictionPolicies(JceSecurity.java:254)
    at javax.crypto.JceSecurity.access$000(JceSecurity.java:48)
    at javax.crypto.JceSecurity$1.run(JceSecurity.java:81)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.crypto.JceSecurity.<clinit>(JceSecurity.java:78)
    ... 22 more

我跟踪了几个链接,确保服务器和客户端都使用相同的 JDK (1.8.0_20)。 我还下载了“JCE Unlimited Strength Jurisdiction Policy Files”并将它们放入 JDK 中。我也关注了这个link但我不确定是否应该干预 JDK 的“java.policy”文件...

最佳答案

根据该错误,我的猜测是您正在尝试使用 SSL 加密 session 连接到 SQL,但在 SQL Server 上使用自签名证书。每Connecting with SSL Encryption :

When the encrypt property is set to true and the trustServerCertificate property is set to true, the Microsoft JDBC Driver for SQL Server will not validate the SQL Server SSL certificate. This is usually required for allowing connections in test environments, such as where the SQL Server instance has only a self signed certificate.

尝试使用:

String connectionUrl = "jdbc:" + url + ";user=dummy;password=dummy;encrypt=true;trustServerCertificate=true;";

此外,您的 url 变量内容应以 sqlserver:// 开头。

关于java - 使用 MS SQL Server 的 DriverManager 上的 ExceptionInInitializerError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26701977/

相关文章:

java - Scala - Java 互操作 : can Scala emit enums in bytecode for Java to consume?

java - 如何使用 java sdk 将新的 EBS 卷附加到现有的 EC2 实例?

java - 在 android 中解析此类 url 的最佳方法是什么

sql-server - SQL Server 应用程序角色

mysql - 如何通过检查Excel中的列使用vba从access中提取数据到excel

sql-server - 如何使用XQuery模拟STRING_AGG()(分组字符串连接)?

java - 使用JDBC和MySQL解决“通信链接失败”问题

java - appspot xmpp 与 jabber.org 交谈

mysql - mysql 的 jdbc url 不适用于 IP 地址

java - mybatis foreach collection是一个map-parameter中的list