6

ライブラリ バージョン 2.0+を使用して、 URLhttp-conduitからコンテンツをフェッチします。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サーバー証明書を適切に検証できないことです (この場合、証明書チェーンに問題があるようです)。

証明書エラーを無視するように上記のコードを変更するにはどうすればよいですか (つまり、証明書をまったく検証しないことによって)?

4

1 に答える 1

8

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 証明書の検証を無効にする必要があることに注意してください。

于 2014-01-23T14:16:56.510 に答える