如何使用SSL将Azure Java WebApp连接到Azure PostgreSQL数据库?看来Azure PostgreSQL数据库需要特定的根证书。
我有一个部署为Azure“ App Services” Web应用程序中以.war形式运行的Java应用程序。它在Java 8的Tomcat 8.5容器中运行。
这正在连接到在Azure中运行的PostgreSQL 10数据库,称为“ PostgreSQL的Azure数据库”。当前已配置数据库,使其仅接受SSL连接。
我可以使用本地开发计算机上的SSL正确连接到数据库。
我可以在本地运行Java Web应用程序,它可以使用SSL(JDBC驱动程序字符串包括'?ssl = true'”)愉快地连接到PostgreSQL数据库。
但是,当我使用SSL在Azure Web App中运行相同的应用程序时,它无法连接(我可以在禁用SSL的情况下进行连接):“无法打开SSL根证书文件D:\ local \ AppData \ postgresql \ root.crt“
2019-05-13 15:16:58 ERROR HikariPool:574 - HikariPool-1 - Exception during pool initialization.
org.postgresql.util.PSQLException: Could not open SSL root certificate file D:\local\AppData\postgresql\root.crt.
at org.postgresql.ssl.LibPQFactory.<init>(LibPQFactory.java:120) ~[postgresql-42.2.5.jar:42.2.5]
...
Microsoft在Azure App Services(我认为是Azul)中提供的JRE似乎没有安装此根证书(因此postgres驱动程序会寻找 root.crt ) , 而我的本地JDK(AdoptOpenJDK jdk-8.0.212.03-hotspot)确实已安装了此
Microsoft文档指出,您可能需要在连接的 client 端上安装其 BaltimoreCyberTrustRoot.crt 作为root.crt证书。 https://docs.microsoft.com/en-us/azure/postgresql/concepts-ssl-connection-security
任何人都可以建议获得应用服务以允许访问此根证书的最佳方法, 鉴于我无法在App Service中安装额外的根证书, 而且我无权简单地将文件上传到D:\ local \ AppData \ postgresql。 Microsoft提供了一种机制,允许证书可供Web Apps使用,但是这些证书不会放置在JDBC驱动程序将其拾取的位置。 https://docs.microsoft.com/en-us/azure/app-service/app-service-web-ssl-cert-load
注意事项: 最新版本的PostgreSQL JDBC驱动程序对此SSL验证进行了增强: 版本42.2.5现在具有一个附加功能: “ ssl = true表示sslmode = verify-full,即它需要有效的服务器证书” https://jdbc.postgresql.org/
我可以通过两种方法解决SSL验证问题,但都不令人满意:
a)我可以显式降级到PostgreSQL JDBC驱动程序的旧版本。它仍然使用SSL,但容易受到MITM攻击。
b)我可以明确关闭使用SSL和/或关闭证书验证的要求。
我不想做任何一个。有人有更好的建议吗?
请注意,这些是几个相关的Stackoverflow线程,但是这些并没有真正解决此Java用例:
Installing certificates to the trusted root certificate store on azure web apps
How can I trust an Active Directory Root CA Certificate in an Azure Web Application?