2011-10-29 48 views
3

我正在编写一个程序,以便在我控制的单个服务器上运行,该服务器接受来自客户端的连接。数据需要加密,服务器认证是一个很好的接触。我打算使用tls package from Hackage,因为它提供了客户端和服务器加密功能。如何生成与Network.TLS一起使用的自签名证书

我试图生成一个密钥,并将其转换为X509类型,这对于Network.TLS的pCertificates参数是必需的。我产生使用GnuTLS's 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命令生成正确类型的文件?

+0

我试过用各种certool输出来运行你的程序,它们都工作。你确定你正在使用最新的'certificate'包吗? –

+0

@ ThomasM.DuBuisson:是的,它仍然发生在'certificate-0.9.5'。但是,我正在使用GnuTLS 2.8.5版。我会尝试版本3.0.5,看看会发生什么。 –

+0

仅供参考,这适用于我使用ghc 7.2.1,证书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包。

相关问题