@@ -2,6 +2,7 @@ package token
2
2
3
3
import (
4
4
"bytes"
5
+ "crypto"
5
6
"crypto/tls"
6
7
"encoding/json"
7
8
"errors"
@@ -15,6 +16,9 @@ import (
15
16
16
17
"github.com/smallstep/cli-utils/errs"
17
18
"github.com/smallstep/cli-utils/ui"
19
+ "go.step.sm/crypto/pemutil"
20
+
21
+ "github.com/smallstep/cli/internal/cryptoutil"
18
22
)
19
23
20
24
func createCommand () cli.Command {
@@ -73,27 +77,31 @@ func createAction(ctx *cli.Context) (err error) {
73
77
return err
74
78
}
75
79
76
- args := ctx .Args ()
77
-
78
- teamID := args .Get (0 )
79
- crtFile := args .Get (1 )
80
- keyFile := args .Get (2 )
80
+ var (
81
+ args = ctx .Args ()
82
+ teamID = args .Get (0 )
83
+ crtFile = args .Get (1 )
84
+ keyFile = args .Get (2 )
85
+ apiURLFlag = ctx .String ("api-url" )
86
+ audience = ctx .String ("audience" )
87
+ )
81
88
82
- parsedURL , err := url .Parse (ctx . String ( "api-url" ) )
89
+ parsedURL , err := url .Parse (apiURLFlag )
83
90
if err != nil {
84
91
return err
85
92
}
86
93
parsedURL .Path = path .Join (parsedURL .Path , "api/auth" )
87
94
apiURL := parsedURL .String ()
88
95
89
- clientCert , err := tls . LoadX509KeyPair (crtFile , keyFile )
96
+ clientCert , err := createClientCertificate (crtFile , keyFile )
90
97
if err != nil {
91
98
return err
92
99
}
100
+
93
101
b := & bytes.Buffer {}
94
102
r := & createTokenReq {
95
103
Bundle : clientCert .Certificate ,
96
- Audience : ctx . String ( " audience" ) ,
104
+ Audience : audience ,
97
105
}
98
106
if err := uuid .Validate (teamID ); err != nil {
99
107
r .TeamSlug = teamID
@@ -113,7 +121,7 @@ func createAction(ctx *cli.Context) (err error) {
113
121
transport := http .DefaultTransport .(* http.Transport ).Clone ()
114
122
transport .TLSClientConfig = & tls.Config {
115
123
GetClientCertificate : func (* tls.CertificateRequestInfo ) (* tls.Certificate , error ) {
116
- return & clientCert , nil
124
+ return clientCert , nil
117
125
},
118
126
MinVersion : tls .VersionTLS12 ,
119
127
}
@@ -143,3 +151,38 @@ func createAction(ctx *cli.Context) (err error) {
143
151
144
152
return nil
145
153
}
154
+
155
+ func createClientCertificate (crtFile , keyFile string ) (* tls.Certificate , error ) {
156
+ certs , err := pemutil .ReadCertificateBundle (crtFile )
157
+ if err != nil {
158
+ return nil , fmt .Errorf ("failed reading %q: %w" , crtFile , err )
159
+ }
160
+
161
+ var certificates = make ([][]byte , len (certs ))
162
+ for i , c := range certs {
163
+ certificates [i ] = c .Raw
164
+ }
165
+
166
+ var (
167
+ v any
168
+ signer crypto.Signer
169
+ )
170
+ if cryptoutil .IsKMS (keyFile ) {
171
+ signer , err = cryptoutil .CreateSigner (keyFile , keyFile )
172
+ if err != nil {
173
+ return nil , fmt .Errorf ("failed creating signer: %w" , err )
174
+ }
175
+ v = signer
176
+ } else {
177
+ v , err = pemutil .Read (keyFile )
178
+ if err != nil {
179
+ return nil , fmt .Errorf ("failed reading %q: %w" , keyFile , err )
180
+ }
181
+ }
182
+
183
+ return & tls.Certificate {
184
+ Certificate : certificates ,
185
+ Leaf : certs [0 ],
186
+ PrivateKey : v ,
187
+ }, nil
188
+ }
0 commit comments