You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

73 lines
1.8 KiB

  1. // Copyright 2009 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. // Generate a self-signed X.509 certificate for a TLS server. Outputs to
  5. // 'cert.pem' and 'key.pem' and will overwrite existing files.
  6. package main
  7. import (
  8. "big"
  9. "crypto/x509/pkix"
  10. "crypto/rand"
  11. "crypto/rsa"
  12. "crypto/x509"
  13. "encoding/pem"
  14. "flag"
  15. "log"
  16. "os"
  17. "time"
  18. )
  19. var hostName *string = flag.String("host", "127.0.0.1", "Hostname to generate a certificate for")
  20. func main() {
  21. flag.Parse()
  22. priv, err := rsa.GenerateKey(rand.Reader, 1024)
  23. if err != nil {
  24. log.Fatalf("failed to generate private key: %s", err)
  25. return
  26. }
  27. now := time.Seconds()
  28. template := x509.Certificate{
  29. SerialNumber: new(big.Int).SetInt64(0),
  30. Subject: pkix.Name{
  31. CommonName: *hostName,
  32. Organization: []string{"Acme Co"},
  33. },
  34. NotBefore: time.SecondsToUTC(now - 300),
  35. NotAfter: time.SecondsToUTC(now + 60*60*24*365), // valid for 1 year.
  36. SubjectKeyId: []byte{1, 2, 3, 4},
  37. KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
  38. }
  39. derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv)
  40. if err != nil {
  41. log.Fatalf("Failed to create certificate: %s", err)
  42. return
  43. }
  44. certOut, err := os.Create("cert.pem")
  45. if err != nil {
  46. log.Fatalf("failed to open cert.pem for writing: %s", err)
  47. return
  48. }
  49. pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes})
  50. certOut.Close()
  51. log.Print("written cert.pem\n")
  52. keyOut, err := os.OpenFile("key.pem", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
  53. if err != nil {
  54. log.Print("failed to open key.pem for writing:", err)
  55. return
  56. }
  57. pem.Encode(keyOut, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(priv)})
  58. keyOut.Close()
  59. log.Print("written key.pem\n")
  60. }