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

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

如何將 id_ed25519-cert.pub 合并到 go ssh 客戶端中?

如何將 id_ed25519-cert.pub 合并到 go ssh 客戶端中?

Go
冉冉說 2023-03-29 15:31:26
我可以使用兩個文件通過 SSH(使用 openssh 客戶端)連接到我的服務器:~/.ssh/id_ed25519{,-cert.pub}debug1: Trying private key: /home/xavier/.ssh/id_ed25519                        debug1: Authentications that can continue: publickey,keyboard-interactive      debug1: Offering ED25519-CERT public key: /home/xavier/.ssh/id_ed25519          debug1: Server accepts key: pkalg [email protected] blen 441    debug1: sign_and_send_pubkey: no separate private key for certificate "/home/xavier/.ssh/id_ed25519"debug1: Authentication succeeded (publickey).我想要一個做同樣事情的 go 客戶端,但我不知道如何將該文件合并到https://godoc.org/golang.org/x/crypto/ssh#example-PublicKeysid_ed25519-cert.pub的示例中key, err := ioutil.ReadFile("/home/xavier/.ssh/id_ed25519")if err != nil {    log.Fatalf("unable to read private key: %v", err)}// Create the Signer for this private key.signer, err := ssh.ParsePrivateKey(key)if err != nil {    log.Fatalf("unable to parse private key: %v", err)}config := &ssh.ClientConfig{    User: "user",    Auth: []ssh.AuthMethod{        // Use the PublicKeys method for remote authentication.        ssh.PublicKeys(signer),    },}// Connect to the remote server and perform the SSH handshake.client, err := ssh.Dial("tcp", "host.com:22", config)if err != nil {    log.Fatalf("unable to connect: %v", err)}defer client.Close()部分問題是我不知道這個文件是什么(PublicKey?證書?),部分問題是即使我知道我也不明白它在這個交換中的作用。我已確認此文件是必需的:刪除它會導致 ssh CLI 失敗。
查看完整描述

1 回答

?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

那是一個SSH證書文件,用于實現基于SSH證書的用戶認證。這通過檢查公鑰層次結構中受信任的證書頒發機構的有效簽名來驗證用戶登錄的真實性。與標準的基于 SSH 密鑰的身份驗證(使用文件)相比,這種方法具有多種優勢authorized_keys,例如:

  • 控制密鑰文件的發布(有權訪問 CA 主密鑰的人必須簽署新證書,而不是用戶發布自己的證書ssh-keygen

  • 自動密鑰文件到期

  • 添加或輪換證書時減少管理開銷,因為只需要 CA 的公鑰來驗證證書;不再需要authorized_keys為每個主機上的每個用戶填充一個文件

  • 當與用戶的關系發生變化時,為證書吊銷提供更簡單的支持


假設您使用的是內置golang.org/x/crypto/ssh庫,您可以通過以下方式實現:

  • 讀入并解析您簽名的公鑰證書和私鑰

  • 從私鑰創建簽名者

  • 使用讀入的公鑰和相應的私鑰簽名者創建證書簽名者

OpenSSH 公鑰證書的指定格式類似于文件authorized_keysParseAuthorizedKeysGo庫的函數會解析這個文件,將對應的key作為接口實例返回ssh.PublicKey;對于證書,這具體是結構的一個實例ssh.Certificate

請參閱代碼示例(注意:我HostKeyCallback在您的代碼中添加了一個ClientConfig以實現與測試盒的連接——但是,它使用了InsecureIgnoreHostKey檢查器,我不建議在生產中使用它?。?。

package main


import (

? ? "bytes"

? ? "io/ioutil"

? ? "log"


? ? "golang.org/x/crypto/ssh"

)


func main() {

? ? key, err := ioutil.ReadFile("/tmp/mycert")

? ? if err != nil {

? ? ? ? log.Fatalf("unable to read private key: %v", err)

? ? }


? ? // Create the Signer for this private key.

? ? signer, err := ssh.ParsePrivateKey(key)

? ? if err != nil {

? ? ? ? log.Fatalf("unable to parse private key: %v", err)

? ? }


? ? // Load the certificate

? ? cert, err := ioutil.ReadFile("/tmp/mycert-cert.pub")

? ? if err != nil {

? ? ? ? log.Fatalf("unable to read certificate file: %v", err)

? ? }


? ? pk, _, _, _, err := ssh.ParseAuthorizedKey(cert)

? ? if err != nil {

? ? ? ? log.Fatalf("unable to parse public key: %v", err)

? ? }


? ? certSigner, err := ssh.NewCertSigner(pk.(*ssh.Certificate), signer)

? ? if err != nil {

? ? ? ? log.Fatalf("failed to create cert signer: %v", err)

? ? }


? ? config := &ssh.ClientConfig{

? ? ? ? User: "user",

? ? ? ? Auth: []ssh.AuthMethod{

? ? ? ? ? ? // Use the PublicKeys method for remote authentication.

? ? ? ? ? ? ssh.PublicKeys(certSigner),

? ? ? ? },

? ? ? ? HostKeyCallback: ssh.InsecureIgnoreHostKey(),

? ? }


? ? // Connect to the remote server and perform the SSH handshake.

? ? client, err := ssh.Dial("tcp", "host.com:22", config)

? ? if err != nil {

? ? ? ? log.Fatalf("unable to connect: %v", err)

? ? }

? ? defer client.Close()

}

如果您想編寫一個更通用的支持證書和非證書的連接客戶端,您顯然需要額外的邏輯來處理其他類型的公鑰。如所寫,我希望pk.(*ssh.Certificate)非證書公鑰文件的類型斷言失?。。▽嶋H上,對于非證書連接,您可能根本不需要讀取公鑰。)


查看完整回答
反對 回復 2023-03-29
  • 1 回答
  • 0 關注
  • 196 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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