如何向http-client-tls提供客户端证书?

ins*_*itu 7 ssl https haskell

我使用http-client-tls连接到需要客户端证书的启用TLS的服务器.我怀疑我需要使用加载的证书和正确的cypher-suites参数来调整TLSSettings,但是如何做到这一点肯定不清楚.

有没有人有一些使用客户端证书的示例代码?

ins*_*itu 5

感谢Moritz Agerman共享他的代码。这是完整的Haskell模块,可以使用crt.pemkey.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
Run Code Online (Sandbox Code Playgroud)

由于onServerCertificate钩子是一个常量,因此不确定是否绕过服务器证书验证[]

  • 为了回答您的问题,您的代码会绕过服务器证书验证。任何使用此代码的人都应该删除“ onServerCertificate”行,除非他们知道自己在做什么。实际上,此代码很危险。 (4认同)
  • 为什么会有“主机名”?当连接到不同的服务器时,管理器如何使用这个名称? (3认同)