为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
繁星淼淼 2023-06-26 15:46:18
我尝试开发一个自动化程序来使用公共 RSA pem 证书注册新的 IoT 设备,但我遇到了一个问题,我不知道原因。问题是生成了 RSA_PEM public pem 我的自动化被 GCP IoT Server 拒绝并出现错误。该错误是“位置 1 中设备凭证的密钥数据无效。请确保格式正确:RS256 公钥无效”当我调试我的代码时,pem 公共证书看起来很好。但我不确定。我正在分享生成成对的私有和公共证书的 go 代码。package certimport (    "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}你能看出我的代码有什么问题吗?
查看完整描述

4 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

如果您得到:

Error: 7 PERMISSION_DENIED: The signature of device credential in position 0 could not be verified against any registry certificate.

错误并且您的系统曾经正常工作,请检查根 CA 证书的到期日期。如果超过该日期,它将返回此错误。


查看完整回答
反对 回复 2023-06-26
?
万千封印

TA贡献1891条经验 获得超3个赞

我遇到了同样的问题。我可以用下面的代码解决这个问题。


package cloudIotCore


import (

    "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)

    }


}



查看完整回答
反对 回复 2023-06-26
?
动漫人物

TA贡献1815条经验 获得超10个赞

编码头和编码方法不匹配。如果你想使用

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

那么pem.Block类型应该是Type:  "RSA PUBLIC KEY",.

如果您想要其他常见的公钥格式(SubjectPublicKeyInfo ASN.1 结构),请保留pem.Block现有的格式,而使用

asn1Bytes, err := x509.MarshalPKIXPublicKey(&key.PublicKey)

我不知道 GCP 的期望是什么,但几乎可以肯定是其中之一。


查看完整回答
反对 回复 2023-06-26
?
温温酱

TA贡献1752条经验 获得超4个赞

这是预期的密钥格式与密钥类型 RSA_PEM 与 RSA_X509_PEM 之间不匹配。切换解决了这个问题。



查看完整回答
反对 回复 2023-06-26
  • 4 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信