Files
micromdm/server/devicecert.go
Jesse Peterson d150d031e8 UDID/device certificate authentication (v.2) (#429)
udid-cert auth v.2. refactor udidauth and cert verification to be MDM service middleware
2018-09-11 20:25:49 -07:00

67 lines
1.8 KiB
Go

package server
import (
"context"
"crypto/x509"
"github.com/go-kit/kit/log"
"github.com/go-kit/kit/log/level"
"github.com/pkg/errors"
"github.com/micromdm/micromdm/mdm"
)
type ScepVerifyDepot interface {
HasCN(cn string, allowTime int, cert *x509.Certificate, revokeOldCertificate bool) (bool, error)
}
func VerifyCertificateMiddleware(store ScepVerifyDepot, logger log.Logger) mdm.Middleware {
return func(next mdm.Service) mdm.Service {
return &verifyCertificateMiddleware{
store: store,
next: next,
logger: logger,
}
}
}
type verifyCertificateMiddleware struct {
store ScepVerifyDepot
next mdm.Service
logger log.Logger
}
func (mw *verifyCertificateMiddleware) Acknowledge(ctx context.Context, req mdm.AcknowledgeEvent) ([]byte, error) {
devcert, err := mdm.DeviceCertificateFromContext(ctx)
if err != nil {
return nil, errors.Wrap(err, "error retrieving device certificate")
}
hasCN, err := mw.store.HasCN(devcert.Subject.CommonName, 0, devcert, false)
if err != nil {
return nil, errors.Wrap(err, "error checking device certificate")
}
if !hasCN {
err := errors.New("unauthorized client")
level.Info(mw.logger).Log("err", err)
return nil, err
}
return mw.next.Acknowledge(ctx, req)
}
func (mw *verifyCertificateMiddleware) Checkin(ctx context.Context, req mdm.CheckinEvent) error {
devcert, err := mdm.DeviceCertificateFromContext(ctx)
if err != nil {
return errors.Wrap(err, "error retrieving device certificate")
}
hasCN, err := mw.store.HasCN(devcert.Subject.CommonName, 0, devcert, false)
if err != nil {
return errors.Wrap(err, "error checking device certificate")
}
if !hasCN {
err := errors.New("unauthorized client")
level.Info(mw.logger).Log("err", err)
return err
}
return mw.next.Checkin(ctx, req)
}