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
相关产品推荐
相关产品推荐

