使用 PDXBaap/go-std-ext 让 go 直接生成 ECC secp256k1 密钥和 x509 证书

说明

目前 golang crypto/x509 这个库针对 ECC 的密钥只支持 P224 / P256 / P384 / P521 这四条曲线,
区块链开发通常使用 secp256k1 曲线,当我们想要为 secp256k1 密钥签发证书时可以选择在 go 中引用 libssl.so
也可以选择直接调用 openssl 命令,本例提供了更为优雅的第三种选择,使用 PDXBaap/go-std-ext (PDX 官方提供的 golang 标准库扩展)
实现让 x509 库直使用 ECC secp256k1 密钥生成和验证证书;

安装 PDXBaap/go-std-ext

假设本地已经安装了 go1.14.4 以上版本的开发环境

$> go get -v -u github.com/PDXbaap/go-std-ext
...

$> go-std-ext
GOROOT :  /usr/local/go/src
VERSION :  go version go1.14.4 darwin/amd64
Success.

使用

通过以上步骤安装 go-std-ext 成功以后,可以直接使用标准库生成 ECC secp256k1 密钥

// 生成 ecc secp256k1 密钥
caPrivkey, _ := ecdsa.GenerateKey(elliptic.S256(), rand.Reader)

其中 elliptic.S256() 对应的即为 secp256k1 曲率,这个 ECC 密钥可以直接拿来创建 x509 证书

userPrv, _ := ecdsa.GenerateKey(elliptic.S256(), rand.Reader)
certTemplate := &x509.Certificate{ ... }
...
// 为 ecc secp256k1 公钥签发 x509 数字证书
certBuf, err := x509.CreateCertificate(rand.Reader, certTemplate, caCert, userPrv.Public(), caPrivkey)
...

测试

样例代码都可以在 s256k1_cert.go 中获得 , 并可以通过 s256k1_cert_test.go 进行测试,其中包含了密钥和证书的生成与验证;

生成 S256 密钥证书

执行 s256k1_cert_test.go 中的 TestAll 方法会得到如下结果:

测试代码:https://github.com/cc14514/go-s256k1-cert

=== RUN   TestAll
==================================================================== ca key
-----BEGIN ECC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,fd9b8bfdd18b1987f9ca9eff2d3c728e

qWIVrcrxadTVZhOd+a9xEBtVMxdlZMRAI9M1aM9LDjMqZvgrnhNoOrbiZ6Cm7qeN
Ae+AISGkv3/w5AXWqY1I/KFr5m+FRq8Yuf/KMMI6K7IQKHuEt2NF5quhl2grbUze
Ts+//mxG6ScL/MQdLyIZQIAUIz1AXmFVzOU7HEa3lcU=
-----END ECC PRIVATE KEY-----

-----BEGIN ECC PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE8MysP6rQzmiE7iDNanSAu1qcwFlyqCtf
2Cd8uXZh0Pv6d6Yq8naGIXWGdoGKCGVOC1GBCTybUVuvIPYzldu0iw==
-----END ECC PUBLIC KEY-----

==================================================================== ca cert
-----BEGIN CERTIFICATE-----
MIIB0jCCAXegAwIBAgIQfxrDA5/tS1WT0YdFPZf4PjAKBggqhkjOPQQDAjBKMQ8w
DQYDVQQGDAbkuK3lm70xDzANBgNVBAoMBue7hOe7hzEVMBMGA1UECwwM57uE57uH
5Y2V5L2NMQ8wDQYDVQQDDAbkvaDlpb0wHhcNMjAwNzE4MDIwNzAwWhcNMzAwNzE2
MDIwNzAwWjBKMQ8wDQYDVQQGDAbkuK3lm70xDzANBgNVBAoMBue7hOe7hzEVMBMG
A1UECwwM57uE57uH5Y2V5L2NMQ8wDQYDVQQDDAbkvaDlpb0wVjAQBgcqhkjOPQIB
BgUrgQQACgNCAATwzKw/qtDOaITuIM1qdIC7WpzAWXKoK1/YJ3y5dmHQ+/p3piry
doYhdYZ2gYoIZU4LUYEJPJtRW68g9jOV27SLo0IwQDAOBgNVHQ8BAf8EBAMCAZYw
DwYDVR0TAQH/BAUwAwEB/zAdBgNVHREEFjAUgRJjYzE0NTE0QGljbG91ZC5jb20w
CgYIKoZIzj0EAwIDSQAwRgIhAJvADh56SOTCDojMrBS5cvycOueB8K4utKr5VOzv
+ZK0AiEAtOLYwA4WK1Z+jtTv8OKyvKKFfzzgl2dgJFQjwCQISOs=
-----END CERTIFICATE-----

