Возможно, я просто пропустил что-то основное в документации http-client-tls и tls, но: как я могу установить HTTPS-соединение с сервером и принимать только один конкретный сертификат, указанный мной, который потенциально не входит в систему магазин сертификатов?Принимать конкретный сертификат с помощью http-client-tls или tls?
ответ
Я думаю, что вы ищете ClientHooks. Вы можете создать значение TLSSettings с помощью конструктора TLSSettings, а затем создать ManagerSettings
с помощью mkManagerSettings.
Я вижу, что это старый вопрос, но я просто потратил некоторое время на создание кода, чтобы сделать это, и решил, что я отправлю его сюда для потомков ... и в надежде получить от него обзор кода. Комментарий Snoyman полезен, но здесь так много взаимозависимостей кода, и X.509 и TLS настолько кипят океан, что его трудно отлаживать, и точно знать, что вы ничего не прикручиваете, не копая довольно глубоко в различные библиотеки. Я понял, что более полное объяснение с рабочим кодом было в порядке.
В любом случае, вот что я придумал (это stack script так что вы можете запустить его легко самостоятельно) -
#!/usr/bin/env stack
{- stack --resolver lts-7.16 runghc -}
import qualified Data.ByteString as B
import Data.ByteString.Lazy (ByteString)
import Data.Default.Class (def)
import Data.String (fromString)
import Data.X509.CertificateStore (CertificateStore, readCertificateStore)
import Network.HTTP.Client (httpLbs, newManager, ManagerSettings)
import Network.HTTP.Client.TLS (mkManagerSettings)
import Network.Connection (TLSSettings(TLSSettings))
import qualified Network.TLS as TLS
import qualified Network.TLS.Extra.Cipher as TLS
import System.Environment (getArgs, getProgName)
managerSettings :: CertificateStore -> ManagerSettings
managerSettings store = mkManagerSettings settings Nothing
where settings = TLSSettings params
params = (TLS.defaultParamsClient "" B.empty) {
TLS.clientUseServerNameIndication = True
, TLS.clientShared = def {
TLS.sharedCAStore = store
}
, TLS.clientSupported = def {
TLS.supportedCiphers = TLS.ciphersuite_default
}
}
get :: FilePath -> String -> IO()
get ca url = do
mstore <- readCertificateStore ca
case mstore of
Just store -> do
manager <- newManager $ managerSettings store
response <- httpLbs (fromString url) manager
putStrLn (show response)
Nothing -> do
putStrLn $ "error: invalid certificate store " ++ ca
main :: IO()
main = do
args <- getArgs
case args of
ca:url:[] -> get ca url
_ -> do
name <- getProgName
putStrLn $ "usage: " ++ name ++ " ca url"
Пара отмечает:
- В
TLS.sharedCAStore
параметров настройки где происходят чудеса. Если вы хотите добавить ЦС в системном хранилище (по сравнению с использованием только ваш CA) вы можете загрузить систему магазина, используяgetSystemCertificateStore
изSystem.X509
, а затем использоватьData.X509.CertificateStore
конвертировать туда и обратно междуCertificateStore
и[SignedCertificate]
создать магазин с сертификатами системы вместе с вашими собственными. TLS.defaultParamsClient
принимает имя хоста и идентификатор сервера, используемый для обозначения имени сервера TLS (SNI), расширение TLS, которое позволяет серверу размещать несколько сайтов на одном IP-адресе (подобно тому, как работают заголовки хостов HTTP/1.1). Мы не обязательно знаем, как это установить, когда мы создаем менеджера. К счастью,Network.Connection
(используетсяhttp-client-tls
) отображается override whatever settings we use, так что это не имеет значения.- По умолчанию для
TLS.supportedCiphers
является пустым списком, поэтому этот параметр требуется (если вы не отключите проверку или что-то еще).Network.Connection
defaults tociphersuite_all
, но это включает в себя некоторые «не рекомендованные последние списки шифрования ресурсов», поэтому я решил использовать вместо этогоciphersuite_default
.
- 1. Создать самоподписанный сертификат с TLS
- 2. Несколько сертификатов в сообщении «сертификат» TLS «сертификат»
- 3. TLS-сертификат на производственном сервере
- 4. Как заставить java-сервер принимать только tls 1.2 и отклонять tls 1.0 и tls 1.1 соединения
- 5. Как понять сертификат TLS в формате PEM или DER
- 6. Создайте клиентский сертификат для TLS Asterisk
- 7. Можно ли отключить сертификат tls в node.js?
- 8. Как заставить Apache принимать самоподписанный сертификат, созданный с помощью ключевого инструмента Java.
- 9. Как подключить сертификат tls/ssl в NSURLRequest?
- 10. Как предоставить клиентский сертификат http-client-tls?
- 11. Как использовать tls-сертификат вместо ssl
- 12. Вручную проверить сертификат TLS (ios object-c)
- 13. Установить сертификат TLS 1.2 на приложение iOS
- 14. Аутентификация с помощью STARTTLS и SSL/TLS
- 15. Android TLS-соединение и самоподписанный сертификат
- 16. Как получить сертификат SSL/TLS в JAVA
- 17. Как принимать сертификат клиента постоянно через STARTTLS
- 18. TLS: Как проверить сертификат, подписанный с ключом RSA
- 19. TLS самозаверяющий сертификат для URL-адреса авторизации для Docker
- 20. wsdl.exe с SSL/TLS
- 21. Разрешить только один конкретный ненадежный сертификат TrustManager
- 22. Не удается защитить соединение с помощью TLS
- 23. Сертификат CA для подключения к серверу MQTT через TLS - iot.eclipse.org
- 24. Получить сертификат SSL/TLS на сервере Amazon EC2
- 25. Загрузить конкретный сертификат в Java от worklight
- 26. Подтвердить сертификат TLS при предварительной обработке ReverseProxy в GoLang
- 27. Можно ли повторно использовать сертификат WebSphere MQ TLS/SSL?
- 28. Обновление TLS для путаницы PayPal - корневой сертификат g5
- 29. Принимать или не размещать?
- 30. Как проверить сертификат SSL/TLS сервера SMTP с помощью java mail API?
Действительно. Спасибо. – gspr