Skip to content

Commit 7747bc8

Browse files
committed
Add certs
1 parent 86e116c commit 7747bc8

File tree

7 files changed

+110
-32
lines changed

7 files changed

+110
-32
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Certificates
2+
3+
The certificates in for the examples are generated using the commands shown below.
4+
5+
Note that this was run on OpenSSL 1.1.1d, of which the arguments can be found in the [OpenSSL Manpages](https://www.openssl.org/docs/man1.1.1/man1), and is not guaranteed to work on different OpenSSL versions.
6+
7+
```shell
8+
# Extensions required for certificate validation.
9+
$ EXTFILE='extfile.conf'
10+
$ echo 'subjectAltName = IP:127.0.0.1\nbasicConstraints = critical,CA:true' > "${EXTFILE}"
11+
12+
# Server.
13+
$ SERVER_NAME='server'
14+
$ openssl ecparam -name prime256v1 -genkey -noout -out "${SERVER_NAME}.pem"
15+
$ openssl req -key "${SERVER_NAME}.pem" -new -sha256 -subj '/C=NL' -out "${SERVER_NAME}.csr"
16+
$ openssl x509 -req -in "${SERVER_NAME}.csr" -extfile "${EXTFILE}" -days 365 -signkey "${SERVER_NAME}.pem" -sha256 -out "${SERVER_NAME}.pub.pem"
17+
18+
# Client.
19+
$ CLIENT_NAME='client'
20+
$ openssl ecparam -name prime256v1 -genkey -noout -out "${CLIENT_NAME}.pem"
21+
$ openssl req -key "${CLIENT_NAME}.pem" -new -sha256 -subj '/C=NL' -out "${CLIENT_NAME}.csr"
22+
$ openssl x509 -req -in "${CLIENT_NAME}.csr" -extfile "${EXTFILE}" -days 365 -CA "${SERVER_NAME}.pub.pem" -CAkey "${SERVER_NAME}.pem" -set_serial '0xabcd' -sha256 -out "${CLIENT_NAME}.pub.pem"
23+
24+
# Cleanup.
25+
$ rm "${EXTFILE}" "${SERVER_NAME}.csr" "${CLIENT_NAME}.csr"
26+
```
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MHcCAQEEIISoeP9MVCLki8cOM/hyi9/IyCZ3+fxYu+3zHJH4g1fxoAoGCCqGSM49
3+
AwEHoUQDQgAEQtNPp0zDJDMeoF0EVI1xKqi88b809cn5NDigDKo6ILW0J54/L3GB
4+
LzkXygCQJxcVKsBk4OQB04nBd1TSzzfD0Q==
5+
-----END EC PRIVATE KEY-----
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIBLTCB1aADAgECAgMAq80wCgYIKoZIzj0EAwIwDTELMAkGA1UEBhMCTkwwHhcN
3+
MjQxMTA0MTc0MzI0WhcNMjUxMTA0MTc0MzI0WjANMQswCQYDVQQGEwJOTDBZMBMG
4+
ByqGSM49AgEGCCqGSM49AwEHA0IABELTT6dMwyQzHqBdBFSNcSqovPG/NPXJ+TQ4
5+
oAyqOiC1tCeePy9xgS85F8oAkCcXFSrAZODkAdOJwXdU0s83w9GjJDAiMA8GA1Ud
6+
EQQIMAaHBH8AAAEwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiAw
7+
OWA9hQ/mRt4QjaJoKm2nlWnz+fmhFKcLy4Dko8enPgIgNZbktOO2soA1TxxQJybR
8+
XfbC0srKxi5tx+tCASwj800=
9+
-----END CERTIFICATE-----
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MHcCAQEEIG+1OTeVT3v/OYSBSv5qzM8dO6RNJ8VAGelS54y00dGmoAoGCCqGSM49
3+
AwEHoUQDQgAEbG8/2ipiuRo8cy3S2PuNskv6vY2GNVamZYP0ZFfrAOOXpIp2WIVA
4+
UkMogtGsnrMFqOoZSic+NfajMBcHX0C5LQ==
5+
-----END EC PRIVATE KEY-----
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIBNTCB26ADAgECAgkA7SUbA6QFShswCgYIKoZIzj0EAwIwDTELMAkGA1UEBhMC
3+
TkwwHhcNMjQxMTA0MTc0MjUzWhcNMjUxMTA0MTc0MjUzWjANMQswCQYDVQQGEwJO
4+
TDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGxvP9oqYrkaPHMt0tj7jbJL+r2N
5+
hjVWpmWD9GRX6wDjl6SKdliFQFJDKILRrJ6zBajqGUonPjX2ozAXB19AuS2jJDAi
6+
MA8GA1UdEQQIMAaHBH8AAAEwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNJ
7+
ADBGAiEAlXkUu6xhYeicFSWW/5lVBVH09KOnXAI13dW6FaFIxl4CIQDN8jWod40y
8+
7HpDHkJXwWPfQ9V0TPFczs/mzfMM6a2Ahg==
9+
-----END CERTIFICATE-----

example/chat/dial/main.go

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@ package main
22

33
import (
44
"context"
5+
"crypto/x509"
6+
"encoding/pem"
7+
"errors"
58
"flag"
69
"fmt"
710
"net"
11+
"os"
12+
"path/filepath"
813

914
"github.com/pion/dtls/v3/examples/util"
1015
quic "github.com/refraction-networking/uquic"
@@ -20,6 +25,13 @@ func main() {
2025
addr, err := net.ResolveUDPAddr("udp", *remoteAddr)
2126
util.Check(err)
2227

28+
rootCertificate, err := LoadCertificate("certificates/server.pub.pem")
29+
util.Check(err)
30+
certPool := x509.NewCertPool()
31+
cert, err := x509.ParseCertificate(rootCertificate.Certificate[0])
32+
util.Check(err)
33+
certPool.AddCert(cert)
34+
2335
pconn, err := net.ListenUDP("udp", nil)
2436
util.Check(err)
2537
quicSpec, err := quic.QUICID2Spec(quic.QUICFirefox_116)
@@ -33,8 +45,8 @@ func main() {
3345
}
3446

3547
econn, err := tp.DialEarly(context.Background(), addr, &tls.Config{
36-
InsecureSkipVerify: true,
37-
NextProtos: []string{"h3"},
48+
RootCAs: certPool,
49+
NextProtos: []string{"h3"},
3850
}, &quic.Config{})
3951
util.Check(err)
4052

@@ -47,3 +59,38 @@ func main() {
4759
util.Chat(stream)
4860

4961
}
62+
63+
// LoadCertificate Load/read certificate(s) from file
64+
func LoadCertificate(path string) (*tls.Certificate, error) {
65+
rawData, err := os.ReadFile(filepath.Clean(path))
66+
if err != nil {
67+
return nil, err
68+
}
69+
70+
var certificate tls.Certificate
71+
72+
for {
73+
block, rest := pem.Decode(rawData)
74+
if block == nil {
75+
break
76+
}
77+
78+
if block.Type != "CERTIFICATE" {
79+
return nil, errBlockIsNotCertificate
80+
}
81+
82+
certificate.Certificate = append(certificate.Certificate, block.Bytes)
83+
rawData = rest
84+
}
85+
86+
if len(certificate.Certificate) == 0 {
87+
return nil, errNoCertificateFound
88+
}
89+
90+
return &certificate, nil
91+
}
92+
93+
var (
94+
errBlockIsNotCertificate = errors.New("block is not a certificate, unable to load certificates")
95+
errNoCertificateFound = errors.New("no certificate found, unable to load certificates")
96+
)

example/chat/listen/main.go

Lines changed: 7 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,9 @@ package main
44

55
import (
66
"context"
7-
"crypto/rand"
8-
"crypto/rsa"
9-
"crypto/x509"
107
"encoding/hex"
11-
"encoding/pem"
128
"flag"
139
"fmt"
14-
"math/big"
1510
"net"
1611

1712
"github.com/pion/dtls/v3/examples/util"
@@ -36,6 +31,9 @@ func main() {
3631

3732
flag.Parse()
3833

34+
certificate, err := tls.LoadX509KeyPair("certificates/server.pub.pem", "certificates/server.pem")
35+
util.Check(err)
36+
3937
// Prepare the IP to connect to
4038
addr, err := net.ResolveUDPAddr("udp", *listenAddr)
4139
util.Check(err)
@@ -51,7 +49,10 @@ func main() {
5149
Conn: pconn,
5250
}
5351

54-
listener, err := tp.ListenEarly(generateTLSConfig(), &quic.Config{})
52+
listener, err := tp.ListenEarly(&tls.Config{
53+
Certificates: []tls.Certificate{certificate},
54+
NextProtos: []string{"h3"},
55+
}, &quic.Config{})
5556
util.Check(err)
5657

5758
// Simulate a chat session
@@ -82,27 +83,3 @@ func main() {
8283
// Start chatting
8384
hub.Chat()
8485
}
85-
86-
// Setup a bare-bones TLS config for the server
87-
func generateTLSConfig() *tls.Config {
88-
key, err := rsa.GenerateKey(rand.Reader, 1024)
89-
if err != nil {
90-
panic(err)
91-
}
92-
template := x509.Certificate{SerialNumber: big.NewInt(1)}
93-
certDER, err := x509.CreateCertificate(rand.Reader, &template, &template, &key.PublicKey, key)
94-
if err != nil {
95-
panic(err)
96-
}
97-
keyPEM := pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(key)})
98-
certPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: certDER})
99-
100-
tlsCert, err := tls.X509KeyPair(certPEM, keyPEM)
101-
if err != nil {
102-
panic(err)
103-
}
104-
return &tls.Config{
105-
Certificates: []tls.Certificate{tlsCert},
106-
NextProtos: []string{"h3"},
107-
}
108-
}

0 commit comments

Comments
 (0)