43 lines
1.2 KiB
Go
43 lines
1.2 KiB
Go
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), ":", ""))
|
||
}
|