From e2492daddc56d20cab4d011ccdad70906e751e71 Mon Sep 17 00:00:00 2001 From: Mosen Date: Tue, 28 Jun 2016 22:41:00 +1000 Subject: [PATCH] Parse APNS Topic from push certificate in enroll service constructor. --- enroll/certificates.go | 29 +++++++++++++++++++++++++++++ enroll/service.go | 11 ++++++++--- main.go | 2 +- 3 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 enroll/certificates.go diff --git a/enroll/certificates.go b/enroll/certificates.go new file mode 100644 index 00000000..0cf3c756 --- /dev/null +++ b/enroll/certificates.go @@ -0,0 +1,29 @@ +package enroll + +import ( + "errors" + "golang.org/x/crypto/pkcs12" + "io/ioutil" +) + +const PushTopicASN1 string = "0.9.2342.19200300.100.1.1" + +func GetPushTopicFromPKCS12(certPath string, certPass string) (string, error) { + certData, err := ioutil.ReadFile(certPath) + if err != nil { + return "", err + } + + _, cert, err := pkcs12.Decode(certData, certPass) + if err != nil { + return "", err + } + + for _, v := range cert.Subject.Names { + if v.Type.String() == PushTopicASN1 { + return v.Value.(string), nil + } + } + + return "", errors.New("Could not find Push Topic in the provided pkcs12 bundle.") +} diff --git a/enroll/service.go b/enroll/service.go index f2a75cdc..c21411e9 100644 --- a/enroll/service.go +++ b/enroll/service.go @@ -4,7 +4,12 @@ type Service interface { Enroll() (Profile, error) } -func NewService() Service { +func NewService(pushCertPath string, pushCertPass string) (Service, error) { + pushTopic, err := GetPushTopicFromPKCS12(pushCertPath, pushCertPass) + if err != nil { + return nil, err + } + scepSubject := [][][]string{ [][]string{ []string{"O", "MicroMDM"}, @@ -16,9 +21,9 @@ func NewService() Service { Url: "https://micromdm.local:6443", SCEPUrl: "http://micromdm.local:2019/scep", SCEPSubject: scepSubject, - Topic: "", + Topic: pushTopic, CACert: []byte{}, - } + }, nil } type service struct { diff --git a/main.go b/main.go index bc0ea823..a9e59b02 100644 --- a/main.go +++ b/main.go @@ -188,7 +188,7 @@ func main() { commandSvc := command.NewService(commandDB) checkinSvc := checkin.NewService(deviceDB, mgmtSvc, commandSvc, enrollmentProfile) connectSvc := connect.NewService(deviceDB, commandSvc) - enrollSvc := enroll.NewService() + enrollSvc, _ := enroll.NewService(*flPushCert, *flPushPass) httpLogger := log.NewContext(logger).With("component", "http") managementHandler := management.ServiceHandler(ctx, mgmtSvc, httpLogger)