我与数据库的 JDBC 连接是不是使用 SSL?

Posted

技术标签:

【中文标题】我与数据库的 JDBC 连接是不是使用 SSL?【英文标题】:Does my JDBC connection to the database use SSL or not?我与数据库的 JDBC 连接是否使用 SSL? 【发布时间】:2011-09-05 19:06:51 【问题描述】:

如何知道与 SQL 服务器的 JDBC 连接是否安全(即使用 SSL)?

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

【问题讨论】:

它是特定于数据库的,是的,所以你必须在你的问题中具体。 【参考方案1】:

尝试这些链接以获取信息:

    mysql : http://www.razorsql.com/articles/mysql_ssl_jdbc.html

    甲骨文:http://www.dbforums.com/oracle/1620651-ssl-connection-jdbc-thin-driver.html

    PostgreSQL : http://archives.postgresql.org/pgsql-jdbc/2003-08/msg00110.php

    MS SQL 服务器:http://download.oracle.com/docs/cd/E12840_01/wls/docs103/jdbc_drivers/mssqlserver.html

【讨论】:

在不添加任何上下文的情况下发布到其他网站的链接究竟对任何人有什么帮助? 我发布了这些链接以寻求他的帮助。如果该主题需要一些讨论[因为他没有指定他的数据库类型],我想发布相关链接,而不是撰写长答案。 好吧,这不是 SO 的工作方式。如果您必须链接到其他网站,请这样做,但您不能含糊其辞。这些网站都不会具体解决这个问题,尽管它们确实包含一些一般信息。 嗯,我的印象是,在 SO 中,您可以以任何方式帮助人们,而不会真正越界 [阅读为冒犯]。我不知道,如果您不知道答案,则不允许发布指向相关网站的链接。感谢知识转移。从现在开始,如果我看到有人在没有上下文的情况下发布链接,我会关注你。 您会发现this discussion on Meta 很有用。【参考方案2】:

在我看来,确保客户端和服务器之间的 SSL 连接的一种快速、安全且供应商中立的方法是使用s-tunnel。

s-tunnel(有时也称为“stunnel”)为您提供了很大的灵活性,例如相互身份验证等,并且仍然允许安装在 DB Server 上的应用程序通过非 SSL 连接与其通信(例如 SQL Server允许以三种模式连接(SSL OFF、SSL Optional 或 SSL Only)。

使用 s-tunnel 您的连接将被路由如下:

jdbc -> local s-tunnel port -> server's s-tunnel port -> server's database port.

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

【讨论】:

你说的相互认证,是不是说sql server和应用都有证书? 正确。这是我设法与 SQL Server 建立连接的唯一方法,主机确保它正在与受信任的客户端通信,客户端确保它确实在与正确的服务器通信,尽管 s-tunnel 不会强迫你有两个证书。 附言。我使用的是 SQL Server 2005,不想影响服务器端应用程序的性能。【参考方案3】:

是否所有的 jdbc 驱动程序都支持 ssl 连接到 db 服务器并且 ssl 的使用仅取决于特定的 db 供应商?

JDBC 规范不强制要求支持 SSL/TLS。所以你不能指望每个驱动程序都有它。

可以从 JDBC URL 推断出数据库服务器上的 SSL 配置,但这不必是确定性的。在 Oracle 的情况下,如果您注意到 URL 包含一个连接字符串,该字符串指示正在使用的协议是 TCPS 而不是 TCP,这表明使用了 SSL/TLS。如果您这样做是为了验证安全配置,我会称您为草率。

单独验证客户端配置以确定数据库服务器是否接受通过 SSL 的连接是不明智的,尤其是在不允许非 SSL 连接的情况下。验证 SSL/TLS 配置的机制因数据库而异,但在每种情况下都会有适当的安全指南来配置数据库。

但是,如果您想进行快速测试以验证连接是否通过 SSL/TLS,那么您只需要知道 SSL/TLS 安全连接是通过握手启动的。如果您没有看到任何内容,则说明您的驱动程序未使用 SSL/TLS。您需要为此嗅探网络流量(确保您有权这样做)。当然,如果连接池正在使用中,则建立案例需要更长的时间,因为池中的物理连接可能会一次又一次地重用(没有建立新的连接)。同样,您可能也会发现 nmap 很有用,但我从未将它用于此目的。

【讨论】:

@Vineet:你说的让我很困惑。如果我希望看到 SSL 握手(以验证安全性),我猜这意味着至少服务器有一个证书,这也是被客户端应用程序认为是受信任的。要被认为是受信任的,应用程序必须已配置为信任它(我猜是我猜的)。所以如果我与 SQL 服务器有连接并且我没有进行此类(证书)配置,我不能推断连接不是通过 SSL 吗? @user384706,您具体指的是 MSSQL 服务器吗?还是一般的任何 RDBMS?如果您使用 JDBC 并且必须配置信任,则通常会涉及 JSSE 配置。简而言之,您将不得不担心配置您的信任库。如果根 CA 证书已经被信任,那么在客户端上,除了配置连接池和可能添加驱动程序所需的库之外,几乎没有什么可做的。如果您使用的是应用程序服务器,管理员可能已经为您完成了这项工作。续。 例如,请参阅this WLS related 文章,了解如何为瘦 Oracle 驱动程序启用 SSL。您会注意到 WLS 的配置几乎是微不足道的。 @Vineet:是的,我的兴趣主要是在 MS-SQL 服务器上 @Vineet,据我所知,一些 JDBC 连接,包括带有 TCPS 的 Oracle,在发生一些纯文本 JDBC 交换后升级到 TLS(类似于 SMTP 中的STARTTLS )。在这种情况下,连接本身不会以握手开始,因此您必须先查看更多流量才能看到它。这并不总是显而易见的。

以上是关于我与数据库的 JDBC 连接是不是使用 SSL?的主要内容,如果未能解决你的问题,请参考以下文章

使用 JDBC Thin 和 JKS 的 Oracle 数据库 TLS1.2/SSL 连接

JDBC SSL连接MySQL

使用 Hibernate、Spring 和 JDBC 配置 SSL 证书

mysql使用jdbc连接增加ssl认证

5. JDBC之数据库连接池——Part1

尝试通过 JDBC 与 Postgres 建立 SSL 连接时出现 PSQLException“无法打开 SSL 根证书文件”