#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.