1 回答

TA貢獻1789條經驗 獲得超10個贊
那是一個SSH證書文件,用于實現基于SSH證書的用戶認證。這通過檢查公鑰層次結構中受信任的證書頒發機構的有效簽名來驗證用戶登錄的真實性。與標準的基于 SSH 密鑰的身份驗證(使用文件)相比,這種方法具有多種優勢authorized_keys
,例如:
控制密鑰文件的發布(有權訪問 CA 主密鑰的人必須簽署新證書,而不是用戶發布自己的證書
ssh-keygen
)自動密鑰文件到期
添加或輪換證書時減少管理開銷,因為只需要 CA 的公鑰來驗證證書;不再需要
authorized_keys
為每個主機上的每個用戶填充一個文件當與用戶的關系發生變化時,為證書吊銷提供更簡單的支持
假設您使用的是內置golang.org/x/crypto/ssh
庫,您可以通過以下方式實現:
讀入并解析您簽名的公鑰證書和私鑰
從私鑰創建簽名者
使用讀入的公鑰和相應的私鑰簽名者創建證書簽名者
OpenSSH 公鑰證書的指定格式類似于文件authorized_keys
。ParseAuthorizedKeys
Go庫的函數會解析這個文件,將對應的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上,對于非證書連接,您可能根本不需要讀取公鑰。)
- 1 回答
- 0 關注
- 196 瀏覽
添加回答
舉報