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

如何在Go语言中将crypto/rsa生成的RSA公私钥写入文件?

哈哈,这个坑我刚踩过不久!直接把RSA密钥结构体转字符串肯定不行,因为Go里的rsa.PrivateKey和rsa.PublicKey是复杂结构体,就算能调用String()方法,输出的也只是结构体的字段描述,根本不是能被其他程序识别的有效密钥格式。正确的做法是先把密钥序列化为标准的二进制格式,再用PEM编码包装后写入文件,下面给你详细的步骤和代码:

核心思路:序列化 + PEM编码

RSA密钥需要先通过crypto/x509包序列化为通用的标准格式(比如PKCS#8私钥、PKIX公钥),再用encoding/pem包把二进制数据编码成带头部尾部的文本格式(也就是我们常见的-----BEGIN PRIVATE KEY-----那种格式),这样既方便存储,也能被其他语言或工具解析。

假设你已经通过crypto/rsa生成了*rsa.PrivateKey类型的私钥privKey和*rsa.PublicKey类型的公钥pubKey,接下来分两步处理:

1. 写入RSA私钥到文件

推荐使用PKCS#8格式(通用标准,兼容性更好),代码如下:

import (
    "crypto/rsa"
    "crypto/x509"
    "encoding/pem"
    "log"
    "os"
)

func writePrivateKey(privKey *rsa.PrivateKey, filePath string) error {
    // 第一步:将私钥序列化为PKCS#8格式的字节流
    privBytes, err := x509.MarshalPKCS8PrivateKey(privKey)
    if err != nil {
        return err
    }

    // 第二步:创建PEM块,指定类型为"PRIVATE KEY"
    privPemBlock := &pem.Block{
        Type:  "PRIVATE KEY",
        Bytes: privBytes,
    }

    // 第三步:打开/创建文件并写入PEM内容
    file, err := os.Create(filePath)
    if err != nil {
        return err
    }
    defer file.Close()

    return pem.Encode(file, privPemBlock)
}

如果你的场景要求用旧的PKCS#1格式(比如某些老系统依赖),只需要替换序列化方法和PEM类型:

// 替换序列化步骤
privBytes, err := x509.MarshalPKCS1PrivateKey(privKey)
// 替换PEM块类型为"RSA PRIVATE KEY"
privPemBlock := &pem.Block{
    Type:  "RSA PRIVATE KEY",
    Bytes: privBytes,
}

2. 写入RSA公钥到文件

公钥通常用PKIX格式序列化,代码如下:

func writePublicKey(pubKey *rsa.PublicKey, filePath string) error {
    // 第一步:将公钥序列化为PKIX格式的字节流
    pubBytes, err := x509.MarshalPKIXPublicKey(pubKey)
    if err != nil {
        return err
    }

    // 第二步:创建PEM块,指定类型为"PUBLIC KEY"
    pubPemBlock := &pem.Block{
        Type:  "PUBLIC KEY",
        Bytes: pubBytes,
    }

    // 第三步:打开/创建文件并写入PEM内容
    file, err := os.Create(filePath)
    if err != nil {
        return err
    }
    defer file.Close()

    return pem.Encode(file, pubPemBlock)
}

调用示例

在你的代码里直接调用这两个函数就行:

// 假设你已经生成了privKey和pubKey
if err := writePrivateKey(privKey, "./private.key"); err != nil {
    log.Fatalf("写入私钥失败: %v", err)
}
if err := writePublicKey(pubKey, "./public.key"); err != nil {
    log.Fatalf("写入公钥失败: %v", err)
}

这样生成的文件就是标准的PEM格式密钥,不管是用OpenSSL工具还是其他语言的加密库都能正常解析。

内容的提问来源于stack exchange,提问作者sh.sagheb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:38:12