使用 ssh golang 包解析 ssh 密钥

时间:2021-07-06 06:23:51

标签: go rsa ssh-keys pkcs#8 pkcs#1

我正在尝试使用 golang (https://pkg.go.dev/golang.org/x/crypto/ssh#ParseRawPrivateKey) 的 ssh 包中的 ParseRawPrivateKey()。该文档声明它支持 PKCS1 和 PKCS8 类型。我有两种类型的键:

  1. 私钥 (PKCS8)
  2. RSA 私钥 (PKCS1)

但是我在使用 PKCS8 类型时遇到以下错误。它与“RSA PRIVATE KEY”类型完美配合:

ssh: unsupported key type "PRIVATE KEY"

请告诉我为什么这不起作用并帮助我解析这两种类型的键。我使用的 Go 版本是 1.11.13。

我试图解析密钥文件的代码部分如下。以下代码中的错误是我看到上述错误的地方:

buf, _ := ioutil.ReadFile(<keyfile>)
key, err := ssh.ParseRawPrivateKey(buf)
signer, _ := ssh.NewSignerFromKey(key)

以下是关键文件:

-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----

1 个答案:

答案 0 :(得分:0)

感谢以上评论中的帮助。问题是去版本。这适用于 go1.12.15+。我跟随 this 并在我的机器上安装了各种版本的 go 并在各种版本上尝试了 sample code。 以下是我看到的差异:

bash> go1.12.15 run test.go   
Go version: go1.12.15
&{{144479305181965272490254391937025069107948546376651838223957892566897461066699421944565346422245724715479373672069322891078162435195710365456982744608092875180392440184046997322460990034866647878368774295132982263484396416207829505054992733049356448573060223609095630481896584887339018846095104448737699187657 65537} 2645454723566204235596766259127364434281982020110505605516722936360787849307098377000448841214807965860128605314298601847716479580005988045659387727996573252188486690862166280792012065797946748750551729842440936084694300539272090480528208606882126846797991966205614019665289902037602352045258789517854779073 [13263472511923445942519309104215506888615505598321091479402380111710326104845418963276768049143608185415654643773759208206999416418839087584135630592068539 10893022551378072895182930140189193062535475752041804793170952109393846495498117381783390279015666041475046770751717018290963057312218682415905914066572363] {7952781113394627946919126151017784742893860078911540210485617725403496873766049461844818610237685998048332466877239450168641363925640489886723434697131777 9487036959085061029819053153817214117573277461205763675246221287211528911455232066121921210089814704904294056501922638662306626566165951369990658148707101 11643611777085191570803741719831263049793572409284501604810833118017412892519680723494951942101995443325154130770992562619423947706172758471124284788676524 []}}
&{0xc0000ae0c0 0xc0000ae0c0}

bash> go1.11.13 run test.go
# golang.org/x/crypto/curve25519/internal/field
../pkg/mod/golang.org/x/crypto@v0.0.0-20210616213533-5ff15b29337e/curve25519/internal/field/fe.go:328:12: undefined: bits.Mul64
../pkg/mod/golang.org/x/crypto@v0.0.0-20210616213533-5ff15b29337e/curve25519/internal/field/fe_generic.go:17:12: undefined: bits.Mul64
../pkg/mod/golang.org/x/crypto@v0.0.0-20210616213533-5ff15b29337e/curve25519/internal/field/fe_generic.go:23:12: undefined: bits.Mul64
../pkg/mod/golang.org/x/crypto@v0.0.0-20210616213533-5ff15b29337e/curve25519/internal/field/fe_generic.go:24:11: undefined: bits.Add64
../pkg/mod/golang.org/x/crypto@v0.0.0-20210616213533-5ff15b29337e/curve25519/internal/field/fe_generic.go:25:10: undefined: bits.Add64
note: module requires Go 1.17%