Как сгенерировать самозаверяющий сертификат для использования с Network.TLS

#haskell #ssl

#хаскелл #ssl

Вопрос:

Я пишу программу для запуска на одном сервере, который я контролирую, который принимает подключения от клиентов. Данные должны быть зашифрованы, а аутентификация сервера — приятный штрих. Я планирую использовать пакет tls от Hackage, поскольку он обеспечивает как клиентскую, так и серверную функциональность шифрования.

Я пытаюсь сгенерировать ключ и преобразовать его в X509 тип, необходимый для pCertificates параметра Network.TLS. Я сгенерировал ключ с помощью GnuTLS certtool, следуя инструкциям в разделе «Генерация самозаверяющего сертификата».:

 certtool --generate-privkey --outfile ca-key.pem
certtool --generate-self-signed --load-privkey ca-key.pem --outfile ca-cert.pem
 

Вот программа, которую я использую, чтобы попытаться расшифровать файл X509:

 import Data.ByteString (ByteString)
import Data.Certificate.PEM
import Data.Certificate.X509

import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as L

decode :: ByteString -> Either String X509
decode pem =
    case parsePEMCert pem of
        Nothing       -> Left "certificate not in PEM format"
        Just certdata -> decodeCertificate $ L.fromChunks [certdata]

main :: IO ()
main = print . decode =<< B.readFile "ca-cert.pem"
 

Он успешно анализирует оболочку PEM, но не распознает данные внутри:

 $ ./decode
Left "certificate error: "subject public key bad format : [OID [1,2,840,113549,1,1,1]]""
 

Это ошибка в пакете tls? Или я не генерирую файл нужного типа с помощью certtool приведенных выше команд?

Комментарии:

1. Я пробовал запускать вашу программу с различными выводами certool, и все они работают. Вы уверены, что используете последний certificate пакет?

2. @ThomasM.DuBuisson: Да, это все еще происходит с. certificate-0.9.5 Тем не менее, я использую GnuTLS версии 2.8.5. Я попробую версию 3.0.5 и посмотрю, что получится.

3. К вашему сведению, это работает для меня, используя ghc 7.2.1, certificate-0.9.5 и certtool 2.10.5 (gnutls 2.8.6). РЕДАКТИРОВАТЬ: Также протестировано / работает с GHC 7.0.1 и сертификатом-0.9.4.

4. Я использую Ubuntu 10.04, 64-разрядную версию. Интересно, влияет ли это на что-нибудь? Все еще ожидаю компиляции gnutls.

5. @Thomas M. Dubuisson: это сработало, когда вместо этого я использовал GnuTLS 3.0.4. Спасибо за помощь!

Ответ №1:

Сообщество-вики ответ с двумя решениями из комментариев.

1) Это сработало, когда вместо этого я использовал GnuTLS 3.0.4.

2) Для будущих ссылок мы решили проблему, создав сертификат с помощью набора инструментов OpenSSL, который, по-видимому, лучше поддерживается пакетом tls.