【问题标题】:how to convert dsa PublicKey to PEM Files use golang如何将 dsa PublicKey 转换为 PEM 文件使用 golang
【发布时间】:2022-08-23 21:16:42
【问题描述】:
  • 当我使用 rsa pem 字符串时,以下代码可以正常工作,生成为 rsa 公钥对象并重新生成为 rsa pem 字符串
  • 当我使用 dsa pem 字符串时,以下代码无法正常工作,只能生成到 dsa 公钥对象

x509:不支持的公钥类型:*dsa.PublicKey

我想知道如何使 dsa 公钥对象重新生成 dsa pem 字符串

这是我的代码

package main

import (
    \"C\"
    \"crypto/x509\"
    \"encoding/pem\"
    \"fmt\"
    \"os\"
)

var rsaBytes = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyQubwvMR1ctRTTylCJ9u
imYlIMo8rkOXV8S7NaRB2pdEoeG1RiGVanTKwu1N6D7CNbXV+o+QVOpSB823iTb+
kxHaTpGcJwVvA1K3pJOgSSAx3bbr8Ekv1FXNZ3bGFOrzoD0OOWICDGnNQznQ8cJ8
+EFwjLBoqqqWM892BkGQuQTRLEmjrFOrLlTB99yXMeiD4c2iQFCtNZHpFviS9ahp
Irb/sEyhs2hFYqUUByZQQqo0ewv8MFiHGXG68t2LMnTkbff3KyUxgChEPiqAUNAb
LJ1JaFwypZdHr7KyJqatCIOk2m1Yz3umnW/KsM0Q+N9C4UZdn6GbZyStELGBJjsv
aQIDAQAB
-----END PUBLIC KEY-----`

var dsaBytes = `-----BEGIN PUBLIC KEY-----
MIIBuDCCASwGByqGSM44BAEwggEfAoGBAP1/U4EddRIpUt9KnC7s5Of2EbdSPO9E
AMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdrmVClpJ+f
6AR7ECLCT7up1/63xhv4O1fnxqimFQ8E+4P208UewwI1VBNaFpEy9nXzrith1yrv
8iIDGZ3RSAHHAhUAl2BQjxUjC8yykrmCouuEC/BYHPUCgYEA9+GghdabPd7LvKtc
NrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwky
jMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/h
WuWfBpKLZl6Ae1UlZAFMO/7PSSoDgYUAAoGBAIb9o0KPsjAdzjK571e1Mx7ZhEyJ
GrcxHiN2sW8IztEbqrKKiMxpNlTwm234uBdtzVHE3uDWZpfHPMIRmwBjCYDFRowW
WVRdhdFXZlpCyp1gMWqJ11dh3FI3+O43DevRSyyuLRVCNQ1J3iVgwY5ndRpZU7n6
y8DPH4/4EBT7KvnV
-----END PUBLIC KEY-----`

func main() {
    // pemBlock, _ := pem.Decode([]byte(rsaBytes))
    pemBlock, _ := pem.Decode([]byte(dsaBytes))

    pubInterface, err := x509.ParsePKIXPublicKey(pemBlock.Bytes)
    pubkeyByte, err := x509.MarshalPKIXPublicKey(pubInterface)
    if err != nil {
        fmt.Println(err)
        os.Exit(0)
    }
    block := &pem.Block{
        Type:  \"PUBLIC KEY\",
        Bytes: pubkeyByte,
    }
    pemByte := pem.EncodeToMemory(block)
    fmt.Println(string(pemByte))

}

    标签: go ssh x509 pem dsa


    【解决方案1】:

    下面是 x509 包中 MarshalPKIXPublicKey 函数的注释:

    // MarshalPKIXPublicKey converts a public key to PKIX, ASN.1 DER form.
    // The encoded public key is a SubjectPublicKeyInfo structure
    // (see RFC 5280, Section 4.1).
    //
    // The following key types are currently supported: *rsa.PublicKey, *ecdsa.PublicKey
    // and ed25519.PublicKey. Unsupported key types result in an error.
    //
    // This kind of key is commonly encoded in PEM blocks of type "PUBLIC KEY".
    

    您还可以在包文档中获得相同的信息: https://pkg.go.dev/crypto/x509#MarshalPKIXPublicKey

    所以你需要的东西在 Go 1.19 中是不可用的。

    如果您不想自己编写 DSA 私钥的 ASN1 编码,我想更简单的是使用 Openssl dsa 函数。 https://www.mkssoftware.com/docs/man1/openssl_dsa.1.asp

    【讨论】:

      猜你喜欢
      • 2019-08-05
      • 2017-01-27
      • 2019-05-24
      • 2022-01-10
      • 2012-05-11
      • 2020-10-30
      • 2016-01-30
      • 2011-10-25
      • 1970-01-01
      相关资源
      最近更新 更多