You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Go代码中从RSA私钥提取SSH公钥(AWS Lambda场景)

从RSA私钥生成SSH公钥(Go实现,无系统命令)

要在Go中直接从RSA私钥生成对应SSH公钥,完全不需要调用ssh-keygen这类系统命令,适合AWS Lambda这类受限环境。核心思路是用Go标准库解析私钥,再通过golang.org/x/crypto/ssh包转换为SSH公钥格式。

实现步骤与代码示例

假设你已经有了private_key字符串变量(内容是-----BEGIN RSA PRIVATE KEY-----开头的PEM格式私钥),可以按以下代码实现:

package main

import (
	"crypto/rsa"
	"crypto/x509"
	"encoding/pem"
	"fmt"

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

func getSSHPublicKey(privateKeyStr string) (string, error) {
	// 解析PEM格式的私钥块
	block, _ := pem.Decode([]byte(privateKeyStr))
	if block == nil || block.Type != "RSA PRIVATE KEY" {
		return "", fmt.Errorf("无效的RSA私钥格式")
	}

	// 将PEM块解析为RSA私钥对象
	privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
	if err != nil {
		return "", err
	}

	// 转换为SSH公钥格式
	publicKey, err := ssh.NewPublicKey(&privateKey.PublicKey)
	if err != nil {
		return "", err
	}

	// 格式化为ssh-rsa开头的字符串(和ssh-keygen输出一致)
	return string(ssh.MarshalAuthorizedKey(publicKey)), nil
}

// 在Lambda handler中调用示例
// func Handler(ctx context.Context) (string, error) {
//     pubKey, err := getSSHPublicKey(private_key)
//     if err != nil {
//         return "", err
//     }
//     return pubKey, nil
// }

关键说明

  • 依赖处理:需要引入golang.org/x/crypto/ssh包,用Go Modules管理依赖即可,打包Lambda函数时会自动包含该依赖,无需额外系统配置。
  • 私钥格式兼容:上述代码针对PKCS1格式的RSA私钥(-----BEGIN RSA PRIVATE KEY-----),如果是PKCS8格式(-----BEGIN PRIVATE KEY-----),需要替换解析逻辑为:
    key, err := x509.ParsePKCS8PrivateKey(block.Bytes)
    if err != nil {
        return "", err
    }
    privateKey, ok := key.(*rsa.PrivateKey)
    if !ok {
        return "", fmt.Errorf("不是RSA私钥")
    }
    
  • 错误处理:Lambda函数中建议将错误转化为合适的响应格式,避免直接终止进程。

内容的提问来源于stack exchange,提问作者Mit94

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:55:20