feat: implement main application with example usage
- Add main application demonstrating certificate management - Include example of creating root and intermediate CAs - Demonstrate certificate generation for enterprise use cases - Add example certificate creation for AdGuard and Paperless NGX - Implement proper database initialization and setup - Include comprehensive logging and error handling - Add helper functions for time management and certificate creation
This commit is contained in:
206
main.go
Normal file
206
main.go
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"net"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"git.secnex.io/secnex/certman/certificate"
|
||||||
|
"git.secnex.io/secnex/certman/database"
|
||||||
|
"git.secnex.io/secnex/certman/models"
|
||||||
|
"git.secnex.io/secnex/certman/repositories"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
func defaultData() (*models.User, *models.Organization, error) {
|
||||||
|
userRepository := repositories.NewUserRepository(database.GetDB())
|
||||||
|
adminUser := models.User{
|
||||||
|
Username: "admin",
|
||||||
|
Email: "admin@secnex.io",
|
||||||
|
Password: "password",
|
||||||
|
}
|
||||||
|
createdUser, err := userRepository.Create(adminUser)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("❌ Failed to create admin user: %v", err)
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println("✅ Admin user created.")
|
||||||
|
|
||||||
|
organizationRepository := repositories.NewOrganizationRepository(database.GetDB())
|
||||||
|
createdOrganization, err := organizationRepository.Create(models.Organization{
|
||||||
|
Name: "SecNex",
|
||||||
|
Description: "SecNex",
|
||||||
|
Address: "In der Bellersbach 12",
|
||||||
|
City: "Altenkirchen",
|
||||||
|
State: "Rheinland-Pfalz",
|
||||||
|
Country: "DE",
|
||||||
|
Email: "info@secnex.io",
|
||||||
|
Website: "secnex.io",
|
||||||
|
CreatedBy: createdUser.ID,
|
||||||
|
UpdatedBy: createdUser.ID,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("❌ Failed to create default organization: %v", err)
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println("✅ Default organization created.")
|
||||||
|
|
||||||
|
return &createdUser, &createdOrganization, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func defaultCA(createdOrganization *models.Organization) (*models.CertificateAuthority, *models.CertificateAuthority, error) {
|
||||||
|
ca := certificate.NewCertificateAuthorityService(database.GetDB(), "data/certs/ca", "data/private/ca")
|
||||||
|
reqRootCA := certificate.CreateRootCARequest{
|
||||||
|
Name: "SecNex Enterprise Root CA",
|
||||||
|
CommonName: "SecNex Enterprise Root CA",
|
||||||
|
Organization: "SecNex",
|
||||||
|
Country: "DE",
|
||||||
|
OrganizationID: createdOrganization.ID,
|
||||||
|
ValidityYears: 50, // 50 Jahre für Enterprise-Produktion
|
||||||
|
}
|
||||||
|
rootCA, err := ca.CreateRootCA(&reqRootCA)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("❌ Failed to create default root CA: %v", err)
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
reqIntermediateCA := certificate.CreateIntermediateCARequest{
|
||||||
|
Name: "SecNex Enterprise Intermediate CA #1",
|
||||||
|
CommonName: "SecNex Enterprise Intermediate CA #1",
|
||||||
|
Organization: "SecNex",
|
||||||
|
Country: "DE",
|
||||||
|
OrganizationID: createdOrganization.ID,
|
||||||
|
ParentCAID: rootCA.ID,
|
||||||
|
ValidityYears: 30, // 30 Jahre für Enterprise-Produktion
|
||||||
|
}
|
||||||
|
intermediateCA, err := ca.CreateIntermediateCA(&reqIntermediateCA)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("❌ Failed to create default intermediate CA: %v", err)
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
return rootCA, intermediateCA, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func createNewCertificate(intermediateCAID string, req certificate.CreateCertificateRequest) (*models.Certificate, error) {
|
||||||
|
caService := certificate.NewCertificateAuthorityService(database.GetDB(), "data/certs/ca", "data/private/ca")
|
||||||
|
certService := certificate.NewCertificateService(database.GetDB(), "data/certs", "data/private", caService)
|
||||||
|
|
||||||
|
cert, err := certService.CreateCertificate(&req)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("❌ Failed to create new certificate: %v", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return cert, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func createAdGuardCertificate(intermediateCA *models.CertificateAuthority) (*models.Certificate, error) {
|
||||||
|
caService := certificate.NewCertificateAuthorityService(database.GetDB(), "data/certs/ca", "data/private/ca")
|
||||||
|
certService := certificate.NewCertificateService(database.GetDB(), "data/certs", "data/private", caService)
|
||||||
|
|
||||||
|
// Create enterprise web certificate request for AdGuard
|
||||||
|
req := &certificate.CreateCertificateRequest{
|
||||||
|
Name: "AdGuard Certificate",
|
||||||
|
Description: "Enterprise HTTPS certificate for AdGuard DNS server",
|
||||||
|
CommonName: "adguard.secnex.internal",
|
||||||
|
Organization: "SecNex",
|
||||||
|
OrganizationalUnit: "Internal",
|
||||||
|
Country: "DE",
|
||||||
|
State: "Rheinland-Pfalz",
|
||||||
|
Locality: "Altenkirchen",
|
||||||
|
Street: "In der Bellersbach 12",
|
||||||
|
Address: "In der Bellersbach 12, 57610 Altenkirchen",
|
||||||
|
PostalCode: "57610",
|
||||||
|
Email: "admin@secnex.io",
|
||||||
|
Type: models.CertificateTypeWeb,
|
||||||
|
CertificateAuthorityID: intermediateCA.ID,
|
||||||
|
NotAfter: timePtr(time.Now().AddDate(2, 0, 0)), // 2 Jahre für Enterprise
|
||||||
|
DNSNames: []string{"adguard.secnex.internal", "adguard.cloud.lab", "*.secnex.internal"},
|
||||||
|
IPAddresses: []net.IP{net.ParseIP("10.2.2.3")},
|
||||||
|
KeyType: "rsa",
|
||||||
|
KeySize: 4096, // 4096 Bit für Enterprise-Sicherheit
|
||||||
|
ValidityYears: 1, // 2 Jahre für Enterprise-Produktion
|
||||||
|
}
|
||||||
|
|
||||||
|
cert, err := certService.CreateCertificate(req)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("❌ Failed to create AdGuard certificate: %v", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println("✅ AdGuard web certificate created.")
|
||||||
|
log.Println("------------------------------------")
|
||||||
|
log.Println("🔎 Certificate ID:", cert.ID)
|
||||||
|
log.Println("🔎 Certificate Name:", cert.Name)
|
||||||
|
log.Println("🔎 Common Name:", cert.AttributeCommonName)
|
||||||
|
log.Println("🔎 Serial Number:", cert.SerialNumber)
|
||||||
|
log.Println("🔎 Valid From:", cert.AttributeNotBefore.Format("2006-01-02 15:04:05"))
|
||||||
|
log.Println("🔎 Valid Until:", cert.AttributeNotAfter.Format("2006-01-02 15:04:05"))
|
||||||
|
log.Println("🔎 Certificate Type:", cert.Type)
|
||||||
|
log.Println("🔎 Status:", cert.Status)
|
||||||
|
log.Println("🔎 Certificate File ID:", cert.FileID)
|
||||||
|
log.Println("🔎 Private Key File ID:", cert.PrivateKeyID)
|
||||||
|
log.Println("------------------------------------")
|
||||||
|
|
||||||
|
return cert, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// Connect to database
|
||||||
|
database.Connect()
|
||||||
|
|
||||||
|
intermediateID := "3786b6af-39d4-4c10-a9d6-7f3603ecaf6b"
|
||||||
|
|
||||||
|
req := &certificate.CreateCertificateRequest{
|
||||||
|
Name: "Paperless NGX Certificate",
|
||||||
|
Description: "Paperless NGX Certificate",
|
||||||
|
CommonName: "paperless.services.internal",
|
||||||
|
Organization: "SecNex",
|
||||||
|
OrganizationalUnit: "Internal",
|
||||||
|
Country: "DE",
|
||||||
|
State: "Rheinland-Pfalz",
|
||||||
|
Locality: "Altenkirchen",
|
||||||
|
Street: "In der Bellersbach 12",
|
||||||
|
Address: "In der Bellersbach 12, 57610 Altenkirchen",
|
||||||
|
PostalCode: "57610",
|
||||||
|
Email: "admin@secnex.io",
|
||||||
|
Type: models.CertificateTypeWeb,
|
||||||
|
CertificateAuthorityID: uuid.MustParse(intermediateID),
|
||||||
|
NotAfter: timePtr(time.Now().AddDate(2, 0, 0)), // 2 Jahre für Enterprise
|
||||||
|
DNSNames: []string{"paperless.services.internal", "*.paperless.services.internal"},
|
||||||
|
IPAddresses: []net.IP{net.ParseIP("10.2.2.6")},
|
||||||
|
KeyType: "rsa",
|
||||||
|
KeySize: 4096, // 4096 Bit für Enterprise-Sicherheit
|
||||||
|
ValidityYears: 1, // 2 Jahre für Enterprise-Produktion
|
||||||
|
}
|
||||||
|
|
||||||
|
cert, err := createNewCertificate(
|
||||||
|
intermediateID,
|
||||||
|
*req,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("❌ Failed to create BetterBahn certificate: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println("✅ BetterBahn certificate created.")
|
||||||
|
log.Println("------------------------------------")
|
||||||
|
log.Println("🔎 Certificate ID:", cert.ID)
|
||||||
|
log.Println("🔎 Certificate Name:", cert.Name)
|
||||||
|
log.Println("🔎 Common Name:", cert.AttributeCommonName)
|
||||||
|
log.Println("🔎 Serial Number:", cert.SerialNumber)
|
||||||
|
log.Println("🔎 Valid From:", cert.AttributeNotBefore.Format("2006-01-02 15:04:05"))
|
||||||
|
log.Println("🔎 Valid Until:", cert.AttributeNotAfter.Format("2006-01-02 15:04:05"))
|
||||||
|
log.Println("🔎 Certificate Type:", cert.Type)
|
||||||
|
log.Println("🔎 Status:", cert.Status)
|
||||||
|
log.Println("🔎 Certificate File ID:", cert.FileID)
|
||||||
|
log.Println("🔎 Private Key File ID:", cert.PrivateKeyID)
|
||||||
|
log.Println("------------------------------------")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function to create time pointer
|
||||||
|
func timePtr(t time.Time) *time.Time {
|
||||||
|
return &t
|
||||||
|
}
|
Reference in New Issue
Block a user