ssl - 使用 Phoenix/Elixir 在本地设置 SSL 时出现问题

标签 ssl openssl elixir phoenix-framework

我在 OSX 上创建了一个新的 Phoenix web 应用程序,我正在尝试让 SSL 在本地主机上工作。为此,我阅读并执行了 this article 的步骤.所以现在我有一个 server.key、server.crt 和 server.csr 文件。这些文件不是二进制文件,而是可读的形式。我将这些文件放在 priv 文件夹中作为 Phoenix docs suggested .

我的配置文件是这样的:

  config :{{name}}, {{name}}.Endpoint,
  http: [port: 4000],
  debug_errors: true,
  code_reloader: true,
  cache_static_lookup: false,
  check_origin: false,
  watchers: [node: ["node_modules/brunch/bin/brunch", "watch", "--stdin"]],
  https: [port: 4043,
          otp_app: :{{name}},
          keyfile: System.get_env("server.key"),
          certfile: System.get_env("server.crt"),
          # OPTIONAL Key for intermediate certificates
          # cacertfile: System.get_env("INTERMEDIATE_CERTFILE_PATH")
        ]

当我运行 mix phoenix.server 时出现以下错误:

** (Mix) Could not start application {{name}}: {{name}}.start(:normal, []) returned an error: shutdown: failed to start child: {{name}}.Endpoint
    ** (EXIT) shutdown: failed to start child: Phoenix.Endpoint.Server
        ** (EXIT) shutdown: failed to start child: {:ranch_listener_sup, {{name}}.Endpoint.HTTPS}
            ** (EXIT) shutdown: failed to start child: :ranch_acceptors_sup
                ** (EXIT) an exception was raised:
                    ** (MatchError) no match of right hand side value: {:error, {:options, {:certfile, nil}}}
                        (ranch) src/ranch_acceptors_sup.erl:30: :ranch_acceptors_sup.init/1
                        (stdlib) supervisor.erl:243: :supervisor.init/1
                        (stdlib) gen_server.erl:306: :gen_server.init_it/6
                        (stdlib) proc_lib.erl:237: :proc_lib.init_p_do_apply/3

我做错了什么?我是 Phoenix 新手,我正在从事的项目需要在本地主机上使用 SSL 以防止跨域问题。

最佳答案

看来phoenix 无法找到您的证书。 要克服这个问题,您可以提供一个绝对路径,或者可以利用otp_app 来使用phoenix 可以搜索证书的相对路径。如果您提供 otp_appphoenix 将在您的应用程序根目录中查找证书。

如果你想提供一个绝对路径,你可以这样做:

    keyfile: Path.expand("../../../some/path/to/ssl/cer.key", __DIR__),
    certfile: Path.expand("../../../some/path/to/ssl/cer.crt", __DIR__)

如果您想利用 otp_app,请创建两个环境变量,例如 KEY_HOME 和 CERT_HOME。转到控制台并触发这两个命令。您应该稍后将它们添加到您的 bashrc 文件中。

export KEY_HOME=priv/ssl/server.key
export CERT_HOME=priv/ssl/server.crt

您必须在此处包含 priv 目录

现在你的配置看起来像这样

  https: [port: 443,
  otp_app: :hello_phoenix,
  keyfile: System.get_env("KEY_HOME"),
  certfile: System.get_env("CERT_HOME") 
  ]

不要忘记在 priv/ssl 中复制文件。

关于ssl - 使用 Phoenix/Elixir 在本地设置 SSL 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32491604/

相关文章:

syntax - 如何在 Elixir 中进行换行(换行)?

c# - 检索数据以进行 SSL 跟踪

java - HttpsServer 处理程序未被调用

java - 找不到 'tcgetattr' 引用的符号 "libcrypto.so"

maps - 如何从嵌套映射中获取值

elixir - Ecto 模型中的大写字段

powershell - 使用 powershell 提取日期格式

使用 HTTPS 连接到 Web 服务时,Android SSL 握手失败

c++ - curl_easy_perform() 在 Ubuntu Server 14 上崩溃

openssl - 使用 OpenSSL "unable to write ' 随机状态'"是什么意思?