Does MSSQL JDBC utilize server aliases - sql-server

I am preparing for a SQL Server database migration. I would like to use the alias functionality from the SQL Server Native Client, configured with cliconfg.exe, to redirect my client applications to the new server. I am using this in conjunction with DNS aliases so I can redirect the connection to a new port. However, my applications use MSSQL JDBC instead of the native client.
Does MSSQL JDBC use the alias settings from the native client? Is it, by chance, a wrapper over the native client functionality? Both are provided by Microsoft. If not, does MSSQL JDBC have an equivalent client-hosted server name redirect functionality? How is this configured?
I did some preliminary testing with the native client settings and it seems like the JDBC driver does not utilize the alias. However, the naming schemes are a bit different between the two so I may not have had the names correct. I am referring to jdbc:sqlserver://servername:port compared to servername,port in the alias tool.

I asked the mssql-jdbc team and at this time (Dec 2022) the driver does not support aliases.

Related

Which query protocol does Wso2 Identity Server use to communicate with PostgreSQL Database?

I need to know which "query protocol" Wso2 Identity Server is using to connect with PostgreSQL Database.
Thanks in advance.
WSO2 is using Postgress JDBC Driver to connect to Postgress Database, hence does not explicitly handle connections. As per the Postgres documentation, the following is the default protocol that's being used.
The driver supports the V3 frontend/backend protocols. The V3 protocol was introduced in 7.4 and the driver will by default try to connect using the V3 protocol.
Also, it seems you can set the protocol version as a JDBC connection property as well. So you should be able to change this by adding this to Datasource configurations.

Is there anything I can use as a proxy to connect to a SQL Server (on TLS v1.2) from a legacy application which uses only TLS v1?

We have a legacy application (vendor product) which we don't have source for, which connects to a MS SQL Server 2008 using TLS v1. Now there is a mandate to move all connectivity to TLS v1.2. We are able to upgrade SQL Server to a version supporting TLS v1.2, but not the legacy application.
I have tried using stunnel running on the same host as the legacy app (so the legacy app connects to stunnel to route the connection to the db). This doesn't seem to work as SQL Server uses TDS to negotiate instead of TLS. So the connection doesn't go thru.
Is there anything else I can try to make it work? Or if someone has been able to make stunnel work with SQL Server?
Regards,
Vinay

Authenticating to a SQL Server instance as a Windows User via JDBC

