0

Cohttp_mirage.Client が TLS (https) をサポートしているかどうかを確認できる人はいますか? 私が行った掘り下げは、Conduit_mirageClient tls をサポートしていることを示しているようですが、Cohttp_mirage では、Server は tcp または tls の可能性のある Flow を取るファンクターです (mirage-www dispatch_tls.ml ファイルから得られたように)。

TLS をサポートしている場合、これを設定する方法の例はありますか (Mirage 用)? オンラインでも mirage-skeleton でも何も見つかりませんでした。私はクライアントを単一の Web サービスに書いているので、必要な証明書は 1 つだけだと思います。

答えが「いいえ、TLS をサポートしていません」の場合、何か作業は行われていますか? 自分自身を掘り下げてみるのもいいかもしれません。私は 15 年間プログラミングをしてきましたが、OCaml にはまだ慣れていません。

4

2 に答える 2

1

mirage-httpはTLS をサポートしているとあなたが言っているので、私はあなたの質問を理解できません。TLS 対応のコンジットを に渡す必要があると思いますconnect_uri

サーバー側では、プロジェクトの Web サイト ( https://mirage.io/ ) は TLS をサポートするユニカーネルです。

サンプル プロジェクト (すべてのサーバーですが、クライアントも動作するはずです):

于 2016-02-11T10:18:52.230 に答える
1

前述のように、問題は TLS 対応コンジットを最終的な Cohttp クライアントに渡すことです。これが私の蜃気楼「config.ml」ファイルです。

open Mirage

let net =
  try match Sys.getenv "NET" with
    | "direct" -> `Direct
    | "socket" -> `Socket
    | _        -> `Direct
  with Not_found -> `Socket

let dhcp =
  try match Sys.getenv "DHCP" with
    | "" -> false
    | _  -> true
  with Not_found -> false

let stack console =
  match net, dhcp with
  | `Direct, true  -> direct_stackv4_with_dhcp console tap0
  | `Direct, false -> direct_stackv4_with_default_ipv4 console tap0
  | `Socket, _     -> socket_stackv4 console [Ipaddr.V4.any]

let main =
  foreign "MyDispatch.Main" (console @-> http @-> resolver @-> conduit @-> job)

let () =
  let sv4 = stack default_console in
  let res_dns = resolver_dns sv4 in
  let conduit = conduit_direct ~tls:true sv4 in
  let http_srv = http_server conduit ind
  register "ident" [
    main $ default_console $ http_srv $ res_dns $ conduit
  ]

http クライアントが機能するには DNS も必要であることに注意してください。重要な部分~tls:true

let conduit = conduit_direct ~tls:true sv4 in ...

ディスパッチ ファイル (MyDispatch.ml、名前の競合を避けるために、次のようにします。

open Lwt
open Cohttp
open Printf
open V1_LWT

module Main (C:CONSOLE) (S:Cohttp_lwt.Server) (RES: Resolver_lwt.S) (CON: Conduit_mirage.S) = struct
    module SH = ServiceHandlers.Make (Cohttp_mirage.Client)
    module Wm = SH.Wm

    let routes ctx = [
        ("/v1/ident/initiate", fun () -> new SH.initiate_session ctx );
    ]

    let callback ctx (ch,conn) request body =
        Wm.dispatch' (routes ctx) ~body ~request
    >|= begin function
        | None        -> (`Not_found, Header.init (), `String "Not found", [])
        | Some result -> result
    end
    >>= fun (status, headers, body, path) ->
        let path =
            match Sys.getenv "DEBUG_PATH" with
        | _ -> Printf.sprintf " - %s" (String.concat ", " path)
        | exception Not_found   -> ""
        in
      Printf.eprintf "%d - %s %s%s"
        (Code.code_of_status status)
        (Code.string_of_method (Request.meth request))
        (Uri.path (Request.uri request))
        path;
      S.respond ~headers ~body ~status ()

    let start c http (res_dns) (ctx:CON.t) =
        let ctx = Cohttp_mirage.Client.ctx res_dns ctx in
        let callback = callback ctx in
        let conn_closed (_,conn_id) =
            let cid = Cohttp.Connection.to_string conn_id in
            C.log c (Printf.sprintf "conn %s closed" cid)
            in
    http (`TCP 8080) (S.make ~conn_closed ~callback ())
end

ここで重要な部分は、(TLS が有効な) コンテキストに DNS リゾルバーを追加し、それをコールバックに渡すことです。これにより、最終的にクライアントが使用できるようになります。ServiceHandlersは Webmachine を使用し、Cohttp_lwt.Clientモジュール (Cohttp_lwt_mirage.Clientこの場合は ) を取るファンクターです。最終的に、クライアントは TLS/DNS が有効なコンテキストを使用して呼び出しを行います (handle_responseアプリケーション固有のコードです)。

Client.post ~ctx:ctx_with_tls_dns ~headers ~body uri >>= handle_response

「方法を知っていれば簡単です (tm)」。これまでのところ、Mirage/xen ではなく Mirage/unix でのみ実行したことに注意してください。

于 2016-02-15T18:02:54.027 に答える