GCP IoT 核心拒绝此 RSA_PEM 公钥并出现错误

我尝试开发一个自动化程序来使用公共 RSA pem 证书注册新的 IoT 设备,但我遇到了一个问题,我不知道原因。


问题是生成了 RSA_PEM public pem 我的自动化被 GCP IoT Server 拒绝并出现错误。该错误是“位置 1 中设备凭证的密钥数据无效。请确保格式正确:RS256 公钥无效”


当我调试我的代码时,pem 公共证书看起来很好。但我不确定。


我正在分享生成成对的私有和公共证书的 go 代码。


package cert


import (

    "bytes"

    "crypto/rand"

    "crypto/rsa"

    "crypto/x509"

    "encoding/pem"


    "io"

)


type CertificateRSA struct {

    Private io.Reader

    Public  io.Reader

}


func Create() (*CertificateRSA, error) {


    bitSize := 2048

    key, err := rsa.GenerateKey(rand.Reader, bitSize)

    if err != nil {

        return nil, err

    }


    var privateKey = &pem.Block{

        Type:  "RSA PRIVATE KEY",

        Bytes: x509.MarshalPKCS1PrivateKey(key),

    }


    var priBuff bytes.Buffer

    err = pem.Encode(&priBuff, privateKey)

    if err != nil {

        return nil, err

    }


    // asn1Bytes := x509.MarshalPKCS1PublicKey(&key.PublicKey)

    asn1Bytes := x509.MarshalPKCS1PublicKey(&key.PublicKey)


    var publicKey = &pem.Block{

        Type:  "PUBLIC KEY",

        Bytes: asn1Bytes,

    }


    var pubBuff bytes.Buffer


    err = pem.Encode(&pubBuff, publicKey)

    return &CertificateRSA{

        Private: &priBuff,

        Public:  &pubBuff,

    }, err

}


你能看出我的代码有什么问题吗?


繁星淼淼
浏览 179回答 4
4回答

明月笑刀无情

如果您得到:Error: 7 PERMISSION_DENIED: The signature of device credential in position 0 could not be verified against any registry certificate.错误并且您的系统曾经正常工作,请检查根 CA 证书的到期日期。如果超过该日期,它将返回此错误。

万千封印

我遇到了同样的问题。我可以用下面的代码解决这个问题。package cloudIotCoreimport (    "crypto/rand"    "crypto/rsa"    "crypto/x509"    "encoding/pem"    "os")func create() {    //    // Create key    //    reader := rand.Reader    bitSize := 2048    key, err := rsa.GenerateKey(reader, bitSize)    if err != nil {        panic(err)    }    publicKeyAsc1Bytes, err := x509.MarshalPKIXPublicKey(&(key.PublicKey))    if err != nil {        panic(err)    }    publicPemKey := &pem.Block{        Type:  "PUBLIC KEY",        Bytes: publicKeyAsc1Bytes,    }    privatePemKey := &pem.Block{        Type:  "RSA PRIVATE KEY",        Bytes: x509.MarshalPKCS1PrivateKey(key),    }    //    // Create Device with publicPemKey    //    :    //    // Save pem files    //    publicPemFile, err := os.Create(PATH_TO_PUBLICKEY)    if err != nil {        panic(err)    }    defer publicPemFile.Close()    err = pem.Encode(publicPemFile, publicPemKey)    if err != nil {        panic(err)    }    privatePemFile, err := os.Create(PATH_TO_PRIVATEKEY)    if err != nil {        panic(err)    }    defer privatePemFile.Close()    err = pem.Encode(privatePemFile, privatePemKey)    if err != nil {        panic(err)    }}

动漫人物

编码头和编码方法不匹配。如果你想使用asn1Bytes := x509.MarshalPKCS1PublicKey(&key.PublicKey)那么pem.Block类型应该是Type:  "RSA PUBLIC KEY",.如果您想要其他常见的公钥格式(SubjectPublicKeyInfo ASN.1 结构),请保留pem.Block现有的格式,而使用asn1Bytes, err := x509.MarshalPKIXPublicKey(&key.PublicKey)我不知道 GCP 的期望是什么,但几乎可以肯定是其中之一。

温温酱

这是预期的密钥格式与密钥类型 RSA_PEM 与 RSA_X509_PEM 之间不匹配。切换解决了这个问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go