Alternative TLS implementation in Go
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

generate_cert.go 1.9 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. "crypto/rsa"
  9. "crypto/x509"
  10. "encoding/pem"
  11. "flag"
  12. "log"
  13. "os"
  14. "time"
  15. )
  16. var hostName *string = flag.String("host", "127.0.0.1", "Hostname to generate a certificate for")
  17. func main() {
  18. flag.Parse()
  19. urandom, err := os.Open("/dev/urandom", os.O_RDONLY, 0)
  20. if err != nil {
  21. log.Exitf("failed to open /dev/urandom: %s", err)
  22. return
  23. }
  24. priv, err := rsa.GenerateKey(urandom, 1024)
  25. if err != nil {
  26. log.Exitf("failed to generate private key: %s", err)
  27. return
  28. }
  29. now := time.Seconds()
  30. template := x509.Certificate{
  31. SerialNumber: []byte{0},
  32. Subject: x509.Name{
  33. CommonName: *hostName,
  34. Organization: "Acme Co",
  35. },
  36. NotBefore: time.SecondsToUTC(now - 300),
  37. NotAfter: time.SecondsToUTC(now + 60*60*24*365), // valid for 1 year.
  38. SubjectKeyId: []byte{1, 2, 3, 4},
  39. KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
  40. }
  41. derBytes, err := x509.CreateCertificate(urandom, &template, &template, &priv.PublicKey, priv)
  42. if err != nil {
  43. log.Exitf("Failed to create certificate: %s", err)
  44. return
  45. }
  46. certOut, err := os.Open("cert.pem", os.O_WRONLY|os.O_CREAT, 0644)
  47. if err != nil {
  48. log.Exitf("failed to open cert.pem for writing: %s", err)
  49. return
  50. }
  51. pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes})
  52. certOut.Close()
  53. log.Stdoutf("written cert.pem\n")
  54. keyOut, err := os.Open("key.pem", os.O_WRONLY|os.O_CREAT, 0600)
  55. if err != nil {
  56. log.Exitf("failed to open key.pem for writing: %s", err)
  57. return
  58. }
  59. pem.Encode(keyOut, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(priv)})
  60. keyOut.Close()
  61. log.Stdoutf("written key.pem\n")
  62. }