added the version subcommand

added subjectAltNames to the embedded cert file
This commit is contained in:
hyung-hwan 2024-12-07 21:24:06 +09:00
parent dcf3d852d2
commit 21997e6f74
8 changed files with 243 additions and 225 deletions

View File

@ -1,3 +1,6 @@
NAME=hodu
VERSION=1.0.0
SRCS=\
client.go \
client-ctl.go \
@ -20,14 +23,14 @@ CMD_SRCS=\
cmd/config.go \
cmd/main.go \
all: hodu
all: $(NAME)
hodu: $(SRCS) $(CMD_DATA) $(CMD_SRCS)
CGO_ENABLED=0 go build -x -o $@ $(CMD_SRCS)
$(NAME): $(SRCS) $(CMD_DATA) $(CMD_SRCS)
CGO_ENABLED=0 go build -x -ldflags "-X 'main.HODU_NAME=$(NAME)' -X 'main.HODU_VERSION=$(VERSION)'" -o $@ $(CMD_SRCS)
clean:
go clean -x -i
rm -f hodu
rm -f $(NAME)
hodu.pb.go: hodu.proto
protoc --go_out=. --go_opt=paths=source_relative \
@ -40,9 +43,9 @@ hodu_grpc.pb.go: hodu.proto
hodu.proto
cmd/tls.crt:
openssl req -x509 -newkey rsa:4096 -keyout cmd/tls.key -out cmd/tls.crt -sha256 -days 36500 -nodes -subj "/CN=hodu"
openssl req -x509 -newkey rsa:4096 -keyout cmd/tls.key -out cmd/tls.crt -sha256 -days 36500 -nodes -subj "/CN=$(NAME)" --addext "subjectAltName=DNS:$(NAME),IP:10.0.0.1,IP:::1"
cmd/tls.key:
openssl req -x509 -newkey rsa:4096 -keyout cmd/tls.key -out cmd/tls.crt -sha256 -days 36500 -nodes -subj "/CN=hodu"
openssl req -x509 -newkey rsa:4096 -keyout cmd/tls.key -out cmd/tls.crt -sha256 -days 36500 -nodes -subj "/CN=$(NAME)" --addext "subjectAltName=DNS:$(NAME),IP:10.0.0.1,IP:::1"
.PHONY: clean
.PHONY: clean certfiles

View File

