Skip to content

Commit

Permalink
CRL: Update cfssl dependency and fixed remarks
Browse files Browse the repository at this point in the history
  • Loading branch information
kayrus committed Jul 19, 2016
1 parent 19dcd0f commit 03272cd
Show file tree
Hide file tree
Showing 3 changed files with 136 additions and 100 deletions.
179 changes: 108 additions & 71 deletions cmd/vendor/github.com/cloudflare/cfssl/revoke/revoke.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 2 additions & 27 deletions embed/etcd.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,11 @@ package embed

import (
"crypto/tls"
"errors"
"fmt"
"net"
"net/http"
"path"

"github.com/cloudflare/cfssl/revoke"
"github.com/coreos/etcd/etcdserver"
"github.com/coreos/etcd/etcdserver/api/v2http"
"github.com/coreos/etcd/pkg/cors"
Expand Down Expand Up @@ -282,27 +280,6 @@ func startClientListeners(cfg *Config) (sctxs map[string]*serveCtx, err error) {
return sctxs, nil
}

func revokeCheckHandler(req *http.Request, CRLpath string) error {
if req.TLS == nil {
return nil
}
for _, cert := range req.TLS.PeerCertificates {
var revoked, ok bool
if CRLpath != "" {
revoked, ok = revoke.VerifyCertificateByCRLPath(cert, CRLpath)
} else {
revoked, ok = revoke.VerifyCertificate(cert)
}
if !ok {
return errors.New("Cert check failed")
}
if revoked {
return errors.New("Cert if revoked")
}
}
return nil
}

func (e *Etcd) serve() (err error) {
var ctlscfg *tls.Config
if !e.cfg.ClientTLSInfo.Empty() {
Expand All @@ -317,19 +294,17 @@ func (e *Etcd) serve() (err error) {
}

// Start the peer server in a goroutine
ph := tlsutil.RevocationCheck(
ph := tlsutil.NewRevokeHandler(
v2http.NewPeerHandler(e.Server),
revokeCheckHandler,
e.cfg.PeerTLSInfo.CRLFile)
for _, l := range e.Peers {
go func(l net.Listener) {
e.errc <- servePeerHTTP(l, ph)
}(l)
}

clientHandler := tlsutil.RevocationCheck(
clientHandler := tlsutil.NewRevokeHandler(
v2http.NewClientHandler(e.Server, e.Server.Cfg.ReqTimeout()),
revokeCheckHandler,
e.cfg.ClientTLSInfo.CRLFile)
// Start a client server goroutine for each listen address
ch := http.Handler(&cors.CORSHandler{
Expand Down
28 changes: 26 additions & 2 deletions pkg/tlsutil/tlsutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ import (
"io/ioutil"
"net/http"

"github.com/cloudflare/cfssl/revoke"

etcdErr "github.com/coreos/etcd/error"
)

Expand Down Expand Up @@ -75,9 +77,31 @@ func NewCert(certfile, keyfile string, parseFunc func([]byte, []byte) (tls.Certi
return &tlsCert, nil
}

func RevocationCheck(handler http.Handler, checker func(*http.Request, string) error, CRLpath string) http.Handler {
func revokeCheckHandler(req *http.Request, CRLpath string, revokeChecker *revoke.Revoke) error {
if req.TLS == nil {
return nil
}
for _, cert := range req.TLS.PeerCertificates {
var revoked, ok bool
if CRLpath != "" {
revoked, ok = revokeChecker.VerifyCertificateByCRLPath(cert, CRLpath)
} else {
revoked, ok = revokeChecker.VerifyCertificate(cert)
}
if !ok {
return fmt.Errorf("cert check failed (CN=%s, Serial: %s)", cert.Subject.CommonName, cert.SerialNumber.String())
}
if revoked {
return fmt.Errorf("Cert is revoked (CN=%s, Serial: %s)", cert.Subject.CommonName, cert.SerialNumber.String())
}
}
return nil
}

func NewRevokeHandler(handler http.Handler, CRLpath string) http.Handler {
revokeChecker := revoke.NewRevokeChecker()
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
err := checker(req, CRLpath)
err := revokeCheckHandler(req, CRLpath, revokeChecker)
if err == nil {
handler.ServeHTTP(w, req)
return
Expand Down

0 comments on commit 03272cd

Please sign in to comment.