#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
? Как менеджер использует это имя при подключении к разным серверам?