package dtls import ( "crypto/rand" "crypto/rsa" "crypto/tls" "crypto/x509" "crypto/x509/pkix" "math/big" "net" "time" ) // NewSelfSignedLocalhostConfig 는 테스트용 self-signed TLS 설정을 생성합니다. // // - CN: "localhost" // - DNS SAN: ["localhost"] // - IP SAN: [127.0.0.1] // - 유효기간: 생성 시점 기준 1년 // // DTLS, 일반 TLS 서버 모두에서 사용할 수 있으며, // 서버 측에서는 Certificates 에 이 인증서를 넣어주고, // 클라이언트 측에서는 debug 모드에서 InsecureSkipVerify 를 true 로 두어 // 체인 검증을 스킵하는 방식으로 사용할 수 있습니다. func NewSelfSignedLocalhostConfig() (*tls.Config, error) { priv, err := rsa.GenerateKey(rand.Reader, 2048) if err != nil { return nil, err } serial, err := rand.Int(rand.Reader, big.NewInt(1<<62)) if err != nil { return nil, err } notBefore := time.Now().Add(-1 * time.Hour) notAfter := notBefore.Add(365 * 24 * time.Hour) template := &x509.Certificate{ SerialNumber: serial, Subject: pkix.Name{ CommonName: "localhost", }, NotBefore: notBefore, NotAfter: notAfter, KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, BasicConstraintsValid: true, DNSNames: []string{"localhost"}, IPAddresses: []net.IP{net.ParseIP("127.0.0.1")}, } derBytes, err := x509.CreateCertificate(rand.Reader, template, template, &priv.PublicKey, priv) if err != nil { return nil, err } tlsCert := tls.Certificate{ Certificate: [][]byte{derBytes}, PrivateKey: priv, } return &tls.Config{ Certificates: []tls.Certificate{tlsCert}, MinVersion: tls.VersionTLS12, }, nil }