【发布时间】:2017-10-15 11:36:01
【问题描述】:
当尝试使用托管 3rd 方“数据库即服务”的 PostgreSQL 数据库运行 Elixir (Phoenix) Web 应用程序时 (Azure Database for PostgreSQL)。
我们尝试使用mix phoenix.server 启动应用程序,我们看到以下错误:
[info] Running Pxblog.Endpoint with Cowboy using http://localhost:4000
[error] GenServer #PID<0.247.0> terminating
** (FunctionClauseError) no function clause matching in Postgrex.Messages.decode_fields/1
(postgrex) lib/postgrex/messages.ex:339: Postgrex.Messages.decode_fields("")
(postgrex) lib/postgrex/messages.ex:344: Postgrex.Messages.decode_fields/1
(postgrex) lib/postgrex/messages.ex:344: Postgrex.Messages.decode_fields/1
(postgrex) lib/postgrex/messages.ex:131: Postgrex.Messages.parse/3
(postgrex) lib/postgrex/protocol.ex:1842: Postgrex.Protocol.msg_decode/1
(postgrex) lib/postgrex/protocol.ex:1816: Postgrex.Protocol.msg_recv/3
(postgrex) lib/postgrex/protocol.ex:560: Postgrex.Protocol.auth_recv/3
(postgrex) lib/postgrex/protocol.ex:475: Postgrex.Protocol.handshake/2
(db_connection) lib/db_connection/connection.ex:134: DBConnection.Connection.connect/2
(connection) lib/connection.ex:622: Connection.enter_connect/5
(stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
Last message: nil
State: Postgrex.Protocol
洞察:在 Azure DB 上启用了“强制 SSL”...
通过调查,我们意识到错误的原因是 Azure PostgreSQL 服务将 Enforce SSL Connection 设置为 Enabled(default):
我们认为对Enabled“实施 SSL”对于安全性而言良好,但我们无法让它与 Phoenix 一起使用 ...
(临时)解决方案:禁用“强制 SSL”
所以,我们现在(暂时)禁用 SSL:
但我们更喜欢针对这个问题的“永久”解决方案。
首选解决方案:连接 PostgreSQL 时使用 SSL
如果有人能澄清(或指出我们)如何从 Phoenix/Ecto 通过 SSL 连接到 PostgreSQL
我们将非常感激! :-)
应用程序(凤凰)服务器是否需要配置 SSL 证书才能从应用程序服务器连接到数据库服务器...?
例如:http://www.phoenixframework.org/docs/configuration-for-ssl?
Microsoft 有以下帮助指南: https://docs.microsoft.com/en-us/azure/postgresql/concepts-ssl-connection-security 似乎表明我们需要应用服务器上的 OpenSSL ... 任何人都可以确认吗?
【问题讨论】:
-
你试过在repo配置中设置
ssl: true吗? -
@michalmuskala 很遗憾,只是在
prod.secrets.exs的Repo部分添加ssl: true并不能解决问题。我们试过了:git.io/v9Ne2 :-( 我们怀疑可能需要 SSL 证书才能使其工作。 -
@nelsonic
ssl: true有什么错误?
标签: postgresql azure erlang elixir phoenix-framework