I'm having to support multiple database types for my tenant-enabled web application. Among others, I have successfully supported Microsoft's SQL Server, by using the net.sourceforge.jtds.jdbc.Driver class with a connection String like "jdbc:jtds:sqlserver://192.168.1.189:1433/ApplicationName". This works, but it requires that the user explicitly defines a user in the SQL Server instance and enables SQL Server authentication.
Now, inevitably, requirements changed, and we're supposed to support connecting to SQL Server via Windows Authentication. Evidently this requires some sort of change to the connection string, since the data base server must somehow be able to distinguish whether the credentials passed into the data base connection are for a user defined in the SQL Server installation or in the Windows OS. But what is it?
Acting on advice from the internet, if progressed as far as extending the connection string with ;useNTLMv2=true;domain=WORKGROUP. That seems to make the data base server aware that I want to authenticate as a Windows user, but the actual log-in fails with
The login is from an untrusted domain and cannot be used with Windows authentication. (code 18452, state 28000)
Now im my testing set-up, both the J2EE app and the SQL server instance are in fact on the same machine (although in production they may not be), and still this computer isn't trusted enough to log on to itself? Evidently I'm missing a big part of the puzzle here. What does one have to do to convince an SQL Server instance that the user who started it can in fact log on to it via JDBC?
Edit
Since we have already sunk too much unsuccessful effort trying to integrate our web application with a full Microsoft infrastructure stack (SQL Server, Active Directory, Domain Name Service...), I have to restrict this question:
Does anyone know a way to access an SQL Server installation with a user account defined as a "Windows User" via JDBC form a J2EE application, without having to use Active Directory, a Windows machine running the web application and a proprietary DLL? The bounty is for any solution of that sub-problem. The entire problem is clearly too broad to be answered in one forum post.
I ran into the error
The login is from an untrusted domain and cannot be used with Windows
authentication
when a 2012 SQL Server DB instance was recently upgraded to 2016. In order to use AD based authentication with the JTDS driver and SQL Server 2016, it seems necessary to specify both the useNTLMv2=true and the domain=example.com suffix in order to establish a connection. The name of the domain is absolutely necessary and I confirmed that through testing. This is with JTDS driver version 1.3.1.
Example of a working connection string using AD based authentication to SQL Server 2016 DB with JTDS 1.3.1:
jdbc:jtds:sqlserver://sqlserver2016db.example.com/MY_DB_NAME;domain=example.com;prepareSQL=2;useNTLMv2=true
UPDATE
Recently (due to the pandemic lockdown), I found myself also having to connect to SQL Server using Windows authentication from a non-domain computer (over VPN). This can be accomplished by starting the Windows process initiating the SQL Server connection, e.g. Eclipse / Spring Tool Suite, with the following command:
C:\Windows\System32\runas.exe /netonly /user:domain\user "path_to_executable.exe"
Source: https://www.mssqltips.com/sqlservertip/3250/connect-to-sql-servers-in-another-domain-using-windows-authentication/
In discovering that gem, I also discovered that encryption needed to be used. Here are the settings I'm using (in addition to now running the executable with /netonly and a domain account):
spring.datasource.url=jdbc:jtds:sqlserver://fqdn_of_server_including_domain/DBNAME;domain=mydomain;useNTLMv2=true;ssl=require;prepareSQL=2;
spring.datasource.username=domainaccountname_without_domain_prefix
spring.datasource.password=password
spring.datasource.testOnBorrow=true
spring.datasource.hikari.connection-test-query=SELECT 1
spring.jpa.database-platform=org.hibernate.dialect.SQLServerDialect
What you describe certainly appears to be feasible. I have SQL Server 2008 R2 Express running on a stand-alone server and I was able to connect using a Windows username/password on that server via jTDS 1.3.1 from a separate Windows machine and from an Xubuntu 14.04 box.
On the machine running SQL Server I created a Windows user named 'kilian'. In SQL Server itself I created a SQL Login for NT AUTHORITY\Authenticated Users. Then in the database (named 'myDb') I created a User named 'AuthenticatedUsers' for that SQL Login. Just to keep things simple I gave that user db_owner rights on the database.
There is no SQL Login for 'kilian' and no database User with that name.
Then, from the other two machines (the Windows workstation and the Xubuntu box) I just ran this:
package com.example.jtdstest;
import java.sql.*;
public class JtdsTestMain {
public static void main(String[] args) {
try (Connection con = DriverManager.getConnection(
"jdbc:jtds:sqlserver://192.168.1.137:52865/myDb" +
";domain=whatever",
"kilian",
"4theBounty")) {
try (Statement s = con.createStatement()) {
String sql = "SELECT LastName FROM Clients WHERE ID=1";
try (ResultSet rs = s.executeQuery(sql)) {
rs.next();
System.out.println(rs.getString("LastName"));
}
}
} catch (Exception e) {
e.printStackTrace(System.out);
}
}
}
Additional notes:
I did not have to include useNTLMv2=true. I was able to connect with or without that parameter.
I did have to include domain= to tell the SQL Server not to use SQL authentication, but the actual value I supplied made no difference. (I literally used 'whatever', which was not the name of the server or the name of the workgroup to which it belongs.)
Alternative Method
The alternative solution is to utilize integrated security. This enables your application to connect to the database as the user in which the application is currently running as. This is enabled by adding integratedSecurity=true; into the connection string properties. If you run into any trouble, make sure the sqljdbc_auth.dll is accessible via classpath or within your app library.
Security Note
You're probably already aware, but just have to say make sure not to grant access to "Authenticated Users" to your database as previously suggested as part of the demonstration. Identify which user account your application runs as and grant access to only that specific user in your database server.
Sources / Additional Info
MSDN Doc on JDBC Connection String Configuration (http://technet.microsoft.com/en-us/library/ms378428(v=sql.110).aspx)
The main problem is the windows authentication with a full java solution (no DLL). So you could use one of the libs below:
NTLM authentication: http://ioplex.com/jespa.html
spring based Kerberos authentication: http://projects.spring.io/spring-security-kerberos/
another integrated windows auth lib is SPNEGO (don't know much about this one)
So once your app is authenticated with one of the lib above, your JDBC should run fine using "integratedSecurity=true;" and if needed "authenticationScheme=JavaKerberos".
Firstly you should write the jdbc connection like this:
String url ="jdbc:sqlserver://PC01\inst01;databaseName=DB01;integratedSecurity=true";
then
you need to enable the SQL Server TCP/IP Protocol in Sql Server Configuration Manager app. You can see the protocol in SQL Server Network Configuration.
I can see two possibilities,
1. You are using a local system account which the server won't understand
In this case, switch to a domain account.
Windows authentication has different credential requirements and you might not be meeting those.
In this case try changing the password to match the requirements.
It is very well possible that both are happening.
see this other SO post that describes how to connect to a SQL Server with Windows Authentication from a Linux machine through JDBC
This is my NiFi setup for jTDS driver:
Database Connection URL: jdbc:jtds:sqlserver://192.168.1.189:1433;DOMAIN=domain_name
I didn't need to add useNTLMv2=true, but most people need to, so if it doesn't work you can try also:
jdbc:jtds:sqlserver://192.168.1.189:1433;DOMAIN=domain_name;useNTLMv2=true
Database Driver Class Name: net.sourceforge.jtds.jdbc.Driver
Database User: domain_user_name (**without** #domain)
Password: domain_password
Validation query: select 1
One of the possible reasons for this error to appear is when you configure you data source to use windows authentication and SQL Server is using Extended Protection mode together with SSL (i'm not sure if SSL is required though). This mode requires the client to send additional information - signed service principal name (SPN) and channel binding token (CBT). See more information about Extended Protection Mode here. Currently both JTDS JDBC and Microsoft JDBC drivers do not support this mode. I couldn't find an official statement from JTDS, but there is an open ticket for Microsoft drivers.
In order to configure Extended Protection mode, go to SQL Server Configuration Manager, select properties on SQL Server Network Configuration -> Protocols for %your instance% and change Extended Protection option.

JDBC connect to MSSQL named instance with non-standard port

Hello guys I'm working on a project and I'm trying to connect JIRA to a MSSQL aliased or named instance. Checkout here if you don't know what i'm talking about.
Under this setup, for example, when you want to connect to a specific DB server, let's say using SQL Studio, you have to use "servername,port" as in the mssql server alias configuration, that reflects the DB instance.
What would be the connection string to use under this circunstances?
I've read about issues with this kind of setup as I'm using the JDBC driver (JIRA uses it). You can try with SQuirreL for testing this, as it uses the same driver.
Cheers!
For SQL Server JDBC you either connect to the named instance or to a specific port. If you specify both named instance and port, it will ignore the instance name.
If you want to connect to a named instance which is not running on the default port, you will need to have the SQL Server Browser service running on the server, this allows the JDBC driver to lookup the right port based on the instance name. I believe this service by default is disabled.

How to connect to SQL Server through proxy server

Is it possible to connect to SQL Server server through proxy (http) using SQLSERVER oledb provider?
How can I specify proxy address and port in connection string if it's possible?
What nonstandard methods to bypass proxy you'd recommend if it's not possible?
This article seems specific to MS ISA servers, but the theory may hold.
2008
http://msdn.microsoft.com/en-us/library/ms190801.aspx
2005
http://msdn.microsoft.com/en-us/library/ms190801(SQL.90).aspx
edit:
Perhaps a sql 2005 web service would fit your needs?
http://technet.microsoft.com/en-us/library/ms345140(SQL.90).aspx
It won't give you normal odbc functionality though. You shouldn't be exposing your SQL server to the internet btw.
Also, see comment.

Resources