Я написал следующий код OCaml для выполнения POST запросов к https серверу.
open Lwt
open Cohttp
open Cohttp_lwt_unix
try
let headers = Header.init ()
|> fun h -> Header.add h "content-type" "application/json" in
let body = Client.post
~headers
~body:(body_of_credentials nickname secret)
(uri_of_project project)
>>= fun (response, body) ->
let code = response |> Response.status |> Code.code_of_status in
Printf.printf "Response code: %d\n" code;
Printf.printf "Headers: %s\n" (response |> Response.headers |> Header.to_string);
body |> Cohttp_lwt.Body.to_string >|= fun body ->
Printf.printf "Body of length: %d\n" (String.length body);
body
in
let body = Lwt_main.run body in
print_endline ("Received body\n" ^ body)
with
| Tls_lwt.Tls_alert e ->
print_endline (Tls.Packet.alert_type_to_string e);
exit 1
Но при его выполнении с CONDUIT_TLS=native CONDUIT_DEBUG=true COHTTP_DEBUG=true
Iполучить следующий ответ:
Selected TLS library: Native
Resolver system: https://my_server/auth/tokens/ ((name https) (port 443) (tls true)) -> (TCP ((V4 xx.xxx.xx.xxx) 443))
HANDSHAKE_FAILURE
Я прочитал все результаты Google (документация, списки ocaml / cohttp / ocaml-tls и вопросы переполнения стека) я мог найти об этом, но ничего не помогает, поэтому яЯ хотел бы начать с нуля.
Как я могу получить более подробную информацию об этой ошибке?
Если это поможет, я использую следующую конфигурацию opam:
"lwt" {>= "4.1.0"}
"cohttp" {>= "1.1.1"}
"cohttp-lwt"
"cohttp-lwt-unix" {>= "1.1.1"}
"tls" {>= "0.9.2"}
РЕДАКТИРОВАТЬ: Как предложено @ivg, я попытался с CONDUIT_TLS=openssl
, но затем я получаю следующую ошибку:
Selected TLS library: OpenSSL
Resolver system: https://my_server/auth/tokens/ ((name https) (port 443) (tls true)) -> (TCP ((V4 xx.xxx.xx.xxx) 443))
...: internal error, uncaught exception:
SSL: Method error
EDIT²: Как предлагается в следующем обсуждении: github.com /savonet / ocaml-ssl / Issues / 40 Я добавил пин-код opam в ssl-0.5.5
: opam pin add ssl 0.5.5
, чтобы исправить эту ошибку.Теперь я могу отправлять запросы на мой https-сервер, но не с помощью чистой ocaml-реализации tls.