使用 jTDS 驱动程序通过 Android Studio 连接到 Azure DB 时出现问题
我正在尝试使用 Android Studio 中的 jTDS 驱动程序版本 1.2.7 连接到 Azure DB。我收到此错误:“SQL 错误:原因:由于客户端 TLS 版本低于服务器允许的最低 TLS 版本,登录失败。”已尝试更改 Azure 上的 TLS 版本,但仍然遇到相同的错误。我还尝试将 ssl=request 添加到连接字符串的末尾,但最终出现另一个错误:
AndroidRuntime: FATAL EXCEPTION: main
Process: com.capstone.rideshareapp, PID: 6440
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/sun/net/ssl/SSLContext;
at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.factory(SocketFactoriesSUN.java:174)
at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.getFactory(SocketFactoriesSUN.java:157)
at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.createSocket(SocketFactoriesSUN.java:86)
at net.sourceforge.jtds.jdbc.SharedSocket.enableEncryption(SharedSocket.java:332)
at net.sourceforge.jtds.jdbc.TdsCore.negotiateSSL(TdsCore.java:554)
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:350)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:188)
at java.sql.DriverManager.getConnection(DriverManager.java:580)
at java.sql.DriverManager.getConnection(DriverManager.java:236)
at com.capstone.rideshareapp.MainActivity.connectionClass(MainActivity.java:68)
at com.capstone.rideshareapp.MainActivity.onCreate(MainActivity.java:42)
at android.app.Activity.performCreate(Activity.java:7802)
at android.app.Activity.performCreate(Activity.java:7791)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.sun.net.ssl.SSLContext" on path: DexPathList[[zip file "/data/app/com.capstone.rideshareapp-c0eguH-FO1sEfSOTqUd8qw==/base.apk"],nativeLibraryDirectories=[/data/app/com.capstone.rideshareapp-c0eguH-FO1sEfSOTqUd8qw==/lib/x86, /system/lib, /system/product/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.factory(SocketFactoriesSUN.java:174)
at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.getFactory(SocketFactoriesSUN.java:157)
at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.createSocket(SocketFactoriesSUN.java:86)
at net.sourceforge.jtds.jdbc.SharedSocket.enableEncryption(SharedSocket.java:332)
at net.sourceforge.jtds.jdbc.TdsCore.negotiateSSL(TdsCore.java:554)
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:350)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:188)
at java.sql.DriverManager.getConnection(DriverManager.java:580)
at java.sql.DriverManager.getConnection(DriverManager.java:236)
at com.capstone.rideshareapp.MainActivity.connectionClass(MainActivity.java:68)
at com.capstone.rideshareapp.MainActivity.onCreate(MainActivity.java:42)
at android.app.Activity.performCreate(Activity.java:7802)
at android.app.Activity.performCreate(Activity.java:7791)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
我也无法找出导致此错误的原因。除了尝试 jTDS 驱动程序之外,我还尝试了 Microsoft JDBC 驱动程序,但仍然遇到我似乎无法弄清楚的错误。 JDBC 驱动程序的错误是这样的:“SQL 错误:驱动程序无法使用安全套接字层 (SSL) 加密建立与 SQL Server 的安全连接。错误:“套接字已关闭”。ClientConnectionId”
build.gradle (: app) :
plugins {
id 'com.android.application'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.capstone.rideshareapp"
minSdkVersion 24
targetSdkVersion 30
versionCode 1
versionName "1.0"
// multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
// def multidex_version = "2.0.1"
// implementation "androidx.multidex:multidex:$multidex_version"
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation files('libs/jtds-1.2.7.jar')
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
MainActivity.java :
package com.capstone.rideshareapp;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class MainActivity extends AppCompatActivity {
// db connection string
static private final String connectionURL = "jdbc:jtds:sqlserver://myschooldata.database.windows" +
".net:1433;DatabaseName=MySchoolData;sslProtocol=TLSv1;user=*****@myschooldata;password=******;" +
"encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows" +
".net;loginTimeout=30;";
static protected Connection connection = null;
Button signUpBtn;
Button loginBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
connectionClass();
signUpBtn = findViewById(R.id.signUpBtn);
signUpBtn.setOnClickListener(v -> switchToRegister());
loginBtn = findViewById(R.id.loginBtn);
loginBtn.setOnClickListener(v -> switchToLogin());
}
private void switchToRegister() {
Intent switchToCreateAccount = new Intent(this, CreateAccount.class);
startActivity(switchToCreateAccount);
}
private void switchToLogin() {
Intent switchToLogin = new Intent(this, Login.class);
startActivity(switchToLogin);
}
// can be called in another activity using MainActivity.connectionClass()
@SuppressLint("NewApi")
static protected void connectionClass() {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
connection = DriverManager.getConnection(connectionURL);
Log.i("Connected", "It works");
}
catch (SQLException se) {
Log.e("SQL Error", se.getMessage());
}
catch (ClassNotFoundException e) {
Log.e("Loading Error", e.getMessage());
}
catch (Exception e) {
Log.e("Error", e.getMessage());
}
}
}
作为澄清,当使用不同的驱动程序时,我更改了连接字符串、所用驱动程序的依赖项和 Class.forName()。
有谁知道为什么在尝试不同的可能解决方案后,我不断收到 jTDS 驱动程序或 JDBC 驱动程序的这些错误?
I am trying to connect to Azure DB with the jTDS Driver version 1.2.7 in Android Studio. I got this error: "SQL Error: Reason: Login failed due to client TLS version being less than minimal TLS version allowed by the server." Already tried changing the TLS version on Azure and still got the same error. I also tried adding ssl=request to the end of the connection string, but I end up getting another error:
AndroidRuntime: FATAL EXCEPTION: main
Process: com.capstone.rideshareapp, PID: 6440
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/sun/net/ssl/SSLContext;
at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.factory(SocketFactoriesSUN.java:174)
at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.getFactory(SocketFactoriesSUN.java:157)
at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.createSocket(SocketFactoriesSUN.java:86)
at net.sourceforge.jtds.jdbc.SharedSocket.enableEncryption(SharedSocket.java:332)
at net.sourceforge.jtds.jdbc.TdsCore.negotiateSSL(TdsCore.java:554)
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:350)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:188)
at java.sql.DriverManager.getConnection(DriverManager.java:580)
at java.sql.DriverManager.getConnection(DriverManager.java:236)
at com.capstone.rideshareapp.MainActivity.connectionClass(MainActivity.java:68)
at com.capstone.rideshareapp.MainActivity.onCreate(MainActivity.java:42)
at android.app.Activity.performCreate(Activity.java:7802)
at android.app.Activity.performCreate(Activity.java:7791)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.sun.net.ssl.SSLContext" on path: DexPathList[[zip file "/data/app/com.capstone.rideshareapp-c0eguH-FO1sEfSOTqUd8qw==/base.apk"],nativeLibraryDirectories=[/data/app/com.capstone.rideshareapp-c0eguH-FO1sEfSOTqUd8qw==/lib/x86, /system/lib, /system/product/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.factory(SocketFactoriesSUN.java:174)
at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.getFactory(SocketFactoriesSUN.java:157)
at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.createSocket(SocketFactoriesSUN.java:86)
at net.sourceforge.jtds.jdbc.SharedSocket.enableEncryption(SharedSocket.java:332)
at net.sourceforge.jtds.jdbc.TdsCore.negotiateSSL(TdsCore.java:554)
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:350)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:188)
at java.sql.DriverManager.getConnection(DriverManager.java:580)
at java.sql.DriverManager.getConnection(DriverManager.java:236)
at com.capstone.rideshareapp.MainActivity.connectionClass(MainActivity.java:68)
at com.capstone.rideshareapp.MainActivity.onCreate(MainActivity.java:42)
at android.app.Activity.performCreate(Activity.java:7802)
at android.app.Activity.performCreate(Activity.java:7791)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
I haven't been able to figure out what has been causing this error either. On top of trying the jTDS Driver, I've also tried the Microsoft JDBC Driver and still run into errors that I seem to not be able to figure out either. The error with the JDBC Driver is this: "SQL Error: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "Socket is closed". ClientConnectionId"
build.gradle (:app) :
plugins {
id 'com.android.application'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.capstone.rideshareapp"
minSdkVersion 24
targetSdkVersion 30
versionCode 1
versionName "1.0"
// multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
// def multidex_version = "2.0.1"
// implementation "androidx.multidex:multidex:$multidex_version"
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation files('libs/jtds-1.2.7.jar')
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
MainActivity.java :
package com.capstone.rideshareapp;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class MainActivity extends AppCompatActivity {
// db connection string
static private final String connectionURL = "jdbc:jtds:sqlserver://myschooldata.database.windows" +
".net:1433;DatabaseName=MySchoolData;sslProtocol=TLSv1;user=*****@myschooldata;password=******;" +
"encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows" +
".net;loginTimeout=30;";
static protected Connection connection = null;
Button signUpBtn;
Button loginBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
connectionClass();
signUpBtn = findViewById(R.id.signUpBtn);
signUpBtn.setOnClickListener(v -> switchToRegister());
loginBtn = findViewById(R.id.loginBtn);
loginBtn.setOnClickListener(v -> switchToLogin());
}
private void switchToRegister() {
Intent switchToCreateAccount = new Intent(this, CreateAccount.class);
startActivity(switchToCreateAccount);
}
private void switchToLogin() {
Intent switchToLogin = new Intent(this, Login.class);
startActivity(switchToLogin);
}
// can be called in another activity using MainActivity.connectionClass()
@SuppressLint("NewApi")
static protected void connectionClass() {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
connection = DriverManager.getConnection(connectionURL);
Log.i("Connected", "It works");
}
catch (SQLException se) {
Log.e("SQL Error", se.getMessage());
}
catch (ClassNotFoundException e) {
Log.e("Loading Error", e.getMessage());
}
catch (Exception e) {
Log.e("Error", e.getMessage());
}
}
}
As a clarification, when using the different drivers, I changed the connection strings, the dependency for the used driver, and the Class.forName().
Does anyone know why, after trying different possible solutions, I keep getting these errors for either the jTDS Driver or the JDBC Driver?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论