|
|
package keygen
|
|
|
|
|
|
import (
|
|
|
"b612.me/starcrypto"
|
|
|
"b612.me/starlog"
|
|
|
"b612.me/staros"
|
|
|
"crypto/ecdsa"
|
|
|
"crypto/ed25519"
|
|
|
"crypto/rsa"
|
|
|
"github.com/spf13/cobra"
|
|
|
"os"
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
var k KeyGen
|
|
|
var startdate string
|
|
|
var duration int
|
|
|
|
|
|
var secret string
|
|
|
var path string
|
|
|
var key string
|
|
|
var outpath string
|
|
|
|
|
|
var sshPub bool
|
|
|
|
|
|
func init() {
|
|
|
Cmd.Flags().StringVarP(&k.Type, "type", "t", "rsa", "Key Type: rsa, ecdsa, ed25519")
|
|
|
Cmd.Flags().StringVarP(&k.Encrypt, "encrypt", "e", "", "Encrypt Key with Password (not recommended)")
|
|
|
Cmd.Flags().IntVarP(&k.Bits, "bits", "b", 2048, "Key Bits Rsa: 1024, 2048, 4096 Ecdsa: 224, 256, 384, 521")
|
|
|
Cmd.Flags().StringVarP(&k.Prefix, "prefix", "p", "mykey", "Output File Prefix")
|
|
|
Cmd.Flags().StringVarP(&k.Outfolder, "outfolder", "o", ".", "Output Folder")
|
|
|
Cmd.Flags().BoolVarP(&k.Force, "force", "f", false, "Force Overwrite")
|
|
|
Cmd.Flags().StringVarP(&k.Country, "country", "c", "CN", "Country")
|
|
|
Cmd.Flags().StringVarP(&k.Locality, "locality", "l", "Beijing", "Locality")
|
|
|
Cmd.Flags().StringVarP(&k.Organization, "organization", "O", "B612", "Organization")
|
|
|
Cmd.Flags().StringVarP(&k.OrganizationalUnit, "organizationalunit", "U", "B612", "OrganizationalUnit")
|
|
|
Cmd.Flags().StringVarP(&k.CommonName, "commonname", "C", "Little Prince", "CommonName")
|
|
|
Cmd.Flags().StringVarP(&startdate, "startdate", "s", "", "Cert Start Date")
|
|
|
Cmd.Flags().IntVarP(&duration, "duration", "d", 3650, "Cert Duration")
|
|
|
|
|
|
CmdEn.Flags().StringVarP(&secret, "secret", "s", "", "new Private Key Password,if empty,disable password")
|
|
|
CmdEn.Flags().StringVarP(&path, "path", "p", "", "private key file path")
|
|
|
CmdEn.Flags().StringVarP(&key, "key", "k", "", "private key old password,if empty,disable password")
|
|
|
CmdEn.Flags().StringVarP(&outpath, "outpath", "o", "./newkey", "new key file output path")
|
|
|
|
|
|
Cmd.AddCommand(CmdEn)
|
|
|
|
|
|
CmdPub.Flags().StringVarP(&path, "path", "p", "", "private key file path")
|
|
|
CmdPub.Flags().StringVarP(&outpath, "outpath", "o", "./public.key", "public key file output path")
|
|
|
CmdPub.Flags().BoolVarP(&sshPub, "ssh", "s", false, "output ssh public key")
|
|
|
Cmd.AddCommand(CmdPub)
|
|
|
}
|
|
|
|
|
|
var Cmd = &cobra.Command{
|
|
|
Use: "keygen",
|
|
|
Short: "rsa与ecdsa密钥生成工具",
|
|
|
Long: "rsa与ecdsa密钥生成工具,支持加密私钥,生成证书",
|
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
|
var err error
|
|
|
if startdate != "" {
|
|
|
k.StartDate, err = time.Parse("2006-01-02", startdate)
|
|
|
if err != nil {
|
|
|
starlog.Errorln(err)
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
} else {
|
|
|
k.StartDate = time.Now()
|
|
|
}
|
|
|
if duration < 0 {
|
|
|
starlog.Errorln("duration should be positive")
|
|
|
os.Exit(1)
|
|
|
|
|
|
}
|
|
|
k.EndDate = k.StartDate.AddDate(0, 0, duration)
|
|
|
err = k.Gen()
|
|
|
if err != nil {
|
|
|
starlog.Errorln(err)
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
starlog.Infoln("Key Generated,Ouput to", k.Outfolder)
|
|
|
},
|
|
|
}
|
|
|
|
|
|
var CmdEn = &cobra.Command{
|
|
|
Use: "pwd",
|
|
|
Short: "encrypt/change private key",
|
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
|
if !staros.Exists(path) {
|
|
|
starlog.Errorln("file not exists")
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
data, err := os.ReadFile(path)
|
|
|
if err != nil {
|
|
|
starlog.Errorln("read file error:", err)
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
priv, err := starcrypto.DecodePrivateKey(data, key)
|
|
|
if err != nil {
|
|
|
starlog.Errorln("decode private key error:", err)
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
data, err = starcrypto.EncodePrivateKey(priv, secret)
|
|
|
if err != nil {
|
|
|
starlog.Errorln("encode private key error:", err)
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
err = os.WriteFile(outpath, data, 0644)
|
|
|
if err != nil {
|
|
|
starlog.Errorln("write new file error:", err)
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
starlog.Infoln("new key saved to", outpath)
|
|
|
},
|
|
|
}
|
|
|
|
|
|
var CmdPub = &cobra.Command{
|
|
|
Use: "pub",
|
|
|
Short: "通过私钥生成公钥",
|
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
|
var pub any
|
|
|
if !staros.Exists(path) {
|
|
|
starlog.Errorln("file not exists")
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
data, err := os.ReadFile(path)
|
|
|
if err != nil {
|
|
|
starlog.Errorln("read file error:", err)
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
priv, err := starcrypto.DecodePrivateKey(data, key)
|
|
|
if err != nil {
|
|
|
starlog.Errorln("decode private key error:", err)
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
switch n := priv.(type) {
|
|
|
case *rsa.PrivateKey:
|
|
|
starlog.Infoln("found rsa private key")
|
|
|
pub = n.Public()
|
|
|
case *ecdsa.PrivateKey:
|
|
|
starlog.Infoln("found ecdsa private key")
|
|
|
pub = n.Public()
|
|
|
case ed25519.PrivateKey:
|
|
|
starlog.Infoln("found ed25519 private key")
|
|
|
pub = n.Public()
|
|
|
case *ed25519.PrivateKey:
|
|
|
starlog.Infoln("found ed25519 private key")
|
|
|
pub = n.Public()
|
|
|
default:
|
|
|
starlog.Errorln("unknown private key type")
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
if sshPub {
|
|
|
data, err = starcrypto.EncodeSSHPublicKey(pub)
|
|
|
if err != nil {
|
|
|
starlog.Errorln("encode ssh public key error:", err)
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
} else {
|
|
|
data, err = starcrypto.EncodePublicKey(pub)
|
|
|
if err != nil {
|
|
|
starlog.Errorln("encode public key error:", err)
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
}
|
|
|
starlog.Infoln("public key:", string(data))
|
|
|
err = os.WriteFile(outpath, data, 0644)
|
|
|
if err != nil {
|
|
|
starlog.Errorln("write public key error:", err)
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
starlog.Infoln("public key saved to", outpath)
|
|
|
},
|
|
|
}
|