Как предоставить сертификат клиента http-client-tls?

#haskell #ssl #https

#haskell #ssl #https

Вопрос:

Я использую http-client-tls для подключения к серверу с поддержкой TLS, для которого требуется сертификат клиента. Я подозреваю, что мне нужно настроить настройки TLSSettings с помощью загруженного сертификата и исправить параметры cypher-suites, но определенно не ясно, как это сделать.

У кого-нибудь есть какой-нибудь пример кода, который использует сертификаты на стороне клиента?

Комментарии:

1. В настоящее время пытаюсь следовать подсказкам в этой теме: groups.google.com/forum /#!тема/yesodweb/yJliYgU-NE4

Ответ №1:

Спасибо Морицу Агерману за то, что поделился своим кодом. Вот полный модуль Haskell, который может использовать crt.pem key.pem файлы и для предоставления сертификата на стороне клиента по запросу сервера:

  {-# LANGUAGE OverloadedStrings #-}
 module TLS where

 import           Data.Default
 import           Network.Connection
 import           Network.HTTP.Client
 import           Network.HTTP.Client.TLS
 import           Network.TLS
 import           Network.TLS.Extra.Cipher
 import           Servant.Client

 makeClientManager :: String -> Scheme -> IO Manager
 makeClientManager hostname Https = mkMngr hostname "crt.pem" "key.pem"
 makeClientManager _        Http  = newManager defaultManagerSettings

 mkMngr :: String -> FilePath -> FilePath -> IO Manager
 mkMngr hostName crtFile keyFile = do
   creds <- either error Just `fmap` credentialLoadX509 crtFile keyFile
   let hooks = def
               { onCertificateRequest = _ -> return creds
               , onServerCertificate = _ _ _ _ -> return []
               }
       clientParams = (defaultParamsClient hostName  "")
                      { clientHooks = hooks
                      , clientSupported = def { supportedCiphers = ciphersuite_all }
                      }
       tlsSettings = TLSSettings clientParams

   newManager $ mkManagerSettings tlsSettings Nothing
 

Не уверен, что это обходит проверку сертификата сервера или нет, поскольку onServerCertificate hook является константой [] .

Комментарии:

1. Чтобы ответить на ваш вопрос, ваш код обходит проверку сертификата сервера. Любой, кто использует этот код, должен удалить onServerCertificate строку, если он не знает, что делает. Как бы то ни было, этот код опасен.

2. Спасибо, я знаю об этом недостатке.

3. Почему существует hostname ? Как менеджер использует это имя при подключении к разным серверам?