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  }