diff options
| -rw-r--r-- | main.go | 59 | 
1 files changed, 48 insertions, 11 deletions
@@ -11,7 +11,7 @@ import (    "crypto/ecdsa"    "crypto/rsa"    "crypto/x509" -//  "crypto/x509/pkix" +  "crypto/x509/pkix"    "crypto/rand"    "encoding/pem"  //  "code.google.com/p/go.crypto/ssh/terminal" @@ -24,6 +24,7 @@ const (    RsaUpperLength = 4096    TypeLabelRSA   = "RSA PRIVATE KEY"    TypeLabelECDSA = "EC PRIVATE KEY" +  TypeLabelCSR   = "CERTIFICATE REQUEST"  )  var ( @@ -43,8 +44,11 @@ type (    SignFlags struct {      PrivateKeyPath string // path to the private key +    Output         string // path where to store the CSR +    BaseAttributes pkix.Name      private_key PrivateKey +    output_stream io.WriteCloser // the output stream for the CSR    }  ) @@ -65,16 +69,12 @@ func main() {  func create_private_key() {    flags := parse_create_flags() -  if flags.Output == "STDOUT" { -    flags.output_stream = os.Stdout -  } else { -    var err error -    flags.output_stream, err = os.OpenFile(flags.Output, os.O_WRONLY | os.O_CREATE | os.O_TRUNC, 0600) -    if err != nil { -      crash_with_help(2, fmt.Sprintf("Error when creating file %s: %s", flags.Output, err)) -    } -    defer flags.output_stream.Close() +  var err error +  flags.output_stream, err = open_output_stream(flags.Output) +  if err != nil { +    crash_with_help(2, fmt.Sprintf("Error when creating file %s: %s", flags.Output, err))    } +  defer flags.output_stream.Close()    switch flags.CryptType {      case "rsa":   create_private_key_rsa(flags) @@ -140,6 +140,24 @@ func parse_create_flags() CreateFlags {  func create_sign_request() {    flags := parse_sign_flags()    flags.private_key = load_private_key(flags.PrivateKeyPath) + +  var err error +  flags.output_stream, err = open_output_stream(flags.Output) +  if err != nil { +    crash_with_help(2, fmt.Sprintf("Error when creating file %s: %s", flags.Output, err)) +  } +  defer flags.output_stream.Close() + +  csr_template := &x509.CertificateRequest{ +    Subject: flags.BaseAttributes, +  } +  csr_raw, err := x509.CreateCertificateRequest(rand.Reader, csr_template, flags.private_key) +  if err != nil { +    fmt.Fprintln(os.Stderr, "Error when generating CSR: ", err) +    os.Exit(3) +  } +  block := &pem.Block{Type: TypeLabelCSR, Bytes: csr_raw} +  pem.Encode(flags.output_stream, block)  }  // parse the flags to create a certificate sign request @@ -147,8 +165,13 @@ func parse_sign_flags() SignFlags {    flags := SignFlags{}    fs := flag.NewFlagSet("create-cert-sign", flag.ExitOnError)    fs.StringVar(&flags.PrivateKeyPath, "private-key", "", "path to the private key file") -  fs.Parse(os.Args[2:]) +  fs.StringVar(&flags.Output, "output", "STDOUT", "path where the generated csr should be stored") +  flags.BaseAttributes = pkix.Name{} +  fs.StringVar(&flags.BaseAttributes.CommonName, "common-name", "", "the name of the resource") +  fs.StringVar(&flags.BaseAttributes.SerialNumber, "serial", "1", "serial number for the request") + +  fs.Parse(os.Args[2:])    return flags  } @@ -200,6 +223,20 @@ func load_private_key_ecdsa(block *pem.Block) PrivateKey {    return key  } +// open stream for given path +func open_output_stream(path string) (io.WriteCloser, error) { +  if path == "STDOUT" { +    return os.Stdout, nil +  } else { +    var err error +    output_stream, err := os.OpenFile(path, os.O_WRONLY | os.O_CREATE | os.O_TRUNC, 0600) +    if err != nil { +      return nil, err +    } +    return output_stream, nil +  } +} +  // print the module help  func print_modules() {    fmt.Printf(`Usage: %s command args  | 
