使用 PDXBaap/go-std-ext 讓 go 直接生成 ECC secp256k1 密鑰和 x509 證書

說明

目前 golang crypto/x509 這個庫針對 ECC 的密鑰只支持 P224 / P256 / P384 / P521 這四條曲線拳亿,
區(qū)塊鏈開發(fā)通常使用 secp256k1 曲線,當我們想要為 secp256k1 密鑰簽發(fā)證書時可以選擇在 go 中引用 libssl.so
也可以選擇直接調用 openssl 命令访诱,本例提供了更為優(yōu)雅的第三種選擇,使用 PDXBaap/go-std-ext (PDX 官方提供的 golang 標準庫擴展)
實現(xiàn)讓 x509 庫直使用 ECC secp256k1 密鑰生成和驗證證書鸦难;

安裝 PDXBaap/go-std-ext

假設本地已經(jīng)安裝了 go1.14.4 以上版本的開發(fā)環(huán)境

$> 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 密鑰可以直接拿來創(chuàng)建 x509 證書

userPrv, _ := ecdsa.GenerateKey(elliptic.S256(), rand.Reader)
certTemplate := &x509.Certificate{ ... }
...
// 為 ecc secp256k1 公鑰簽發(fā) x509 數(shù)字證書
certBuf, err := x509.CreateCertificate(rand.Reader, certTemplate, caCert, userPrv.Public(), caPrivkey)
...

測試

樣例代碼都可以在 s256k1_cert.go 中獲得 , 并可以通過 s256k1_cert_test.go 進行測試集漾,其中包含了密鑰和證書的生成與驗證;

生成 S256 密鑰證書

執(zhí)行 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 發(fā)布新版本時一同更新,如果您無法安裝請及時更新本地的 golang 開發(fā)環(huán)境脓规,截止發(fā)稿時間已經(jīng)對 go1.14.4go1.14.5 進行了支持;

特別注意:安裝時 ${GOROOT}/src 目錄將會被改寫险领,權限根據(jù)用戶和組進行判斷侨舆,所以最好將此目錄所有權修改為當前用戶,

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末绢陌,一起剝皮案震驚了整個濱河市挨下,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脐湾,老刑警劉巖臭笆,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異秤掌,居然都是意外死亡愁铺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門闻鉴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茵乱,“玉大人,你說我怎么就攤上這事孟岛∑拷撸” “怎么了督勺?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長斤贰。 經(jīng)常有香客問我智哀,道長,這世上最難降的妖魔是什么荧恍? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任瓷叫,我火速辦了婚禮,結果婚禮上块饺,老公的妹妹穿的比我還像新娘赞辩。我一直安慰自己,他們只是感情好授艰,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布辨嗽。 她就那樣靜靜地躺著,像睡著了一般淮腾。 火紅的嫁衣襯著肌膚如雪糟需。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天谷朝,我揣著相機與錄音洲押,去河邊找鬼。 笑死圆凰,一個胖子當著我的面吹牛杈帐,可吹牛的內容都是我干的。 我是一名探鬼主播专钉,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼挑童,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了跃须?” 一聲冷哼從身側響起站叼,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菇民,沒想到半個月后尽楔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡第练,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年阔馋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娇掏。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡垦缅,死狀恐怖,靈堂內的尸體忽然破棺而出驹碍,到底是詐尸還是另有隱情壁涎,我是刑警寧澤凡恍,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站怔球,受9級特大地震影響嚼酝,放射性物質發(fā)生泄漏。R本人自食惡果不足惜竟坛,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一闽巩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧担汤,春花似錦涎跨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至率碾,卻和暖如春叔营,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背所宰。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工绒尊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仔粥。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓婴谱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親躯泰。 傳聞我的和親對象是個殘疾皇子谭羔,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344