sm2

package main

import (
    "crypto/ecdsa"
    "crypto/rand"
    "crypto/x509/pkix"
    "fmt"
    "github.com/tjfoc/gmsm/sm2"
    "github.com/tjfoc/gmsm/x509"
    "math/big"
    "time"
)

func ecdsaToSM2PublicKey(ecdsaPublicKey *ecdsa.PublicKey) (*sm2.PublicKey, error) {
    // 获取ECDSA公钥的X和Y坐标
    x := ecdsaPublicKey.X
    y := ecdsaPublicKey.Y

    // 创建SM2公钥对象
    sm2PublicKey := &sm2.PublicKey{
        Curve: sm2.P256Sm2(),
        X:     new(big.Int).Set(x),
        Y:     new(big.Int).Set(y),
    }

    return sm2PublicKey, nil
}

func main() {
    // 生成CA密钥对
    caPrivateKey, err := sm2.GenerateKey(nil)
    if err != nil {
        panic(err)
    }
    caTemplate := x509.Certificate{
        SerialNumber: big.NewInt(1),
        Subject: pkix.Name{
            CommonName: "CA",
        },
        NotBefore:             time.Now(),
        NotAfter:              time.Now().AddDate(10, 0, 0),
        KeyUsage:              x509.KeyUsageCertSign | x509.KeyUsageCRLSign,
        BasicConstraintsValid: true,
        IsCA:                  true,
    }

    caCertBytes, err := x509.CreateCertificate(&caTemplate, &caTemplate, &caPrivateKey.PublicKey, caPrivateKey)
    if err != nil {
        panic(err)
    }
    //caCertBlock, _ := pem.Decode(caCertBytes)
    caCert, _ := x509.ParseCertificate(caCertBytes)

    // 生成用户密钥对和证书请求
    userPrivateKey, err := sm2.GenerateKey(nil)
    if err != nil {
        panic(err)
    }
    userSubject := pkix.Name{
        CommonName: "user.example.com",
    }
    userTemplate := x509.CertificateRequest{
        Subject: userSubject,
    }
    userCsrBytes, err := x509.CreateCertificateRequest(rand.Reader, &userTemplate, userPrivateKey)
    if err != nil {
        panic(err)
    }

    userCsr, err := x509.ParseCertificateRequest(userCsrBytes)
    if err != nil {
        panic(err)
    }

    // 签发用户证书
    userCertTemplate := x509.Certificate{
        SerialNumber: big.NewInt(2),
        Subject:      userSubject,
        NotBefore:    time.Now(),
        NotAfter:     time.Now().AddDate(1, 0, 0),
        KeyUsage:     x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment,
        ExtKeyUsage:  []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
    }

    //a := sm2.PublicKey{}
    //println("a", a)
    pk, _ := ecdsaToSM2PublicKey(userCsr.PublicKey.(*ecdsa.PublicKey))
    userCertBytes, err := x509.CreateCertificate(&userCertTemplate, caCert, pk, caPrivateKey)
    if err != nil {
        panic(err)
    }

    fmt.Println("用户证书:", userCertBytes)
}

 

posted @ 2024-12-11 14:53  牧之丨  阅读(42)  评论(0)    收藏  举报