==================================================================== user key
-----BEGIN ECC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,2b81dce585d3ec652266ec9c044f57f3

2MXeBnwBSJYxxEc4apQK4xqtwkNnOmYejthDF9pN6xu7UlI3wg9NpJ8XJ8bvyqoi
8EMpxGS1+VxKSmHUkRN1/nLLQMC6JaszrzlOwgp3Xf437704kV+14WrqZokkqpir
qAC5uzwZMIHJaSnxtHxlj6OwLPiN/ZIG6SnYvdtH7vo=
-----END ECC PRIVATE KEY-----

-----BEGIN ECC PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE0+1Io0gPE4NQAwr9dYXsqGkNEVxXrl6w
6qR3Mc6Fa7TDvrOF/KXfIVMpJSXUBxML1fb50jwbXECR7n2mdTJGXg==
-----END ECC PUBLIC KEY-----

==================================================================== user cert
-----BEGIN CERTIFICATE-----
MIIBtDCCAVugAwIBAgIQE82sZtWDSnudhgqZ0sQtejAKBggqhkjOPQQDAjBKMQ8w
DQYDVQQGDAbkuK3lm70xDzANBgNVBAoMBue7hOe7hzEVMBMGA1UECwwM57uE57uH
5Y2V5L2NMQ8wDQYDVQQDDAbkvaDlpb0wHhcNMjAwNzE4MDIwNzAwWhcNMzAwNzE2
MDIwNzAwWjBHMQ8wDQYDVQQGDAbkuK3lm70xEjAQBgNVBAoMCeeyvuatpumXqDEP
MA0GA1UECwwG5rGf5rmWMQ8wDQYDVQQDDAbpmYjnnJ8wVjAQBgcqhkjOPQIBBgUr
gQQACgNCAATT7UijSA8Tg1ADCv11heyoaQ0RXFeuXrDqpHcxzoVrtMO+s4X8pd8h
UyklJdQHEwvV9vnSPBtcQJHufaZ1MkZeoykwJzAOBgNVHQ8BAf8EBAMCBLAwFQYD
VR0RBA4wDIEKY3pAandtLmNvbTAKBggqhkjOPQQDAgNHADBEAiAbaHQIm5mx8WAJ
qFhNZ8A9Vps7+096WyCZUVixReGntwIgGF7jGblcRy+22x70uKseZf0itsJQG4lP
ZV9t49tovGw=
-----END CERTIFICATE-----

--- PASS: TestAll (0.02s)

并会在 /tmp 目录下生成 ca.pemuser.pem

使用 openssl 验证证书

使用 openssl 来验证 go-std-ext 生成的 secp256k1 证书

$>openssl verify -CAfile /tmp/ca.pem /tmp/user.pem
user.pem: OK

验证通过,大功告成。

结束语

对于 crypto 的扩展将从 go1.14.4 开始迭代, PDXBaap/go-std-ext 会在每次 golang 发布新版本时一同更新,如果您无法安装请及时更新本地的 golang 开发环境,截止发稿时间已经对 go1.14.4go1.14.5 进行了支持;

特别注意:安装时 ${GOROOT}/src 目录将会被改写,权限根据用户和组进行判断,所以最好将此目录所有权修改为当前用户,

例如 chown -R {CURRENT_USER}:{CURRENT_GROUP} {GOROOT}/src

搬家:https://blog.csdn.net/lancefox/article/details/107321807

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,113评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,644评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,340评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,449评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,445评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,166评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,442评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,105评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,601评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,066评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,161评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,792评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,351评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,352评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,584评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,618评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,916评论 2 344