github.com/kolanos/fargate@v0.2.3/cmd/certificate_import.go (about) 1 package cmd 2 3 import ( 4 "encoding/base64" 5 "fmt" 6 "io/ioutil" 7 "strings" 8 9 ACM "github.com/jpignata/fargate/acm" 10 "github.com/jpignata/fargate/console" 11 "github.com/spf13/cobra" 12 ) 13 14 type CertificateImportOperation struct { 15 CertificateFile string 16 PrivateKeyFile string 17 CertificateChainFile string 18 } 19 20 func (o *CertificateImportOperation) Validate() { 21 var msgs []string 22 23 if o.CertificateFile == "" { 24 msgs = append(msgs, "--certificate is required") 25 } 26 27 if o.PrivateKeyFile == "" { 28 msgs = append(msgs, "--key is required") 29 } 30 31 if len(msgs) > 0 { 32 console.ErrorExit(fmt.Errorf(strings.Join(msgs, ", ")), "Invalid command line flags") 33 } 34 } 35 36 var ( 37 flagCertificateImportCertificate string 38 flagCertificateImportKey string 39 flagCertificateImportChain string 40 ) 41 42 var certificateImportCmd = &cobra.Command{ 43 Use: "import --certificate <certificate-file> --key <key-file> [--chain <chain-file>]", 44 Short: "Import a certificate", 45 Long: `Import a certificate 46 47 Upload a certificate from a certificate file, a private key file, an optionally 48 an intermediate certificate chain file. The files must be PEM-encoded and the 49 private key must not be encrypted or protected by a passphrase. See 50 http://docs.aws.amazon.com/acm/latest/APIReference/API_ImportCertificate.html 51 for more details.`, 52 Run: func(cmd *cobra.Command, args []string) { 53 operation := &CertificateImportOperation{ 54 CertificateFile: flagCertificateImportCertificate, 55 PrivateKeyFile: flagCertificateImportKey, 56 CertificateChainFile: flagCertificateImportChain, 57 } 58 59 operation.Validate() 60 61 importCertificate(operation) 62 }, 63 } 64 65 func init() { 66 certificateImportCmd.Flags().StringVarP(&flagCertificateImportCertificate, "certificate", "c", "", "Filename of the certificate to import") 67 certificateImportCmd.Flags().StringVarP(&flagCertificateImportKey, "key", "k", "", "Filename of the private key used to generate the certificate") 68 certificateImportCmd.Flags().StringVar(&flagCertificateImportChain, "chain", "", "Filename of intermediate certificate chain") 69 70 certificateCmd.AddCommand(certificateImportCmd) 71 } 72 73 func importCertificate(operation *CertificateImportOperation) { 74 var ( 75 certificate string 76 privateKey string 77 certificateChain string 78 ) 79 80 acm := ACM.New(sess) 81 82 certificateData, err := ioutil.ReadFile(operation.CertificateFile) 83 84 if err != nil { 85 console.ErrorExit(err, "Could not read certificate from file %s", operation.CertificateFile) 86 } 87 88 privateKeyData, err := ioutil.ReadFile(operation.PrivateKeyFile) 89 90 if err != nil { 91 console.ErrorExit(err, "Could not read key from file %s", operation.PrivateKeyFile) 92 } 93 94 certificate = base64.StdEncoding.EncodeToString(certificateData) 95 privateKey = base64.StdEncoding.EncodeToString(privateKeyData) 96 97 if operation.CertificateChainFile != "" { 98 certificateChainData, err := ioutil.ReadFile(operation.CertificateChainFile) 99 100 if err != nil { 101 console.ErrorExit(err, "Could not read certificate chain from file %s", operation.CertificateChainFile) 102 } 103 104 certificateChain = base64.StdEncoding.EncodeToString(certificateChainData) 105 } 106 107 acm.ImportCertificate([]byte(certificate), []byte(privateKey), []byte(certificateChain)) 108 console.Info("Imported certificate from %s", operation.CertificateFile) 109 }