mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-06 17:29:15 +08:00
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:
Binary file not shown.
@@ -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
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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..."
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user