如何生成用于Network.TLS的自签名证书

时间:2011-10-29 19:10:02

标签: haskell ssl

我正在编写一个程序,在我控制的单个服务器上运行,接受来自客户端的连接。数据需要加密,服务器身份验证是一个不错的选择。我打算使用tls package from Hackage,因为它提供了客户端和服务器加密功能。

我正在尝试生成密钥并将其转换为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命令生成正确类型的文件?

1 个答案:

答案 0 :(得分:1)

社区维基回答了评论中的两个解决方案。

1)当我使用GnuTLS 3.0.4时它起作用了。

2)为了将来的参考,我们通过使用OpenSSL工具链生成证书来解决这个问题,这似乎更好地受到tls包的支持。