Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NOISSUE - Add SANs option #27

Merged
merged 9 commits into from
Oct 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 14 additions & 9 deletions certs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,19 @@ import (

const serialNumber = "serial number"

var invalidToken = "123"
var (
invalidToken = "123"
config = certs.Config{
CommonName: "test",
}
)

func TestIssueCert(t *testing.T) {
cRepo := new(mocks.MockRepository)

repoCall := cRepo.On("GetCAs", mock.Anything).Return([]certs.Certificate{}, nil)
repoCall1 := cRepo.On("CreateCert", mock.Anything, mock.Anything).Return(nil)
svc, err := certs.NewService(context.Background(), cRepo)
svc, err := certs.NewService(context.Background(), cRepo, &config)
require.NoError(t, err)
repoCall.Unset()
repoCall1.Unset()
Expand Down Expand Up @@ -76,7 +81,7 @@ func TestRevokeCert(t *testing.T) {

repoCall := cRepo.On("GetCAs", mock.Anything).Return([]certs.Certificate{}, nil)
repoCall1 := cRepo.On("CreateCert", mock.Anything, mock.Anything).Return(nil)
svc, err := certs.NewService(context.Background(), cRepo)
svc, err := certs.NewService(context.Background(), cRepo, &config)
require.NoError(t, err)
repoCall.Unset()
repoCall1.Unset()
Expand Down Expand Up @@ -128,7 +133,7 @@ func TestGetCertDownloadToken(t *testing.T) {

repoCall := cRepo.On("GetCAs", mock.Anything).Return([]certs.Certificate{}, nil)
repoCall1 := cRepo.On("CreateCert", mock.Anything, mock.Anything).Return(nil)
svc, err := certs.NewService(context.Background(), cRepo)
svc, err := certs.NewService(context.Background(), cRepo, &config)
require.NoError(t, err)
repoCall.Unset()
repoCall1.Unset()
Expand Down Expand Up @@ -162,7 +167,7 @@ func TestGetCert(t *testing.T) {

repoCall := cRepo.On("GetCAs", mock.Anything).Return([]certs.Certificate{}, nil)
repoCall1 := cRepo.On("CreateCert", mock.Anything, mock.Anything).Return(nil)
svc, err := certs.NewService(context.Background(), cRepo)
svc, err := certs.NewService(context.Background(), cRepo, &config)
require.NoError(t, err)
repoCall.Unset()
repoCall1.Unset()
Expand Down Expand Up @@ -257,7 +262,7 @@ func TestRenewCert(t *testing.T) {

repoCall := cRepo.On("GetCAs", mock.Anything).Return([]certs.Certificate{}, nil)
repoCall1 := cRepo.On("CreateCert", mock.Anything, mock.Anything).Return(nil)
svc, err := certs.NewService(context.Background(), cRepo)
svc, err := certs.NewService(context.Background(), cRepo, &config)
require.NoError(t, err)
repoCall.Unset()
repoCall1.Unset()
Expand Down Expand Up @@ -349,7 +354,7 @@ func TestGetEntityID(t *testing.T) {

repoCall := cRepo.On("GetCAs", mock.Anything).Return([]certs.Certificate{}, nil)
repoCall1 := cRepo.On("CreateCert", mock.Anything, mock.Anything).Return(nil)
svc, err := certs.NewService(context.Background(), cRepo)
svc, err := certs.NewService(context.Background(), cRepo, &config)
require.NoError(t, err)
repoCall.Unset()
repoCall1.Unset()
Expand Down Expand Up @@ -380,7 +385,7 @@ func TestListCerts(t *testing.T) {

repoCall := cRepo.On("GetCAs", mock.Anything).Return([]certs.Certificate{}, nil)
repoCall1 := cRepo.On("CreateCert", mock.Anything, mock.Anything).Return(nil)
svc, err := certs.NewService(context.Background(), cRepo)
svc, err := certs.NewService(context.Background(), cRepo, &config)
require.NoError(t, err)
repoCall.Unset()
repoCall1.Unset()
Expand Down Expand Up @@ -435,7 +440,7 @@ func TestGenerateCRL(t *testing.T) {
{Type: certs.IntermediateCA, Certificate: pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: certDER}), Key: pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(privateKey)})},
}, nil)
repoCall1 := cRepo.On("CreateCert", mock.Anything, mock.Anything).Return(nil)
svc, err := certs.NewService(context.Background(), cRepo)
svc, err := certs.NewService(context.Background(), cRepo, &config)
require.NoError(t, err)
repoCall.Unset()
repoCall1.Unset()
Expand Down
13 changes: 10 additions & 3 deletions cmd/certs/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ const (
defDB = "certs"
defSvcHTTPPort = "9010"
defSvcGRPCPort = "7012"
configFile = "/config/config.yml"
)

type config struct {
Expand Down Expand Up @@ -99,7 +100,13 @@ func main() {
logger.Error(fmt.Sprintf("failed to load %s gRPC server configuration : %s", svcName, err))
}

svc, err := newService(ctx, db, tracer, logger, dbConfig)
config, err := certs.LoadConfig(configFile)
if err != nil {
logger.Error(fmt.Sprintf("failed to load CA config file : %s", err))
return
}

svc, err := newService(ctx, db, tracer, logger, dbConfig, config)
if err != nil {
logger.Error(fmt.Sprintf("failed to create %s service: %s", svcName, err))
return
Expand Down Expand Up @@ -136,10 +143,10 @@ func main() {
}
}

func newService(ctx context.Context, db *sqlx.DB, tracer trace.Tracer, logger *slog.Logger, dbConfig pgClient.Config) (certs.Service, error) {
func newService(ctx context.Context, db *sqlx.DB, tracer trace.Tracer, logger *slog.Logger, dbConfig pgClient.Config, config *certs.Config) (certs.Service, error) {
database := postgres.NewDatabase(db, dbConfig, tracer)
repo := cpostgres.NewRepository(database)
svc, err := certs.NewService(ctx, repo)
svc, err := certs.NewService(ctx, repo, config)
if err != nil {
return nil, err
}
Expand Down
61 changes: 61 additions & 0 deletions config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
// Copyright (c) Abstract Machines
// SPDX-License-Identifier: Apache-2.0

package certs

import (
"net"
"os"

"gopkg.in/yaml.v2"
)

type CAConfig struct {
CommonName string `yaml:"common_name"`
Organization []string `yaml:"organization"`
OrganizationalUnit []string `yaml:"organizational_unit"`
Country []string `yaml:"country"`
Province []string `yaml:"province"`
Locality []string `yaml:"locality"`
StreetAddress []string `yaml:"street_address"`
PostalCode []string `yaml:"postal_code"`
DNSNames []string `yaml:"dns_names"`
IPAddresses []string `yaml:"ip_addresses"`
ValidityPeriod string `yaml:"validity_period"`
}

func LoadConfig(filename string) (*Config, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()

var config CAConfig
decoder := yaml.NewDecoder(file)
if err := decoder.Decode(&config); err != nil {
return nil, err
}
return &Config{
CommonName: config.CommonName,
Organization: config.Organization,
OrganizationalUnit: config.OrganizationalUnit,
Country: config.Country,
Province: config.Province,
Locality: config.Locality,
StreetAddress: config.StreetAddress,
PostalCode: config.PostalCode,
DNSNames: config.DNSNames,
IPAddresses: parseIPs(config.IPAddresses),
}, nil
}

func parseIPs(ipStrings []string) []net.IP {
var ips []net.IP
for _, ipString := range ipStrings {
if ip := net.ParseIP(ipString); ip != nil {
ips = append(ips, ip)
}
}
return ips
}
21 changes: 21 additions & 0 deletions docker/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Copyright (c) Abstract Machines
# SPDX-License-Identifier: Apache-2.0

common_name: "AbstractMachines_Selfsigned_ca"
organization:
- "AbstractMacines"
organizational_unit:
- "AbstractMachines_ca"
country:
- "France"
province:
- "Paris"
locality:
- "Quai de Valmy"
postal_code:
- "75010 Paris"
dns_names:
- "localhost"
ip_addresses:
- "localhost"
validity_period: "8760h"
2 changes: 2 additions & 0 deletions docker/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ services:
ports:
- ${AM_CERTS_HTTP_PORT}:${AM_CERTS_HTTP_PORT}
- ${AM_CERTS_GRPC_PORT}:${AM_CERTS_GRPC_PORT}
volumes:
- ./config.yml:/config/config.yml

certs-db:
image: postgres:16.2-alpine
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ require (
golang.org/x/sync v0.8.0
google.golang.org/grpc v1.65.0
google.golang.org/protobuf v1.34.2
gopkg.in/yaml.v2 v2.4.0
moul.io/http2curl v1.0.0
)

Expand Down Expand Up @@ -87,6 +88,5 @@ require (
golang.org/x/text v0.17.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240730163845-b1a4ccb954bf // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
Loading
Loading