// token 测试密钥生成助手(PKCS1 / PKCS8 两种私钥形态,均配 PKIX 公钥)。 // // 密钥仅内存生成(不依赖 config/dev.json,不入库);RSA 2048 足够 RS256 测试。 package token import ( "crypto/rand" "crypto/rsa" "crypto/x509" "encoding/pem" "testing" ) // genKeyPair 生成 RS2048 密钥对(PKCS1 私钥 PEM + PKIX 公钥 PEM)。 func genKeyPair(t *testing.T) (privPEM, pubPEM string) { t.Helper() key, err := rsa.GenerateKey(rand.Reader, 2048) if err != nil { t.Fatalf("生成 RSA 私钥: %v", err) } privPEM = string(pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(key)})) pubPEM, err = pubPEMOf(t, key) if err != nil { t.Fatalf("序列化公钥: %v", err) } return privPEM, pubPEM } // genKeyPairPKCS8 生成 RS2048 密钥对(PKCS8 私钥 PEM + PKIX 公钥 PEM)。 func genKeyPairPKCS8(t *testing.T) (privPEM, pubPEM string) { t.Helper() key, err := rsa.GenerateKey(rand.Reader, 2048) if err != nil { t.Fatalf("生成 RSA 私钥: %v", err) } der, err := x509.MarshalPKCS8PrivateKey(key) if err != nil { t.Fatalf("PKCS8 序列化: %v", err) } privPEM = string(pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: der})) pubPEM, err = pubPEMOf(t, key) if err != nil { t.Fatalf("序列化公钥: %v", err) } return privPEM, pubPEM } // pubPEMOf 由 *rsa.PrivateKey 取公钥并序列化为 PKIX PEM。 func pubPEMOf(t *testing.T, key *rsa.PrivateKey) (string, error) { t.Helper() der, err := x509.MarshalPKIXPublicKey(&key.PublicKey) if err != nil { return "", err } return string(pem.EncodeToMemory(&pem.Block{Type: "PUBLIC KEY", Bytes: der})), nil }