带有来自 OpenSSL 的 ECDSA 证书的 Golang HTTPS

Posted

技术标签:

【中文标题】带有来自 OpenSSL 的 ECDSA 证书的 Golang HTTPS【英文标题】:Golang HTTPS with ECDSA certificate from OpenSSL 【发布时间】:2017-08-04 13:43:39 【问题描述】:

我不知道这是否是正确的地方,但我会尝试。

我正在尝试使用从 OpenSSL 生成的 ECDSA 证书运行 http.ListenAndServeTLS

此错误消息失败:tls: failed to parse private key

去了解elliptic.P256(),在代码中有这个注释See FIPS 186-3, section D.2.3

在这个链接中:http://www.ietf.org/rfc/rfc5480.txt,它说它也被称为secp256r1

如下所示,OpenSSL 将其识别为 prime256v1

$ openssl ecparam -name secp256r1 -text -noout
using curve name prime256v1 instead of secp256r1
ASN1 OID: prime256v1
NIST CURVE: P-256

那么有什么问题吗? 如何从 OpenSSL 生成 ECDSA 证书并将其用于我的 Go 代码?

使用generate_cert.go 生成 P256 ECDSA 证书,我的代码可以工作,但如果我尝试使用 OpenSSL 读取密钥文件,它也会失败。

$ openssl ecparam -text -noout -in key.pem 
unable to load elliptic curve parameters
140377431725720:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:701:Expecting: EC PARAMETERS

【问题讨论】:

我遇到了类似的问题,但是在解析目标服务器的公钥时。因此,我无法生成新证书。 【参考方案1】:

我不知道 OpenSSL 和 Go 之间有什么问题。

但我的主要问题是,如何生成 ECDSA 证书以与 Go 代码一起使用!

使用 CFSSL (https://cfssl.org/) 我可以生成 ECDSA 证书并使用我从 OpenSSL 生成的内部 CA 证书对其进行签名。从CFSSL 生成的证书适用于我的 Go 代码,所以对我来说它解决了我的主要问题!

我不知道 OpenSSL 和 Go 之间是否存在格式问题,但由于 CFSSL 是用 Go 编写的,因此在其上生成的证书在我的代码和浏览器中都可以正常工作。

【讨论】:

【参考方案2】:

这是一个 OpenSSL 生成的 ECDSA 密钥与 Go 配合使用的示例。

https://play.golang.org/p/MS_FQ8cqqA8.

正如本期 - https://github.com/golang/go/issues/23591 中所述,go 无法识别在 Openssl 中使用 -param_enc explicit 标志生成的 EC 密钥。

# openssl ecparam -name prime256v1 -genkey -noout -out priv2.pem

# openssl req -new -x509 -key priv2.pem -out EC_server2.pem -days 365

希望这能解决您的问题。

【讨论】:

我不知道这是我的旧 Go 版本还是 OpenSSL 的问题,但现在即使是我的旧代码也能正常工作。现在我正在使用最新的 Go 版本:1.9.3【参考方案3】:

运行:

go run `go env GOROOT`/src/crypto/tls/generate_cert.go --host=localhost --ecdsa-curve=P256

这将在当前目录中生成cert.pemkey.pem

【讨论】:

以上是关于带有来自 OpenSSL 的 ECDSA 证书的 Golang HTTPS的主要内容,如果未能解决你的问题,请参考以下文章

ECDSA证书可以有RSA签名吗?

使用OpenSSL生成证书

Openssl 生成ECC证书及密钥

生成 256 位 ECDSA 私钥

如何使用椭圆曲线私钥和 ECDSA 算法签署证书?

openssl:创建带有昵称的证书