Skip to content
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
1 change: 1 addition & 0 deletions core/object/datastore.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ type (
// KeyStore is implemented by encrypting KeyStore object kinds (usr, sec).
KeyStore interface {
GenCert() error
GenCertificateSigningRequest() ([]byte, error)
PKCS(password []byte) ([]byte, error)
}
)
Expand Down
22 changes: 22 additions & 0 deletions core/object/sec_gencert.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,26 @@ func (t *sec) GenCert() error {
return t.config.Commit()
}

// GenCertificateSigningRequest generates a certificate signing request. It also creates a private key if needed.
func (t *sec) GenCertificateSigningRequest() ([]byte, error) {
privateKey, err := t.getPriv()
if err != nil {
return nil, err
}

csrTemplate := x509.CertificateRequest{
Subject: t.subject(),
SignatureAlgorithm: x509.SHA256WithRSA,
}

if csrBytes, err := x509.CreateCertificateRequest(rand.Reader, &csrTemplate, privateKey); err != nil {
return nil, err
} else {
csrPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE REQUEST", Bytes: csrBytes})
return csrPEM, t.config.Commit()
}
}

func (t *sec) genSelfSigned() error {
t.log.Tracef("generate a self-signed certificate")
priv, err := t.getPriv()
Expand Down Expand Up @@ -176,6 +196,8 @@ func (t *sec) subject() pkix.Name {
Country: []string{t.CertInfo("c")},
Organization: []string{t.CertInfo("o")},
OrganizationalUnit: []string{t.CertInfo("ou")},
Locality: []string{t.CertInfo("l")},
Province: []string{t.CertInfo("st")},
CommonName: t.CertInfo("cn"),
}
}
Expand Down
15 changes: 15 additions & 0 deletions core/om/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -1517,6 +1517,21 @@ func newCmdObjectCertificateCreate(kind string) *cobra.Command {
return cmd
}

func newCmdObjectCertificateSigningRequest(kind string) *cobra.Command {
var options commands.CmdObjectCertificateSigningRequest
cmd := &cobra.Command{
Use: "signing-request",
Aliases: []string{"sr"},
Short: "format a certificate signing request",
RunE: func(cmd *cobra.Command, args []string) error {
return options.Run(kind)
},
}
flags := cmd.Flags()
addFlagsGlobal(flags, &options.OptsGlobal)
return cmd
}

func newCmdObjectCertificatePKCS(kind string) *cobra.Command {
var options commands.CmdObjectCertificatePKCS
cmd := &cobra.Command{
Expand Down
1 change: 1 addition & 0 deletions core/om/kind_sec.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ func init() {
)
cmdObjectCertificate.AddCommand(
newCmdObjectCertificateCreate(kind),
newCmdObjectCertificateSigningRequest(kind),
newCmdObjectCertificatePKCS(kind),
)
cmdObjectConfig.AddCommand(
Expand Down
1 change: 1 addition & 0 deletions core/om/kind_usr.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ func init() {
)
cmdObjectCertificate.AddCommand(
newCmdObjectCertificateCreate(kind),
newCmdObjectCertificateSigningRequest(kind),
newCmdObjectCertificatePKCS(kind),
)
cmdObjectConfig.AddCommand(
Expand Down
42 changes: 42 additions & 0 deletions core/omcmd/object_certificate_signing_request.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package omcmd

import (
"context"
"fmt"

"github.com/opensvc/om3/v3/core/commoncmd"
"github.com/opensvc/om3/v3/core/naming"
"github.com/opensvc/om3/v3/core/object"
"github.com/opensvc/om3/v3/core/objectaction"
)

type (
CmdObjectCertificateSigningRequest struct {
OptsGlobal
}
)

func (t *CmdObjectCertificateSigningRequest) Run(kind string) error {
mergedSelector := commoncmd.MergeSelector("", t.ObjectSelector, kind, "")
return objectaction.New(
objectaction.WithColor(t.Color),
objectaction.WithOutput(t.Output),
objectaction.WithObjectSelector(mergedSelector),
objectaction.WithLocalFunc(func(ctx context.Context, p naming.Path) (interface{}, error) {
o, err := object.New(p)
if err != nil {
return nil, err
}
store, ok := o.(object.KeyStore)
if !ok {
return nil, fmt.Errorf("%s is not a keystore", p)
}
if b, err := store.GenCertificateSigningRequest(); err != nil {
return nil, fmt.Errorf("%s can't create certificate signing request: %w", p, err)
} else {
fmt.Println(string(b))
return nil, nil
}
}),
).Do()
}