2016-10-17 2 views
5

Ich verwende http-client-tls, um eine Verbindung zu einem TLS-fähigen Server herzustellen, der ein Clientzertifikat erfordert. Ich vermute, dass ich TLSSettings mit einem geladenen Zertifikat zwicken und korrekte cypher-suites Parameter korrigieren muss, aber es ist definitiv nicht klar, wie man das macht.Wie stelle ich http-client-tls ein Client-Zertifikat zur Verfügung?

Hat jemand einen Beispielcode, der clientseitige Zertifikate verwendet?

+0

Derzeit versuchen, Hinweise in diesem Thema zu folgen: https://groups.google.com/forum/#!topic/yesodweb/yJliYgU-NE4 – insitu

Antwort

3

Danke an Moritz Agerman für die Freigabe seines Codes. Hier ist ein Full-Haskell-Modul, das crt.pem und key.pem Dateien verwenden kann clientseitige Zertifikat zu liefern, wie vom Server angefordert:

{-# 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 

nicht sicher, ob dies tut Bypass-Server-Zertifikat-Validierung oder nicht als onServerCertificate Haken eine Konstante [] ist.

+3

Um Ihre Frage zu beantworten, umgeht Ihren Code Server-Zertifikat-Validierung. Jeder, der diesen Code verwendet, sollte die Zeile "onServerCertificate" entfernen, wenn sie nicht wissen, was sie tun. So wie es ist, ist dieser Code gefährlich. – mmalone

+0

Danke, mir ist dieser Mangel bekannt. – insitu

Verwandte Themen