You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elixir Phoenix中如何将字符串传入HTTPoison的cacerts SSL选项

解决方法

要将环境变量中的PEM格式CA证书字符串转换为Erlang SSL模块所需的DER格式,你可以通过Elixir调用Erlang的public_key模块完成解析,具体修改runtime.exs配置如下:

# runtime.exs
config :core, Tools.ElasticsearchCluster,
  url: System.get_env("ELASTIC_HOST"),
  username: System.get_env("ELASTIC_USERNAME"),
  password: System.get_env("ELASTIC_PASSWORD"),
  default_options: [
    hackney: [
      ssl_options: [
        cacerts: parse_ca_cert(System.get_env("ELASTIC_CERT"))
      ]
    ]
  ]

defp parse_ca_cert(nil), do: []
defp parse_ca_cert(pem_str) do
  # 还原PEM字符串中的换行(环境变量可能将换行转义为\n)
  pem_str = String.replace(pem_str, "\\n", "\n")
  # 解析PEM格式内容
  pem_str
  |> to_charlist()
  |> :public_key.pem_decode()
  # 过滤出CA证书并提取DER编码内容
  |> Enum.filter(fn {:Certificate, _, :undefined} -> true; _ -> false end)
  |> Enum.map(fn {:Certificate, der, :undefined} -> der end)
end

关键步骤说明

  • 处理换行符:环境变量中存储的PEM字符串通常会把换行符转义为\n,需要替换回实际的换行符,否则public_key无法正确解析。
  • PEM解码:使用:public_key.pem_decode/1将PEM字符串解析为Erlang的证书结构,该函数接收字符列表作为输入,所以需要用to_charlist/1转换。
  • 提取DER证书:解析后的结构中,:Certificate类型的条目就是我们需要的证书,从中提取出DER编码的二进制数据,这正是ssl_options的cacerts选项所需的格式。
  • 空值处理:如果环境变量未设置ELASTIC_CERT,返回空列表避免配置错误。

这样修改后,你就可以直接通过环境变量传入PEM格式的CA证书字符串,无需再管理物理证书文件,适配多变的部署环境。

内容的提问来源于stack exchange,提问作者paulrusu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:42:42