blob: 9aa0953a9d591f49a9a7443827b3a7762e80e837 [file] [log] [blame]
package main
import (
"crypto/x509"
"encoding/pem"
"errors"
"fmt"
"log"
"os"
"github.com/spf13/cobra"
"source.monogon.dev/metropolis/cli/metroctl/core"
)
func init() {
certCmd.AddCommand(certExportCmd)
rootCmd.AddCommand(certCmd)
}
var certCmd = &cobra.Command{
Short: "Certificate utilities",
Use: "cert",
}
var certExportCmd = &cobra.Command{
Short: "Exports certificates for use in other programs",
Use: "export",
Example: "metroctl cert export",
RunE: func(cmd *cobra.Command, args []string) error {
ocert, opkey, err := core.GetOwnerCredentials(flags.configPath)
if errors.Is(err, core.ErrNoCredentials) {
return fmt.Errorf("you have to take ownership of the cluster first: %w", err)
}
pkcs8Key, err := x509.MarshalPKCS8PrivateKey(opkey)
if err != nil {
// We explicitly pass an Ed25519 private key in, so this can't happen
panic(err)
}
if err := os.WriteFile("owner.crt", pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: ocert.Raw}), 0755); err != nil {
return err
}
if err := os.WriteFile("owner.key", pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: pkcs8Key}), 0755); err != nil {
return err
}
log.Println("Wrote files to current dir: cert.pem, key.pem")
return nil
},
Args: PrintUsageOnWrongArgs(cobra.NoArgs),
}