2011-10-29 10 views
3

제어하는 ​​단일 서버에서 실행되는 프로그램을 작성 중이며 클라이언트로부터의 연결을 허용합니다. 데이터를 암호화해야하며 서버 인증은 좋은 방법입니다. tls package from Hackage은 클라이언트 및 서버 암호화 기능을 모두 제공하므로 사용할 계획입니다. Network.TLS와 함께 사용할 자체 서명 된 인증서를 생성하는 방법

나는 키를 생성하고 Network.TLS에 pCertificates 매개 변수에 필요한 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" 

그것을 :

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

나는 X509 파일을 디코딩하려고 사용하고 프로그램은 다음과 같습니다 나는 GnuTLS's certtool를 사용하여 키, "자체 서명 인증서 생성"의 지침에 따라 생성 PEM 래퍼를 성공적으로 파싱하지만 다음 데이터를 인식하지 못합니다.

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

tls 패키지에 버그가 있습니까? 또는 위의 certtool 명령을 사용하여 올바른 유형의 파일을 생성하지 못합니까?

+0

다양한 certool 출력으로 프로그램을 실행 해 보았는데 모두 작동합니다. 최신'certificate' 패키지를 사용하고 있습니까? –

+0

@ ThomasM.DuBuisson : 그렇습니다. 여전히 'certificate-0.9.5'에서 발생합니다. 그러나 GnuTLS 버전 2.8.5를 사용하고 있습니다. 3.0.5 버전을 시도해보고 어떤 일이 일어나는지 살펴 보겠습니다. –

+0

참고로, 이것은 ghc 7.2.1, certificate-0.9.5 및 certtool 2.10.5 (gnutls 2.8.6)를 사용하여 저에게 적합합니다. 편집 : 또한 테스트/GHC 7.0.1 및 인증서 0.9.4 작업. –

답변

1

의견에서 두 가지 해결책을 가진 커뮤니티 위키 답변.

1) 대신 GnuTLS 3.0.4를 사용할 때 작동했습니다.

2) 나중에 참조 할 수 있도록 OpenSSL 툴체인으로 인증서를 생성하여 문제를 해결했습니다.이 인증서는 tls 패키지에서 더 잘 지원되는 것으로 보입니다.

관련 문제