@@ -12,6 +12,7 @@ import (
12
12
"time"
13
13
14
14
"github.com/pkg/errors"
15
+ "github.com/smallstep/certificates/api"
15
16
"github.com/smallstep/certificates/authority/admin"
16
17
adminAPI "github.com/smallstep/certificates/authority/admin/api"
17
18
"github.com/smallstep/certificates/authority/provisioner"
@@ -558,6 +559,43 @@ retry:
558
559
return nil
559
560
}
560
561
562
+ // CreateExternalAccountKey performs the POST /admin/eak request to the CA.
563
+ func (c * AdminClient ) CreateExternalAccountKey (eakRequest * adminAPI.CreateExternalAccountKeyRequest ) (* adminAPI.CreateExternalAccountKeyResponse , error ) {
564
+ var retried bool
565
+ //body, err := protojson.Marshal(req)
566
+ body , err := json .Marshal (eakRequest )
567
+ if err != nil {
568
+ return nil , errs .Wrap (http .StatusInternalServerError , err , "error marshaling request" )
569
+ }
570
+ u := c .endpoint .ResolveReference (& url.URL {Path : path .Join (adminURLPrefix , "eak" )})
571
+ tok , err := c .generateAdminToken (u .Path )
572
+ if err != nil {
573
+ return nil , errors .Wrapf (err , "error generating admin token" )
574
+ }
575
+ req , err := http .NewRequest ("POST" , u .String (), bytes .NewReader (body ))
576
+ if err != nil {
577
+ return nil , errors .Wrapf (err , "create POST %s request failed" , u )
578
+ }
579
+ req .Header .Add ("Authorization" , tok )
580
+ retry:
581
+ resp , err := c .client .Do (req )
582
+ if err != nil {
583
+ return nil , errors .Wrapf (err , "client POST %s failed" , u )
584
+ }
585
+ if resp .StatusCode >= 400 {
586
+ if ! retried && c .retryOnError (resp ) {
587
+ retried = true
588
+ goto retry
589
+ }
590
+ return nil , readAdminError (resp .Body )
591
+ }
592
+ var eakResp = new (adminAPI.CreateExternalAccountKeyResponse )
593
+ if err := api .ReadJSON (resp .Body , & eakResp ); err != nil {
594
+ return nil , errors .Wrapf (err , "error reading %s" , u )
595
+ }
596
+ return eakResp , nil
597
+ }
598
+
561
599
func readAdminError (r io.ReadCloser ) error {
562
600
defer r .Close ()
563
601
adminErr := new (admin.Error )
0 commit comments