我的JDBC连接到数据库是否使用SSL?

46

如何确定 JDBC 连接到 SQL 服务器是否安全(即使用 SSL)?

例如,从 URL 上很明显吗?所有 JDBC 驱动程序都支持与数据库服务器的 SSL 连接,还是 SSL 的使用仅取决于特定的数据库供应商?


2
这是针对特定数据库的,所以你在提问时必须具体说明。 - skaffman
2个回答

27
所有JDBC驱动程序都不支持SSL/TLS连接到数据库服务器,而且使用SSL与否取决于特定的数据库供应商。
JDBC规范中没有强制要求支持SSL/TLS。因此您不能期望每个驱动程序都支持SSL/TLS。
可以从JDBC URL推断出数据库服务器上的SSL配置,但这未必是确定性的。在Oracle的情况下,如果您注意到URL包含的连接字符串指示正在使用的协议是TCPS而不是TCP,则表明使用了SSL/TLS。如果您想要验证安全配置,则我会认为您的做法不够谨慎。
仅通过验证客户端配置来确定数据库服务器是否接受SSL连接是不明智的,尤其是如果禁止非SSL连接。验证SSL/TLS配置的机制将因数据库而异,但在每种情况下都会有适当的安全指南来配置数据库。
如果您想进行快速测试以验证连接是否通过SSL/TLS进行,请知道SSL/TLS保护的连接是通过握手启动的。如果没有看到任何握手,则表示您的驱动程序未使用SSL/TLS。对此,您需要嗅探网络流量(确保您有授权)。当然,如果使用连接池,则建立连接可能需要更长时间,因为连接池中的物理连接可能会反复重用(而不会设置新连接)。同样,您也可能发现nmap很有用,但我从未将其用于此目的。

@user384706,您是指特定的MSSQL服务器吗?还是一般的关系型数据库?如果您正在使用JDBC并且必须配置信任,则通常涉及JSSE配置。简单来说,您需要担心配置您的信任存储库。如果根CA证书已经受信任,则在客户端上除了配置连接池和可能添加驱动程序所需的库之外,几乎没有什么可做的了。如果您正在使用应用程序服务器,则管理员可能已经为您完成了此操作。续。 - Vineet Reynolds
@Vineet:是的,我的兴趣主要在于MS-SQL服务器。 - Cratylus
1
据我所知,包括使用TCPS的Oracle在内的一些JDBC连接,在进行了一些明文JDBC交换之后会升级到TLS(类似于SMTP中的STARTTLS)。在这种情况下,连接本身不会以握手开始,因此您需要查看更多的流量才能看到它。这并不总是显而易见的。@Vineet - Bruno
@Bruno,没错。这就是为什么它被推荐作为一种快速测试,更多地依赖于直觉而不是具体细节。 - Vineet Reynolds
我不确定MSSQL,但是Oracle的一些JDBC默认值并不特别安全。特别是,oracle.net.ssl_server_dn_match默认为false - Bruno
显示剩余3条评论

5
在我看来,确保客户端和服务器之间的SSL连接快速、安全且厂商中立的方式是使用s-tunnel(有时也称为“stunnel”)(官网链接)。s-tunnel提供了许多灵活性,例如双向身份验证等功能,并仍然允许安装在数据库服务器上的应用程序通过非SSL连接与其通信(例如,SQL Server允许以三种模式进行连接(SSL关闭、SSL可选或SSL Only))。使用s-tunnel,您的连接将被路由到类似这样的形式:
jdbc -> local s-tunnel port -> server's s-tunnel port -> server's database port.

通过设置具有相关防火墙规则的stunnel,您可以确信远程连接到数据库正在使用SSL。


当你说相互认证时,这意味着SQL Server和应用程序都有证书吗? - Cratylus
正确。这是我成功连接到SQL Server的唯一方法,同时保证主机正在与可信客户端通信,客户端确保它确实正在与正确的服务器通信,尽管s-tunnel不强制要求您拥有两个证书。 - ifx
PS. 我使用的是 SQL Server 2005,不想影响我的服务器端应用程序的性能。 - ifx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接