亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

生成與 openssh 兼容的 ed25519 密鑰對

生成與 openssh 兼容的 ed25519 密鑰對

Go
達令說 2022-11-28 17:13:54
我想在 go 中使用 ed25519 生成與 openssh 兼容的 ssh 密鑰來替換 rsa.GenerateKey,因為 github 不再支持它。它應該相當于:ssh-keygen -t ed25519 -C "[email protected]"但我找不到辦法做到這一點?,F在,我有這段代碼:func GenerateSSHKeys() (*ED25519Keys, error) {    publicKey, privateKey, err := ed25519.GenerateKey(rand.Reader)    if err != nil {        return nil, err    }    publicED25519Key, err := ssh.NewPublicKey(publicKey)    if err != nil {        return nil, err    }    pubKeyBytes := ssh.MarshalAuthorizedKey(publicED25519Key)    bytes, err := x509.MarshalPKCS8PrivateKey(privateKey)     if err != nil {        return nil, err    }    privBlock := pem.Block{        Type:    "PRIVATE KEY",        Headers: nil,        Bytes:   bytes,    }    privatePEM := pem.EncodeToMemory(&privBlock)    return &ED25519Keys{        Public:  pubKeyBytes,        Private: privatePEM,    }, nil}但似乎私鑰更短,我無法解釋我在 git 或 argocd 中使用它時的一些奇怪行為(有時它有效,但大多數時候無效)。-----BEGIN PRIVATE KEY-----MC4CAQAwBQYDK2VwBCIEINV+5Hyey1xTblwsVGfGmDCMdZgKQdhf1ublkGO2Qaf+-----END PRIVATE KEY-----我怎么能得到這樣的結果:-----BEGIN OPENSSH PRIVATE KEY-----b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZWQyNTUxOQAAACAxIu+ndqJXpEJLk5c2qsjPvUybP8OANZlSqLaOau9ZCQAAAKCocC5dqHAu[...]AAAEChVq8FJPCYbKnNFFuISac83mzF+DDFCDrLd9Xva9fQ2zEi76d2olekQkuTlzaqyM+9TJs/w4A1mVKoto5q71kJAAAAFnlvdXJfZW1haWxAZXhhbXBsZS5jb20BAgMEBQYH-----END OPENSSH PRIVATE KEY-----
查看完整描述

1 回答

?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

是的,我也遇到過這個。

x509包不支持ed25519所使用格式的封送處理密鑰類型openssh,因此正如您所發現的,此代碼 - 適用于其他密鑰類型 - 對ed25519密鑰失?。?/p>

bytes, err := x509.MarshalPKCS8PrivateKey(privateKey)  // produces invalid output for ed25519 keys

有一個帶有輔助函數edkey.MarshalED25519PrivateKey的 repo ( github.com/mikesmitty/edkey )來解決這個問題:

/* 將 ed25519 私鑰寫入新的 OpenSSH 私鑰格式。我不知道為什么這還沒有在任何地方實現,除了以 OpenSSH 私鑰格式將其寫入磁盤之外,您似乎可以做任何事情。*/

它似乎是仿照 openssh 來源:sshkey.c sshkey_private_to_blob2

因此,要么將該輔助函數復制到您的代碼中(推薦,因為 repo 已有 5 年以上歷史),要么將其作為導入引用:

import "github.com/mikesmitty/edkey"


pubKey, privKey, _ := ed25519.GenerateKey(rand.Reader)

publicKey, _ := ssh.NewPublicKey(pubKey)


pemKey := &pem.Block{

    Type:  "OPENSSH PRIVATE KEY",

    Bytes: edkey.MarshalED25519PrivateKey(privKey),  // <- marshals ed25519 correctly

}

privateKey := pem.EncodeToMemory(pemKey)

authorizedKey := ssh.MarshalAuthorizedKey(publicKey)


_ = ioutil.WriteFile("id_ed25519", privateKey, 0600)

_ = ioutil.WriteFile("id_ed25519.pub", authorizedKey, 0644)


查看完整回答
反對 回復 2022-11-28
  • 1 回答
  • 0 關注
  • 323 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號