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
命令生成正确类型的文件?
我试过用各种certool输出来运行你的程序,它们都工作。你确定你正在使用最新的'certificate'包吗? –
@ ThomasM.DuBuisson:是的,它仍然发生在'certificate-0.9.5'。但是,我正在使用GnuTLS 2.8.5版。我会尝试版本3.0.5,看看会发生什么。 –
仅供参考,这适用于我使用ghc 7.2.1,证书0.9.5和certtool 2.10.5(gnutls 2.8.6)。编辑:还测试/使用GHC 7.0.1和证书0.9.4。 –