selfsign.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // Package selfsign implements the selfsign command.
  2. package selfsign
  3. import (
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "os"
  8. "time"
  9. "github.com/cloudflare/cfssl/cli"
  10. "github.com/cloudflare/cfssl/cli/genkey"
  11. "github.com/cloudflare/cfssl/config"
  12. "github.com/cloudflare/cfssl/csr"
  13. "github.com/cloudflare/cfssl/helpers"
  14. "github.com/cloudflare/cfssl/selfsign"
  15. )
  16. var selfSignUsageText = `cfssl selfsign -- generate a new self-signed key and signed certificate
  17. Usage of gencert:
  18. cfssl selfsign HOSTNAME CSRJSON
  19. WARNING: this should ONLY be used for testing. This should never be
  20. used in production.
  21. WARNING: self-signed certificates are insecure; they do not provide
  22. the authentication required for secure systems. Use these at your own
  23. risk.
  24. Arguments:
  25. HOSTNAME: Hostname for the cert
  26. CSRJSON: JSON file containing the request, use '-' for reading JSON from stdin
  27. Flags:
  28. `
  29. var selfSignFlags = []string{"config"}
  30. func selfSignMain(args []string, c cli.Config) (err error) {
  31. if c.Hostname == "" && !c.IsCA {
  32. c.Hostname, args, err = cli.PopFirstArgument(args)
  33. if err != nil {
  34. return
  35. }
  36. }
  37. csrFile, args, err := cli.PopFirstArgument(args)
  38. if err != nil {
  39. return
  40. }
  41. if len(args) > 0 {
  42. return errors.New("too many arguments are provided, please check with usage")
  43. }
  44. csrFileBytes, err := cli.ReadStdin(csrFile)
  45. if err != nil {
  46. return
  47. }
  48. var req = csr.New()
  49. err = json.Unmarshal(csrFileBytes, req)
  50. if err != nil {
  51. return
  52. }
  53. var key, csrPEM []byte
  54. g := &csr.Generator{Validator: genkey.Validator}
  55. csrPEM, key, err = g.ProcessRequest(req)
  56. if err != nil {
  57. key = nil
  58. return
  59. }
  60. priv, err := helpers.ParsePrivateKeyPEM(key)
  61. if err != nil {
  62. key = nil
  63. return
  64. }
  65. var profile *config.SigningProfile
  66. // If there is a config, use its signing policy. Otherwise, leave policy == nil
  67. // and NewSigner will use DefaultConfig().
  68. if c.CFG != nil {
  69. if c.Profile != "" && c.CFG.Signing.Profiles != nil {
  70. profile = c.CFG.Signing.Profiles[c.Profile]
  71. }
  72. }
  73. if profile == nil {
  74. profile = config.DefaultConfig()
  75. profile.Expiry = 2190 * time.Hour
  76. }
  77. cert, err := selfsign.Sign(priv, csrPEM, profile)
  78. if err != nil {
  79. key = nil
  80. priv = nil
  81. return
  82. }
  83. fmt.Fprintf(os.Stderr, `*** WARNING ***
  84. Self-signed certificates are dangerous. Use this self-signed
  85. certificate at your own risk.
  86. It is strongly recommended that these certificates NOT be used
  87. in production.
  88. *** WARNING ***
  89. `)
  90. cli.PrintCert(key, csrPEM, cert)
  91. return
  92. }
  93. // Command assembles the definition of Command 'selfsign'
  94. var Command = &cli.Command{UsageText: selfSignUsageText, Flags: selfSignFlags, Main: selfSignMain}