說明
目前
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.pem
和 user.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.4
和go1.14.5
進行了支持;特別注意:安裝時
${GOROOT}/src
目錄將會被改寫险领,權限根據(jù)用戶和組進行判斷侨舆,所以最好將此目錄所有權修改為當前用戶,例如
chown -R {CURRENT_USER}:{CURRENT_GROUP} {GOROOT}/src