crl.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // Package crl implements the HTTP handler for the crl command.
  2. package crl
  3. import (
  4. "crypto"
  5. "crypto/x509"
  6. "net/http"
  7. "os"
  8. "time"
  9. "github.com/cloudflare/cfssl/api"
  10. "github.com/cloudflare/cfssl/certdb"
  11. "github.com/cloudflare/cfssl/crl"
  12. "github.com/cloudflare/cfssl/errors"
  13. "github.com/cloudflare/cfssl/helpers"
  14. "github.com/cloudflare/cfssl/log"
  15. )
  16. // A Handler accepts requests with a serial number parameter
  17. // and revokes
  18. type Handler struct {
  19. dbAccessor certdb.Accessor
  20. ca *x509.Certificate
  21. key crypto.Signer
  22. }
  23. // NewHandler returns a new http.Handler that handles a revoke request.
  24. func NewHandler(dbAccessor certdb.Accessor, caPath string, caKeyPath string) (http.Handler, error) {
  25. ca, err := helpers.ReadBytes(caPath)
  26. if err != nil {
  27. return nil, err
  28. }
  29. caKey, err := helpers.ReadBytes(caKeyPath)
  30. if err != nil {
  31. return nil, errors.Wrap(errors.PrivateKeyError, errors.ReadFailed, err)
  32. }
  33. // Parse the PEM encoded certificate
  34. issuerCert, err := helpers.ParseCertificatePEM(ca)
  35. if err != nil {
  36. return nil, err
  37. }
  38. strPassword := os.Getenv("CFSSL_CA_PK_PASSWORD")
  39. password := []byte(strPassword)
  40. if strPassword == "" {
  41. password = nil
  42. }
  43. // Parse the key given
  44. key, err := helpers.ParsePrivateKeyPEMWithPassword(caKey, password)
  45. if err != nil {
  46. log.Debug("malformed private key %v", err)
  47. return nil, err
  48. }
  49. return &api.HTTPHandler{
  50. Handler: &Handler{
  51. dbAccessor: dbAccessor,
  52. ca: issuerCert,
  53. key: key,
  54. },
  55. Methods: []string{"GET"},
  56. }, nil
  57. }
  58. // Handle responds to revocation requests. It attempts to revoke
  59. // a certificate with a given serial number
  60. func (h *Handler) Handle(w http.ResponseWriter, r *http.Request) error {
  61. var newExpiryTime = 7 * helpers.OneDay
  62. certs, err := h.dbAccessor.GetRevokedAndUnexpiredCertificates()
  63. if err != nil {
  64. return err
  65. }
  66. queryExpiryTime := r.URL.Query().Get("expiry")
  67. if queryExpiryTime != "" {
  68. log.Infof("requested expiry time of %s", queryExpiryTime)
  69. newExpiryTime, err = time.ParseDuration(queryExpiryTime)
  70. if err != nil {
  71. return err
  72. }
  73. }
  74. result, err := crl.NewCRLFromDB(certs, h.ca, h.key, newExpiryTime)
  75. if err != nil {
  76. return err
  77. }
  78. return api.SendResponse(w, result)
  79. }