@ -731,7 +731,7 @@ start_over:
// seed exchange is for furture expansion of the protocol
// there is nothing to do much about it for now.
c_seed.Version = HODU_VERSION
c_seed.Version = HODU_RPC_VERSION
c_seed.Flags = 0
s_seed, err = cts.hdc.GetSeed(cts.cli.ctx, &c_seed)
if err != nil {

View File

@ -1,7 +1,11 @@
package main
import "crypto/tls"
import "crypto/x509"
import "errors"
import "fmt"
import "io"
import "io/ioutil"
import "os"
import "gopkg.in/yaml.v3"
@ -56,7 +60,7 @@ type ClientConfig struct {
}
func LoadServerConfig(cfgfile string) (*ServerConfig, error) {
func load_server_config(cfgfile string) (*ServerConfig, error) {
var cfg ServerConfig
var f *os.File
var yd *yaml.Decoder
@ -77,7 +81,7 @@ func LoadServerConfig(cfgfile string) (*ServerConfig, error) {
return &cfg, nil
}
func LoadClientConfig(cfgfile string) (*ClientConfig, error) {
func load_client_config(cfgfile string) (*ClientConfig, error) {
var cfg ClientConfig
var f *os.File
var yd *yaml.Decoder
@ -97,3 +101,139 @@ func LoadClientConfig(cfgfile string) (*ClientConfig, error) {
return &cfg, nil
}
func tls_string_to_client_auth_type(str string) tls.ClientAuthType {
switch str {
case tls.NoClientCert.String():
return tls.NoClientCert
case tls.RequestClientCert.String():
return tls.RequestClientCert
case tls.RequireAnyClientCert.String():
return tls.RequireAnyClientCert
case tls.VerifyClientCertIfGiven.String():
return tls.VerifyClientCertIfGiven
case tls.RequireAndVerifyClientCert.String():
return tls.RequireAndVerifyClientCert
default:
return tls.NoClientCert
}
}
// --------------------------------------------------------------------
func make_tls_server_config(cfg *ServerTLSConfig) (*tls.Config, error) {
var tlscfg *tls.Config
if cfg.Enabled {
var cert tls.Certificate
var cert_pool *x509.CertPool
var err error
if cfg.CertText != "" && cfg.KeyText != "" {
cert, err = tls.X509KeyPair([]byte(cfg.CertText), []byte(cfg.KeyText))
} else if cfg.CertFile != "" && cfg.KeyFile != "" {
cert, err = tls.LoadX509KeyPair(cfg.CertFile, cfg.KeyFile)
} else {
// use the embedded certificate
cert, err = tls.X509KeyPair(hodu_tls_cert_text, hodul_tls_key_text)
}
if err != nil {
return nil, fmt.Errorf("failed to load key pair - %s", err)
}
if cfg.ClientCACertText != "" || cfg.ClientCACertFile != ""{
var ok bool
cert_pool = x509.NewCertPool()
if cfg.ClientCACertText != "" {
ok = cert_pool.AppendCertsFromPEM([]byte(cfg.ClientCACertText))
if !ok {
return nil, fmt.Errorf("failed to append certificate to pool")
}
} else if cfg.ClientCACertFile != "" {
var text []byte
text, err = ioutil.ReadFile(cfg.ClientCACertFile)
if err != nil {
return nil, fmt.Errorf("failed to load ca certficate file %s - %s", cfg.ClientCACertFile, err.Error())
}
ok = cert_pool.AppendCertsFromPEM(text)
if !ok {
return nil, fmt.Errorf("failed to append certificate to pool")
}
}
}
tlscfg = &tls.Config{
Certificates: []tls.Certificate{cert},
// If multiple certificates are configured, we may have to implement GetCertificate
// GetCertificate: func (chi *tls.ClientHelloInfo) (*Certificate, error) { return cert, nil }
ClientAuth: tls_string_to_client_auth_type(cfg.ClientAuthType),
ClientCAs: cert_pool, // trusted CA certs for client certificate verification
}
}
return tlscfg, nil
}
// --------------------------------------------------------------------
func make_tls_client_config(cfg *ClientTLSConfig) (*tls.Config, error) {
var tlscfg *tls.Config
if cfg.Enabled {
var cert tls.Certificate
var cert_pool *x509.CertPool
var ok bool
var err error
if cfg.CertText != "" && cfg.KeyText != "" {
cert, err = tls.X509KeyPair([]byte(cfg.CertText), []byte(cfg.KeyText))
} else if cfg.CertFile != "" && cfg.KeyFile != "" {
cert, err = tls.LoadX509KeyPair(cfg.CertFile, cfg.KeyFile)
} else {
// use the embedded certificate
cert, err = tls.X509KeyPair(hodu_tls_cert_text, hodul_tls_key_text)
}
if err != nil {
return nil, fmt.Errorf("failed to load key pair - %s", err)
}
cert_pool = x509.NewCertPool()
if cfg.ServerCACertText != "" {
ok = cert_pool.AppendCertsFromPEM([]byte(cfg.ServerCACertText))
if !ok {
return nil, fmt.Errorf("failed to append certificate to pool")
}
} else if cfg.ServerCACertFile != "" {
var text []byte
text, err = ioutil.ReadFile(cfg.ServerCACertFile)
if err != nil {
return nil, fmt.Errorf("failed to load ca certficate file %s - %s", cfg.ServerCACertFile, err.Error())
}
ok = cert_pool.AppendCertsFromPEM(text)
if !ok {
return nil, fmt.Errorf("failed to append certificate to pool")
}
} else {
// trust the embedded certificate if not explicitly specified
ok = cert_pool.AppendCertsFromPEM(hodu_tls_cert_text)
if !ok {
return nil, fmt.Errorf("failed to append certificate to pool")
}
}
if cfg.ServerName == "" { cfg.ServerName = HODU_NAME }
tlscfg = &tls.Config{
//Certificates: []tls.Certificate{cert},
GetClientCertificate: func(cri *tls.CertificateRequestInfo) (*tls.Certificate, error) { return &cert, nil },
RootCAs: cert_pool,
InsecureSkipVerify: cfg.InsecureSkipVerify,
ServerName: cfg.ServerName,
}
}
return tlscfg, nil
}

View File

@ -2,13 +2,11 @@ package main
import "context"
import "crypto/tls"
import "crypto/x509"
import _ "embed"
import "flag"
import "fmt"
import "hodu"
import "io"
import "io/ioutil"
import "os"
import "os/signal"
import "path/filepath"
@ -18,6 +16,11 @@ import "sync"
import "syscall"
import "time"
// Don't change these items to 'const' as they can be overridden with a linker option
var HODU_NAME string = "hodu"
var HODU_VERSION string = "0.0.0"
//go:embed tls.crt
var hodu_tls_cert_text []byte
//go:embed tls.key
@ -136,138 +139,6 @@ func (sh *signal_handler) WriteLog(id string, level hodu.LogLevel, fmt string, a
sh.svc.WriteLog(id, level, fmt, args...)
}
func tls_string_to_client_auth_type(str string) tls.ClientAuthType {
switch str {
case tls.NoClientCert.String():
return tls.NoClientCert
case tls.RequestClientCert.String():
return tls.RequestClientCert
case tls.RequireAnyClientCert.String():
return tls.RequireAnyClientCert
case tls.VerifyClientCertIfGiven.String():
return tls.VerifyClientCertIfGiven
case tls.RequireAndVerifyClientCert.String():
return tls.RequireAndVerifyClientCert
default:
return tls.NoClientCert
}
}
// --------------------------------------------------------------------
func make_tls_server_config(cfg *ServerTLSConfig) (*tls.Config, error) {
var tlscfg *tls.Config
if cfg.Enabled {
var cert tls.Certificate
var cert_pool *x509.CertPool
var err error
if cfg.CertText != "" && cfg.KeyText != "" {
cert, err = tls.X509KeyPair([]byte(cfg.CertText), []byte(cfg.KeyText))
} else if cfg.CertFile != "" && cfg.KeyFile != "" {
cert, err = tls.LoadX509KeyPair(cfg.CertFile, cfg.KeyFile)
} else {
// use the embedded certificate
cert, err = tls.X509KeyPair(hodu_tls_cert_text, hodul_tls_key_text)
}
if err != nil {
return nil, fmt.Errorf("failed to load key pair - %s", err)
}
if cfg.ClientCACertText != "" || cfg.ClientCACertFile != ""{
var ok bool
cert_pool = x509.NewCertPool()
if cfg.ClientCACertText != "" {
ok = cert_pool.AppendCertsFromPEM([]byte(cfg.ClientCACertText))
if !ok {
return nil, fmt.Errorf("failed to append certificate to pool")
}
} else if cfg.ClientCACertFile != "" {
var text []byte
text, err = ioutil.ReadFile(cfg.ClientCACertFile)
if err != nil {
return nil, fmt.Errorf("failed to load ca certficate file %s - %s", cfg.ClientCACertFile, err.Error())
}
ok = cert_pool.AppendCertsFromPEM(text)
if !ok {
return nil, fmt.Errorf("failed to append certificate to pool")
}
}
}
tlscfg = &tls.Config{
Certificates: []tls.Certificate{cert},
// If multiple certificates are configured, we may have to implement GetCertificate
// GetCertificate: func (chi *tls.ClientHelloInfo) (*Certificate, error) { return cert, nil }
ClientAuth: tls_string_to_client_auth_type(cfg.ClientAuthType),
ClientCAs: cert_pool, // trusted CA certs for client certificate verification
}
}
return tlscfg, nil
}
// --------------------------------------------------------------------
func make_tls_client_config(cfg *ClientTLSConfig) (*tls.Config, error) {
var tlscfg *tls.Config
if cfg.Enabled {
var cert tls.Certificate
var cert_pool *x509.CertPool
var err error
if cfg.CertText != "" && cfg.KeyText != "" {
cert, err = tls.X509KeyPair([]byte(cfg.CertText), []byte(cfg.KeyText))
} else if cfg.CertFile != "" && cfg.KeyFile != "" {
cert, err = tls.LoadX509KeyPair(cfg.CertFile, cfg.KeyFile)
} else {
// use the embedded certificate
cert, err = tls.X509KeyPair(hodu_tls_cert_text, hodul_tls_key_text)
}
if err != nil {
return nil, fmt.Errorf("failed to load key pair - %s", err)
}
if cfg.ServerCACertText != "" || cfg.ServerCACertFile != ""{
var ok bool
cert_pool = x509.NewCertPool()
if cfg.ServerCACertText != "" {
ok = cert_pool.AppendCertsFromPEM([]byte(cfg.ServerCACertText))
if !ok {
return nil, fmt.Errorf("failed to append certificate to pool")
}
} else if cfg.ServerCACertFile != "" {
var text []byte
text, err = ioutil.ReadFile(cfg.ServerCACertFile)
if err != nil {
return nil, fmt.Errorf("failed to load ca certficate file %s - %s", cfg.ServerCACertFile, err.Error())
}
ok = cert_pool.AppendCertsFromPEM(text)
if !ok {
return nil, fmt.Errorf("failed to append certificate to pool")
}
}
}
tlscfg = &tls.Config{
//Certificates: []tls.Certificate{cert},
GetClientCertificate: func(cri *tls.CertificateRequestInfo) (*tls.Certificate, error) { return &cert, nil },
RootCAs: cert_pool,
InsecureSkipVerify: cfg.InsecureSkipVerify,
ServerName: cfg.ServerName,
}
}
return tlscfg, nil
}
// --------------------------------------------------------------------
func server_main(ctl_addrs []string, svcaddrs []string, cfg *ServerConfig) error {
@ -385,7 +256,7 @@ func main() {
}
if (cfgfile != "") {
cfg, err = LoadServerConfig(cfgfile)
cfg, err = load_server_config(cfgfile)
if err != nil {
fmt.Printf ("ERROR: failed to load configuration file %s - %s\n", cfgfile, err.Error())
goto oops
@ -431,7 +302,7 @@ func main() {
}
if (cfgfile != "") {
cfg, err = LoadClientConfig(cfgfile)
cfg, err = load_client_config(cfgfile)
if err != nil {
fmt.Printf ("ERROR: failed to load configuration file %s - %s\n", cfgfile, err.Error())
goto oops
@ -443,6 +314,8 @@ func main() {
fmt.Fprintf(os.Stderr, "ERROR: client error - %s\n", err.Error())
goto oops
}
} else if strings.EqualFold(os.Args[1], "version") {
fmt.Printf("%s %s\n", HODU_NAME, HODU_VERSION)
} else {
goto wrong_usage
}
@ -452,6 +325,7 @@ func main() {
wrong_usage:
fmt.Fprintf(os.Stderr, "USAGE: %s server --rpc-on=addr:port --ctl-on=addr:port\n", os.Args[0])
fmt.Fprintf(os.Stderr, " %s client --rpc-server=addr:port --ctl-on=addr:port [peer-addr:peer-port ...]\n", os.Args[0])
fmt.Fprintf(os.Stderr, " %s version\n", os.Args[0])
os.Exit(1)
oops:

View File

@ -1,29 +1,30 @@
-----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE-----

View File

@ -1,52 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
cE9VuuHZqcE0fWokNG7bO3t6lqPg
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
x0bCQqNhRuHGFx7YtBAUIK+FZTd7
-----END PRIVATE KEY-----

View File

@ -2,7 +2,7 @@ package hodu
import "sync"
const HODU_VERSION uint32 = 0x010000
const HODU_RPC_VERSION uint32 = 0x010000
type LogLevel int

View File

@ -651,7 +651,7 @@ func (s *Server) GetSeed(ctx context.Context, c_seed *Seed) (*Seed, error) {
// seed exchange is for furture expansion of the protocol
// there is nothing to do much about it for now.
s_seed.Version = HODU_VERSION
s_seed.Version = HODU_RPC_VERSION
s_seed.Flags = 0
// we create no ServerConn structure associated with the connection