【发布时间】:2021-05-29 07:41:18
【问题描述】:
我有一个 IIS 托管站点,该站点需要将客户端证书附加到任何传入请求。我正在尝试从 Erlang 发出请求,但无法弄清楚如何将客户端附加到传出的 httpc 请求。我的示例代码:
inets:start(),
ssl:start(),
httpc:request(get, {"https://my-iis-host.org/api/endpoint?parm1=foobar", []}, [{ssl, [{cacertfile, "/path/to/my/cert.pem"}]}], []) .
从服务器返回 403.7 响应。我确定证书很好,因为我可以使用 curl 并成功拨打相同的电话并获得成功的响应:
curl -v --cert /path/to/my/cert.pem "https://my-iis-host.org/api/endpoint?parm1=foobar"
我认为我的 erlang 调用是错误的,它实际上并没有将客户端证书附加到请求中,但它应该如何工作?感谢您的帮助!
编辑:最终我试图解决的问题实际上是将POST 数据发送到端点并附加客户端证书。为了简单起见,我用GET 复制了它,但想分享我完整的POST 示例,以防其他人遇到相同的问题:
inets:start(),
ssl:start(),
Body = "{'name':'value','name1':'value1'}",
Request = {"https://my-iis-host.org/api/endpoint", [], "application/json", Body},
httpc:request(post, Request, [{ssl, [{certfile, "/path/to/my/cert.pem"}]}], []) .
【问题讨论】:
-
你为什么不为你的 curl 请求使用
--cacert选项? 我认为我的 erlang 调用是错误的,它实际上并未将客户端证书附加到请求中, -- 您如何确定? -
这些都是公平的问题。对于
curl,我知道--cert附加了客户端证书。据我在 erlang 文档 (erlang.org/doc/man/ssl.html#type-client_cafile) 中所知,cacertfile似乎是最接近的。但这可能是错误的,因为它对我不起作用。而且我不确定客户端证书没有被附加,除了我得到的 407.3 响应,并且证书与 curl 一起成功工作。您知道在 erlang 中将客户端证书附加到请求的正确方法吗?
标签: erlang