41 lines
1.2 KiB
Go
41 lines
1.2 KiB
Go
// certx 包示例:自签证书生成与解析、私钥解析、证书私钥匹配校验(全程内存操作)
|
||
package main
|
||
|
||
import (
|
||
"fmt"
|
||
|
||
"git.zeroonesoft.cn/golib/zogo/certx"
|
||
)
|
||
|
||
func main() {
|
||
// 生成自签名证书(RSA 2048,有效期 10 年)
|
||
certPEM, keyPEM, err := certx.CreateCertificate("go-hua.example.com", []string{"go-hua.example.com", "localhost"})
|
||
if err != nil {
|
||
panic(err)
|
||
}
|
||
fmt.Printf("证书 PEM: %d 字节, 私钥 PEM: %d 字节\n", len(certPEM), len(keyPEM))
|
||
|
||
// 解析证书
|
||
cert, err := certx.ParseCertificate(certPEM)
|
||
if err != nil {
|
||
panic(err)
|
||
}
|
||
fmt.Println("主题:", cert.Subject.CommonName)
|
||
fmt.Println("DNS 名称:", cert.DNSNames)
|
||
fmt.Println("有效期至:", cert.NotAfter.Format("2006-01-02"))
|
||
|
||
// 解析私钥(自动尝试 PKCS1 / PKCS8 / EC)
|
||
key, err := certx.ParsePrivateKey(keyPEM)
|
||
if err != nil {
|
||
panic(err)
|
||
}
|
||
fmt.Printf("私钥类型: %T\n", key)
|
||
|
||
// 校验证书与私钥是否匹配
|
||
fmt.Println("证书私钥匹配:", certx.VerifyPrivateKey(cert, keyPEM) == nil)
|
||
|
||
// 实际 TLS 服务中的用法:
|
||
// certPair, _ := tls.X509KeyPair(certPEM, keyPEM)
|
||
// tls.NewListener(listener, &tls.Config{Certificates: []tls.Certificate{certPair}})
|
||
}
|