【问题标题】:How to solve the error: "Connection could not be allocated because the hostname could not be verified by hostnameverifier"如何解决错误:“无法分配连接,因为主机名无法由主机名验证器验证”
【发布时间】:2019-08-27 23:30:20
【问题描述】:

当我尝试向我的 AWS EC2 实例发出一些请求时,我收到错误消息“无法分配连接,因为 hostnameverifier PgjdbcHostnameVerifier 无法验证 my_dns_of_postgresql_database”,在这种情况下我该怎么办?

我在 AWS 的 EC2 实例(标准的 t2.micro)中部署了 Glassfish 4.1 中的服务器(war 文件)。这个项目在 postgreSQL 中调用 Heroku 的数据库服务器(数据库不在 AWS 实例中)。我尝试更改安全组规则以接受入站和出站的 postgreSQL 流量,但这不起作用。

当我不发出请求时(只需键入 dns 地址、端口和 war 文件名应用程序 - 例如:http://ec2-2-81-22-142.compute-1.amazonaws.com:8080/TamboServer-1.0-SNAPSHOT/)显示 Servlet 响应,一个 Hello World;当我在我的电脑(本地主机)中尝试它时,我得到了一个成功的响应,所以我认为这不是服务器应用程序中的问题。可能是 Heroku 的数据库或 EC2 实例中的一些配置。

以下是 Glassfish 中 server.logs 文件的一些行:

[2019-04-06T04:03:45.933+0000] [glassfish 4.1] [INFO] [] [] [tid: _ThreadID=30 _ThreadName=Thread-8] [timeMillis: 1554523425933] [levelValue: 800] [[
  [EL Info]: 2019-04-06 04:03:45.932--ServerSession(1545400102)--EclipseLink, version: Eclipse Persistence Services - 2.6.1.v20150605-31e8258]]

[2019-04-06T04:03:45.963+0000] [glassfish 4.1] [SEVERE] [] [org.postgresql.ssl.PGjdbcHostnameVerifier] [tid: _ThreadID=30 _ThreadName=http-listener-1(4)] [timeMillis: 1554523425963] [levelValue: 1000] [[
  Server name validation failed: hostname ec2-107-22-163-8.compute-1.amazonaws.com does not match common name ip-10-0-63-18.ec2.internal]]

[2019-04-06T04:03:45.963+0000] [glassfish 4.1] [WARNING] [poolmgr.create_resource_error] [javax.enterprise.resource.resourceadapter.com.sun.enterprise.resource.allocator] [tid: _ThreadID=30 _ThreadName=http-listener-1(4)] [timeMillis: 1554523425963] [levelValue: 900] [[
  RAR5038:Unexpected exception while creating resource for pool { PoolInfo : (name=java:app/post-gre-sql_...), (applicationName=TamboServer-1.0-SNAPSHOT) }. Exception : javax.resource.spi.ResourceAllocationException: Connection could not be allocated because: The hostname ec2-107-22-163-8.compute-1.amazonaws.com could not be verified by hostnameverifier PgjdbcHostnameVerifier.]]

我希望能够将运行在 EC2 实例中的服务器连接到 Heroku 的数据库(实际上,它也分配在 AWS 机器中)。如果没有,我应该将数据库迁移到 EC2 实例吗? 在此先感谢,如果我在写作上犯了一些错误,请原谅(我不是以英语为母语的人)

【问题讨论】:

  • 当您的应用程序作为客户端尝试通过 ssl 建立连接并且主机名与目标提供的证书上的主机名不匹配时,将调用 Hostnameverifier,让您有机会覆盖验证带有自定义验证。这意味着您的服务器正在尝试通过安全连接访问数据库,但在数据库端使用的证书无效,并且没有覆盖默认主机名验证器。
  • 感谢您的快速回复。是的,问题出在 SSL 上。我只是在我的 JDBC 连接池中删除了参数 ssl URL 并添加了 sslfactory=org.postgresql.ssl.NonValidatingFactory,如何 sugest this 响应。现在服务器工作正常!但是现在,没有 SSL,是不安全的,我该如何解决呢?
  • 只要您知道这一点:“提供一个 SSLSocketFactory,它允许在不验证服务器证书的情况下进行 SSL 连接。这对某些应用程序来说更方便,但它允许的安全性较低”中间人“攻击”。 jdbc.postgresql.org/documentation/publicapi/org/postgresql/ssl/…
  • 是的,我明白了。感谢您的 cmets。

标签: java postgresql amazon-ec2 heroku-postgres glassfish-4.1


【解决方案1】:

Currentyl 我在我的 JDBC 连接池中删除了参数 ssl URL 并添加了 sslfactory=org.postgresql.ssl.NonValidatingFactory 如何 sugest this 响应。这是一个蛮力解决方案,因为允许“中间人”攻击,使其不安全,documentation 怎么说,但这对我正在做的事情来说没问题。

【讨论】:

    猜你喜欢
    • 2014-12-30
    • 1970-01-01
    • 2015-10-18
    • 2021-08-19
    • 2014-02-20
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多