Как отладить HANDSHAKE_FAILURE при запросе HTTPS-сервера с помощью метода ocaml-cohttp Client.post?(И почему я получаю эту ошибку?) - PullRequest
0 голосов
/ 16 октября 2018

Я написал следующий код 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.

1 Ответ

0 голосов
/ 16 октября 2018

Вы получаете это предупреждение, потому что процесс рукопожатия (аутентификация) не прошел.Это предупреждение означает, что одноранговый узел не аутентифицирован (ни сервер, ни клиент) и, следовательно, безопасное соединение не может быть установлено.

Чтобы устранить проблему, я бы предложил сначала убедиться, что все работает нормально с обычными инструментами, например, openssl, wget или curl.

Если вы уверены, что с вашей конфигурацией все в порядке и это проблема в части ocaml-tls, я бы предложил использовать низкоуровневый интерфейс библиотеки ocaml-tls.Очевидно, что conduit не предоставляет и не использует какие-либо возможности трассировки ocaml-tls, поэтому другого выбора нет.

Тип оповещения проецируется из двух более богатых типов fatal и error, которые несут гораздо больше информации о природе проблемы, ср. следующий код , который создает предупреждение и учитывает возможные входные значения, которые приводят к предупреждению HANDSHAKE_FAILURE.

Чтобы получить доступ к конкретной ошибке или предупреждению, я бы предложил вам использовать возможности трассировки ocaml-tls.В исходном репозитории приведены примеры , которые уже включают трассировку и должны предоставить достаточную информацию.Я надеюсь, что эти примеры будут соответствовать вашему варианту использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...