100 lines
2.2 KiB
Go
100 lines
2.2 KiB
Go
// Package gencsr implements the gencsr command.
|
|
package gencsr
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
|
|
"github.com/cloudflare/cfssl/cli"
|
|
"github.com/cloudflare/cfssl/csr"
|
|
"github.com/cloudflare/cfssl/helpers"
|
|
"github.com/cloudflare/cfssl/signer"
|
|
)
|
|
|
|
var gencsrUsageText = `cfssl gencsr -- generate a csr from a private key with existing CSR json specification or certificate
|
|
|
|
Usage of genkey:
|
|
cfssl gencsr -key private_key_file [-host hostname_override] CSRJSON
|
|
cfssl gencsr -key private_key_file [-host hostname_override] -cert certificate_file
|
|
|
|
Arguments:
|
|
CSRJSON: JSON file containing the request, use '-' for reading JSON from stdin
|
|
|
|
Flags:
|
|
`
|
|
|
|
var gencsrFlags = []string{"key", "cert"}
|
|
|
|
func gencsrMain(args []string, c cli.Config) (err error) {
|
|
if c.KeyFile == "" {
|
|
return errors.New("private key file is required through '-key', please check with usage")
|
|
}
|
|
|
|
keyBytes, err := helpers.ReadBytes(c.KeyFile)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
key, err := helpers.ParsePrivateKeyPEM(keyBytes)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// prepare a stub CertificateRequest
|
|
req := &csr.CertificateRequest{
|
|
KeyRequest: csr.NewBasicKeyRequest(),
|
|
}
|
|
|
|
if c.CertFile != "" {
|
|
if len(args) > 0 {
|
|
return errors.New("no argument is accepted with '-cert', please check with usage")
|
|
}
|
|
|
|
certBytes, err := helpers.ReadBytes(c.CertFile)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
cert, err := helpers.ParseCertificatePEM(certBytes)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
req = csr.ExtractCertificateRequest(cert)
|
|
} else {
|
|
csrFile, args, err := cli.PopFirstArgument(args)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if len(args) > 0 {
|
|
return errors.New("only one argument is accepted, please check with usage")
|
|
}
|
|
|
|
csrFileBytes, err := cli.ReadStdin(csrFile)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = json.Unmarshal(csrFileBytes, req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if c.Hostname != "" {
|
|
req.Hosts = signer.SplitHosts(c.Hostname)
|
|
}
|
|
|
|
csrBytes, err := csr.Generate(key, req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
cli.PrintCert(keyBytes, csrBytes, nil)
|
|
return nil
|
|
}
|
|
|
|
// Command assembles the definition of Command 'gencsr'
|
|
var Command = &cli.Command{UsageText: gencsrUsageText, Flags: gencsrFlags, Main: gencsrMain}
|