Отключить проверку сертификата SSL/TLS в Network.HTTP.Conduit

Я использую библиотеку http-conduit версии 2.0+ для извлечения содержимого из URL-адреса http://:

import Network.HTTP.Conduit
myurl = ... -- Your URL goes here
main = do content <- simpleHttp myurl
          print $ content

При запуске этой программы я получаю эту ошибку:

*** Exception: TlsException (HandshakeFailed (Error_Protocol
      ("certificate rejected: certificate is not allowed to sign another certificate",
        True,CertificateUnknown)))

Как видно из сообщения об ошибке, проблема заключается в неспособности Network.HTTP.Conduit правильно проверить сертификат сервера (в этом случае, похоже, проблемы в цепочке сертификатов)

Как я могу изменить приведенный выше код, чтобы игнорировать ошибку сертификата (т. е. вообще не проверять сертификаты)?


person Uli Köhler    schedule 23.01.2014    source источник


Ответы (1)


Сам simpleHttp не поддерживает эту функцию. Вам нужно будет создать менеджер с измененным ManagerSettings, а затем использовать его для получения URL-адреса.

Обратите внимание, что этот код применим только для http-conduits версии 2.0+ — библиотека версии 1 имеет для этой цели похожий, но другой API.

import Network.HTTP.Conduit
import Network.Connection
import qualified Data.ByteString.Lazy.Char8 as LB

myurl = ... -- Your URL goes here

-- | Get a new Manager that doesn't verify SSL certificates
noSSLVerifyManager :: IO Manager
noSSLVerifyManager = let tlsSettings = TLSSettingsSimple {
                            -- This is where we disable certificate verification
                            settingDisableCertificateValidation = True,
                            settingDisableSession=False,
                            settingUseServerName=True}
                     in newManager $ mkManagerSettings tlsSettings Nothing

-- | Download like with simpleHttp, but using an existing manager for the task
simpleHttpWithManager :: Manager -> String -> IO LB.ByteString
simpleHttpWithManager manager url = do url' <- parseUrl url
                                       fmap responseBody $ httpLbs url' manager

main = do manager <- noSSLVerifyManager
          content <- simpleHttpWithManager manager myurl
          print $ content

Обратите внимание, что вам следует отключать проверку SSL-сертификата только в случае крайней необходимости, так как это делает вас уязвимыми для атак «человек посередине».

person Uli Köhler    schedule 23.01.2014