非常抱歉给您带来了困扰。根据报错信息,似乎是因为代码中使用的是 ECDSA 公钥而不是 SM2 公钥导致的错误。
请注意确保已经正确安装并导入了适用于国密算法(SM2)的相关库。下面是一个修正后的示例代码:
package main
import (
"crypto/x509"
"encoding/pem"
"fmt"
"github.com/tjfoc/gmsm/sm2"
)
func main() {
p10PEM := `-----BEGIN CERTIFICATE REQUEST-----
MIIBFDCB9wIBADAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwWTATBgcqhkjOPQIBBggqgRzP
VAoGAIQA+DOcm1o+m7rzXrdJxSVuFxsfAx5FRKTzm/AQUzkfD6hfWp30O7lEDR8AWHOV
Yimr1we9N8MTZ4GFdm+/ioUqaYThvux05CZIRaC38y4bTN9ylfbg0atkLFU/Lil6UIli
btECAgMMMIHCBgcqgRzPVQGDdQUAMAsGCSqGSIb3DQEBCwOCAQEAbHBiqslIDZ84LWMd
GVn3IMYYS/UYTuNu+Kbg/bmpXDpq93WZJ8tgGT/hMZsvNZkACxxz+EUPhbr+fOCBoHUy
HXblchbhItDbcfByzbkr88joTOUCIH73fnDFpfA1/BDlTkgtnqrPrvEmRV06BaBWBiEq
ZOL28qKSYiJJlA==
-----END CERTIFICATE REQUEST-----`
block, _ := pem.Decode([]byte(p10PEM))
if block == nil {
fmt.Println("Failed to parse PEM block")
return
}
req, err := x509.ParseCertificateRequest(block.Bytes)
if err != nil {
fmt.Println("Failed to parse certificate request:", err)
return
}
publicKey, ok := req.PublicKey.(*sm2.PublicKey)
if !ok {
fmt.Println("Invalid public key type")
return
}
fmt.Println("Public Key:")
fmt.Printf("X: %x\n", publicKey.X.Bytes())
fmt.Printf("Y: %x\n", publicKey.Y.Bytes())
dn := req.Subject.ToRDNSequence()
for _, attrSet := range dn {
for _, attrTypeAndValue := range attrSet {
attrType := attrTypeAndValue.Type.String()
attrValue := fmt.Sprintf("%s", attrTypeAndValue.Value)
fmt.Printf("%s: %s\n", attrType, attrValue)
}
}
}
如果您已经正确安装了 github.com/tjfoc/gmsm
包并仍然遇到问题,请确保您的环境配置和依赖项都正确设置。另外,也可以参考相关文档或库的使用示例来获取更准确的代码。
希望这次的回答能够帮助到您。如果还有其他问题,请随时提问。
内容由零声教学AI助手提供,问题来源于学员提问