1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
package main
import ( "crypto/rand" "crypto/rsa" "crypto/x509" "crypto/x509/pkix" "encoding/gob" "encoding/pem" "fmt" "math/big" "os" "time" )
func main() { random := rand.Reader
var key rsa.PrivateKey loadKey("private.key", &key)
now := time.Now() then := now.Add(60 * 60 * 24 * 365 * 1000 * 1000 * 1000) template := x509.Certificate{ SerialNumber: big.NewInt(1), Subject: pkix.Name{ CommonName: "jan.newmarch.name", Organization: []string{"Jan Newmarch"}, }, NotBefore: now, NotAfter: then,
SubjectKeyId: []byte{1, 2, 3, 4}, KeyUsage: x509.KeyUsageCertSign | x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
BasicConstraintsValid: true, IsCA: true, DNSNames: []string{"jan.newmarch.name", "localhost"}, } derBytes, err := x509.CreateCertificate(random, &template, &template, &key.PublicKey, &key) checkError(err)
certCerFile, err := os.Create("jan.newmarch.name.cer") checkError(err) certCerFile.Write(derBytes) certCerFile.Close()
certPEMFile, err := os.Create("jan.newmarch.name.pem") checkError(err) pem.Encode(certPEMFile, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) certPEMFile.Close()
keyPEMFile, err := os.Create("private.pem") checkError(err) pem.Encode(keyPEMFile, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(&key)}) keyPEMFile.Close() }
func loadKey(fileName string, key interface{}) { inFile, err := os.Open(fileName) checkError(err) decoder := gob.NewDecoder(inFile) err = decoder.Decode(key) checkError(err) inFile.Close() }
func checkError(err error) { if err != nil { fmt.Println("Fatal error ", err.Error()) os.Exit(1) } }
|