add VerifyConnection func to NewTLSConf as InsecureSkipVerify:false doesn't work

Signed-off-by: Matthew R. Kasun <mkasun@nusak.ca>
This commit is contained in:
Matthew R. Kasun
2022-04-13 11:58:15 -04:00
parent a0e7163e7e
commit 199ea15b1d
4 changed files with 52 additions and 20 deletions

View File

@@ -2,11 +2,11 @@ package functions
import ( import (
"context" "context"
"crypto/ed25519"
"crypto/tls" "crypto/tls"
"crypto/x509" "crypto/x509"
"errors" "errors"
"fmt" "fmt"
"io/ioutil"
"os" "os"
"os/signal" "os/signal"
"strings" "strings"
@@ -23,6 +23,7 @@ import (
"github.com/gravitl/netmaker/netclient/daemon" "github.com/gravitl/netmaker/netclient/daemon"
"github.com/gravitl/netmaker/netclient/ncutils" "github.com/gravitl/netmaker/netclient/ncutils"
"github.com/gravitl/netmaker/netclient/wireguard" "github.com/gravitl/netmaker/netclient/wireguard"
ssl "github.com/gravitl/netmaker/tls"
"golang.zx2c4.com/wireguard/wgctrl/wgtypes" "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
) )
@@ -267,21 +268,22 @@ func setupMQTTSub(server string) mqtt.Client {
// NewTLSConf sets up tls to connect to broker // NewTLSConf sets up tls to connect to broker
func NewTLSConfig(cfg *config.ClientConfig, server string) *tls.Config { func NewTLSConfig(cfg *config.ClientConfig, server string) *tls.Config {
var ca []byte var file string
var err error
certpool := x509.NewCertPool()
if cfg != nil { if cfg != nil {
ca, err = ioutil.ReadFile("/etc/netclient/" + cfg.Server.Server + "/root.pem") server = cfg.Server.Server
if err != nil { file = "/etc/netclient/" + cfg.Server.Server + "/root.pem"
logger.Log(0, "could not read CA file %v\n", err.Error())
}
} else { } else {
ca, err = ioutil.ReadFile("/etc/netclient/" + server + "/root.pem") file = "/etc/netclient/" + server + "/root.pem"
if err != nil { }
logger.Log(0, "could not read CA file %v\n", err.Error()) certpool := x509.NewCertPool()
} ca, err := os.ReadFile(file)
if err != nil {
logger.Log(0, "could not read CA file %v\n", err.Error())
}
ok := certpool.AppendCertsFromPEM(ca)
if !ok {
logger.Log(0, "failed to append cert")
} }
certpool.AppendCertsFromPEM(ca)
//clientKeyPair, err := tls.LoadX509KeyPair("/etc/netclient/"+cfg.Server.Server+"/client.pem", "/etc/netclient/client.key") //clientKeyPair, err := tls.LoadX509KeyPair("/etc/netclient/"+cfg.Server.Server+"/client.pem", "/etc/netclient/client.key")
//if err != nil { //if err != nil {
// log.Fatalf("could not read client cert/key %v \n", err) // log.Fatalf("could not read client cert/key %v \n", err)
@@ -290,9 +292,29 @@ func NewTLSConfig(cfg *config.ClientConfig, server string) *tls.Config {
RootCAs: certpool, RootCAs: certpool,
ClientAuth: tls.NoClientCert, ClientAuth: tls.NoClientCert,
//ClientAuth: tls.VerifyClientCertIfGiven, //ClientAuth: tls.VerifyClientCertIfGiven,
ClientCAs: nil, ClientCAs: nil,
//InsecureSkipVerify: false fails ---- so need to use VerifyConnection
InsecureSkipVerify: true, InsecureSkipVerify: true,
//Certificates: []tls.Certificate{clientKeyPair}, VerifyConnection: func(cs tls.ConnectionState) error {
if cs.ServerName != server {
logger.Log(0, "VerifyConnection - certifiate mismatch")
return errors.New("certificate doesn't match server")
}
ca, err := ssl.ReadCert("/etc/netclient/" + cs.ServerName + "/root.pem")
if err != nil {
logger.Log(0, "VerifyConnection - unable to read ca", err.Error())
return errors.New("unable to read ca")
}
for _, cert := range cs.PeerCertificates {
if cert.IsCA {
if string(cert.PublicKey.(ed25519.PublicKey)) != string(ca.PublicKey.(ed25519.PublicKey)) {
logger.Log(0, "VerifyConnection - public key mismatch")
return errors.New("cert public key does not match ca public key")
}
}
}
return nil
},
} }
} }

View File

@@ -50,7 +50,7 @@ elif [ -f /etc/fedora-release ]; then
dnf update dnf update
fi fi
dependencies=( "docker.io" "docker-compose" "wireguard" "jq" ) dependencies=( "docker.io" "docker-compose" "wireguard" "jq" "openssl" )
for dependency in ${dependencies[@]}; do for dependency in ${dependencies[@]}; do
is_installed=$(dpkg-query -W --showformat='${Status}\n' ${dependency} | grep "install ok installed") is_installed=$(dpkg-query -W --showformat='${Status}\n' ${dependency} | grep "install ok installed")
@@ -137,10 +137,17 @@ echo "setting mosquitto.conf..."
wget -q -O /root/mosquitto.conf https://raw.githubusercontent.com/gravitl/netmaker/master/docker/mosquitto.conf wget -q -O /root/mosquitto.conf https://raw.githubusercontent.com/gravitl/netmaker/master/docker/mosquitto.conf
echo "setting certificates for mosquitto" echo "creating certificates for mosquitto"
wget -q -O /root/mosquitto.conf https://raw.githubusercontent.com/gravitl/netmaker/master/certs/generate_server_certificates server=$( echo "broker."$NETMAKER_BASE_DOMAIN)
server=$(echo "broker."$NETMAKER_BASE_DOMAIN) mkdir certs
./generate_server_certificates $server
openssl genpkey -algorithm Ed25519 -out certs/root.key
openssl req -new -key certs/root.key -out certs/root.csr -subj '/CN=CA Root'
openssl x509 -req -in certs/root.csr -days 365 -signkey certs/root.key -CAcreateserial -out certs/root.pem
openssl genpkey -algorithm Ed25519 -out certs/server.key
openssl req -new -out certs/server.csr -key certs/server.key -subj $subject
openssl x509 -req -in certs/server.csr -days 365 -CA certs/root.pem -CAkey certs/root.key -CAcreateserial -out certs/server.pem
echo "setting docker-compose..." echo "setting docker-compose..."

View File

@@ -95,9 +95,12 @@ func NewCName(commonName string) pkix.Name {
// creates a new certificate signing request for a // creates a new certificate signing request for a
func NewCSR(key ed25519.PrivateKey, name pkix.Name) (*x509.CertificateRequest, error) { func NewCSR(key ed25519.PrivateKey, name pkix.Name) (*x509.CertificateRequest, error) {
dnsnames := []string{}
dnsnames = append(dnsnames, name.CommonName)
derCertRequest, err := x509.CreateCertificateRequest(rand.Reader, &x509.CertificateRequest{ derCertRequest, err := x509.CreateCertificateRequest(rand.Reader, &x509.CertificateRequest{
Subject: name, Subject: name,
PublicKey: key.Public(), PublicKey: key.Public(),
DNSNames: dnsnames,
}, key) }, key)
if err != nil { if err != nil {
return nil, err return nil, err