暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

通过 JDBC 和 SSL 保护您的 Java 应用程序与灵活服务器的连接

原创 CiciLee 2022-07-28
995

安全的应用程序连接对我们的客户很重要。 Azure 上的 Postgres 灵活服务器默认需要安全连接。 在这篇文章中,我们将向您解释如何使用 JDBC 和 SSL 设置从 Java 应用程序到灵活服务器的安全连接。
图片.png

Java 数据库连接 - JDBC

Java 数据库连接 (JDBC) 是一种应用程序编程接口 (API),它允许程序员连接数据库并与之交互。 它提供了通过 SQL 的 CREATE、UPDATE、DELETE 和 INSERT 等更新语句和 SELECT 等查询语句来查询和更新数据库中数据的方法。 此外,JDBC 可以运行存储过程。

JDBC API 使用 Java 标准类和接口来连接数据库。 为了使用 JDBC 将 Java 应用程序连接到特定的数据库服务器,需要支持该数据库服务器的 JDBC API 的 JDBC 驱动程序。 您可以通过下载页面在 postgresql.org 网站上下载最新版本的驱动程序。 下图显示了 JDBC 堆栈的高级架构:

图片.png

图 1:JDBC 高级架构

在服务器上配置 SSL

使用 Azure Database for PostgreSQL - 作为 Azure 中的 PaaS 服务的灵活服务器强制使用传输层安全性 (TLS) 将客户端应用程序连接到 PostgreSQL 服务。 TLS 是一种行业标准协议,可确保数据库服务器和客户端应用程序之间的加密网络连接。 TLS 是安全套接字层 (SSL) 的更新协议。

灵活服务器支持 TLS 1.2 及更高版本。在 RFC 8996 中,互联网工程任务组 (IETF) 明确声明不得使用 TLS 1.0 和 TLS 1.1。这两种协议都已于 2019 年底弃用。

默认情况下,将拒绝使用早期版本 TLS 协议(例如 TLS 1.0 和 TLS 1.1)的所有传入连接。您可以通过将 require_secure_transport 服务器参数更新为 OFF 来控制是否启用 SSL\TLS。您还可以通过设置 ssl_min_protocol_version 和 ssl_max_protocol_version 服务器参数来设置 TLS 版本。

在客户端上配置 SSL

默认情况下,PostgreSQL 不会对服务器证书进行任何验证。这意味着可以在客户端不知情的情况下欺骗服务器身份(例如通过修改 DNS 记录或通过接管服务器 IP 地址)。为了防止欺骗,必须在客户端使用 SSL 证书验证。

有许多用于为 SSL 配置客户端的连接参数。下面我们将列出这些:

  • ssl。使用 SSL 连接。服务器必须已使用 SSL 支持进行编译。此属性不需要与之关联的值。它的存在指定了 SSL 连接。但是,为了与未来版本兼容,首选值“true”。在这种模式下,当建立 SSL 连接时,JDBC 驱动程序将验证服务器的身份,防止“中间人”攻击。它通过检查服务器证书是否由受信任的机构签署,并且您要连接的主机与证书中的主机名相同来做到这一点。
  • ssl 模式。如果您需要加密并希望连接在无法加密的情况下失败,请设置 sslmode=require。这可确保服务器配置为接受此主机/IP 地址的 SSL 连接,并且服务器可识别客户端证书。换句话说,如果服务器不接受 SSL 连接或无法识别客户端证书,则连接将失败。下表列出了此设置的值:
SSL 模式 说明 Azure Database for PostgreSQL 的预期行为 - 灵活服务器
禁用 我不想使用加密。 可能是错误,因为 PostgreSQL Flex 在服务器上默认强制加密。 如果在 Flex Server 禁用加密时强制执行非默认行为,则将工作,允许未加密的流量。
可用 如果服务器设置需要\强制加密,我将允许加密 加密,除非在 Flex Server 上强制执行非默认行为禁用加密,在这种情况下为非加密。
偏好 如果服务器支持,我将允许加密 使用默认 Flex 设置加密,如果在 Flex 服务器上强制执行非默认行为,禁用加密服务器端,将允许未加密的流量
需求 我希望我的数据始终被加密,并且我接受开销。 这可确保服务器配置为接受此主机/IP 地址的 SSL 连接,并且服务器可识别客户端证书。 换句话说,如果服务器不接受 SSL 连接或无法识别客户端证书,则连接将失败。 使用默认 Flex 设置加密,如果 Flex 默认服务器设置更改为关闭加密,则会出错。
验证-ca 我希望我的数据始终被加密,并且我接受开销。 通过检查证书链直到存储在客户端上的根证书来验证服务器。 使用默认 Flex 设置加密,如果 Flex 默认服务器设置更改为关闭加密,则会出错。
验证-full 我希望我的数据始终被加密,并且我接受开销。 将验证服务器主机名以确保它与存储在服务器证书中的名称匹配。 使用默认 Flex 设置加密,如果 Flex 默认服务器设置更改为关闭加密,则会出错。 将尝试确保 Flex 服务器主机名与存储在服务器证书中的名称匹配,否则可能会引发错误。
  1. sslcert、sslkeysslrootcert。 这些参数可以覆盖客户端证书、PKCS-8 客户端密钥和根证书的默认位置。 它们分别默认为 /defaultdir/postgresql.crt、/defaultdir/postgresql.pk8 和 /defaultdir/root.crt,其中 defaultdir 在 *nix 系统中为 ${user.home}/.postgresql/,在 %appdata%/postgresql/ 上 视窗。

设置 SSL\TLS 参数以通过 JDBC 连接属性强制执行 SSL 的示例:

String url = "jdbc:postgresql://localhost/test";

Properties props = new Properties();

props.setProperty("user","john");

props.setProperty("password","p@ssw0rd1");

props.setProperty("ssl","true");

props.setProperty("sslmode","require");

Connection conn = DriverManager.getConnection(url, props); 

设置 SSL\TLS 参数以通过 JDBC Url 实施 SSL 的示例:

String url = "jdbc:postgresql://localhost/testuser=fred&password=secret&ssl=true&sslmode=require";

Connection conn = DriverManager.getConnection(url); 

我们希望这篇博客文章对您有所帮助,并且始终对您计划如何通过 JDBC 将灵活服务器产品与您的 Java 应用程序一起使用感兴趣。 可以在以下文档中找到有关上述主题的其他信息:

  1. Azure Database for PostgreSQL – 灵活的服务器网络文档
  2. Azure Database for PostgreSQL - 灵活的服务器安全性文档
  3. PostgreSQL 客户端 SSL 支持
  4. PostgreSQL JDBC 驱动程序连接参数
  5. 使用 SSL\TLS 的安全连接

我们一直期待着得到您的反馈,因此请通过电子邮件联系 Ask Azure DB for PostgreSQL。

原文标题:Secure your Java application connections to Flexible Server via JDBC and SSL
原文作者:Gennady Kostinsky
原文地址:https://techcommunity.microsoft.com/t5/azure-database-for-postgresql/secure-your-java-application-connections-to-flexible-server-via/ba-p/3158599

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论