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

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

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 для правильной проверки сертификата сервера (в этом случае, похоже, проблемы в цепочке сертификатов)

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

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-сертификата только в случае крайней необходимости, так как это делает вас уязвимым для атак "человек посередине"

Другие вопросы по тегам