owpengram-server/internal/sfu/cert.go

43 lines
1.2 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package sfu
import (
"crypto/sha256"
"crypto/tls"
"crypto/x509"
"encoding/hex"
"fmt"
"strings"
"github.com/pion/dtls/v3/pkg/crypto/selfsign"
)
// newDTLSCertificate 生成进程级自签证书DTLS 身份不靠 CA靠信令面下发的指纹
func newDTLSCertificate() (tls.Certificate, string, error) {
cert, err := selfsign.GenerateSelfSigned()
if err != nil {
return tls.Certificate{}, "", fmt.Errorf("sfu: self-signed cert: %w", err)
}
fp, err := certificateFingerprint(cert.Certificate[0])
if err != nil {
return tls.Certificate{}, "", err
}
return cert, fp, nil
}
// certificateFingerprint 计算 RFC 4572 风格 sha-256 指纹("AA:BB:...")。
func certificateFingerprint(der []byte) (string, error) {
if _, err := x509.ParseCertificate(der); err != nil {
return "", fmt.Errorf("sfu: parse cert: %w", err)
}
sum := sha256.Sum256(der)
parts := make([]string, len(sum))
for i, b := range sum {
parts[i] = strings.ToUpper(hex.EncodeToString([]byte{b}))
}
return strings.Join(parts, ":"), nil
}
// normalizeFingerprint 去除大小写/分隔差异后比较用。
func normalizeFingerprint(fp string) string {
return strings.ToUpper(strings.ReplaceAll(strings.TrimSpace(fp), ":", ""))
}