mtls.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package plugin
  2. import (
  3. "bytes"
  4. "crypto/ecdsa"
  5. "crypto/elliptic"
  6. "crypto/rand"
  7. "crypto/x509"
  8. "crypto/x509/pkix"
  9. "encoding/pem"
  10. "math/big"
  11. "time"
  12. )
  13. // generateCert generates a temporary certificate for plugin authentication. The
  14. // certificate and private key are returns in PEM format.
  15. func generateCert() (cert []byte, privateKey []byte, err error) {
  16. key, err := ecdsa.GenerateKey(elliptic.P521(), rand.Reader)
  17. if err != nil {
  18. return nil, nil, err
  19. }
  20. serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
  21. sn, err := rand.Int(rand.Reader, serialNumberLimit)
  22. if err != nil {
  23. return nil, nil, err
  24. }
  25. host := "localhost"
  26. template := &x509.Certificate{
  27. Subject: pkix.Name{
  28. CommonName: host,
  29. Organization: []string{"HashiCorp"},
  30. },
  31. DNSNames: []string{host},
  32. ExtKeyUsage: []x509.ExtKeyUsage{
  33. x509.ExtKeyUsageClientAuth,
  34. x509.ExtKeyUsageServerAuth,
  35. },
  36. KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment | x509.KeyUsageKeyAgreement | x509.KeyUsageCertSign,
  37. BasicConstraintsValid: true,
  38. SerialNumber: sn,
  39. NotBefore: time.Now().Add(-30 * time.Second),
  40. NotAfter: time.Now().Add(262980 * time.Hour),
  41. IsCA: true,
  42. }
  43. der, err := x509.CreateCertificate(rand.Reader, template, template, key.Public(), key)
  44. if err != nil {
  45. return nil, nil, err
  46. }
  47. var certOut bytes.Buffer
  48. if err := pem.Encode(&certOut, &pem.Block{Type: "CERTIFICATE", Bytes: der}); err != nil {
  49. return nil, nil, err
  50. }
  51. keyBytes, err := x509.MarshalECPrivateKey(key)
  52. if err != nil {
  53. return nil, nil, err
  54. }
  55. var keyOut bytes.Buffer
  56. if err := pem.Encode(&keyOut, &pem.Block{Type: "EC PRIVATE KEY", Bytes: keyBytes}); err != nil {
  57. return nil, nil, err
  58. }
  59. cert = certOut.Bytes()
  60. privateKey = keyOut.Bytes()
  61. return cert, privateKey, nil
  62. }