9
9
"crypto/tls"
10
10
"crypto/x509"
11
11
"encoding/gob"
12
+ "encoding/json"
12
13
"errors"
13
14
"fmt"
14
15
"io"
@@ -30,6 +31,7 @@ import (
30
31
textbook_rsa "github.com/cloudflare/gokeyless/server/internal/rsa"
31
32
32
33
"github.com/cloudflare/cfssl/log"
34
+ "github.com/google/uuid"
33
35
)
34
36
35
37
// Server is a Keyless Server capable of performing opaque key operations.
@@ -284,6 +286,37 @@ func makeErrResponse(pkt *protocol.Packet, err protocol.Error) response {
284
286
return response {id : pkt .ID , op : protocol .MakeErrorOp (err )}
285
287
}
286
288
289
+ func addOperationRequestID (op * protocol.Operation ) string {
290
+ reqContext := make (map [string ]interface {})
291
+ var reqID string
292
+ var gen bool
293
+
294
+ if len (op .ReqContext ) > 0 {
295
+ if err := json .Unmarshal (op .ReqContext , & reqContext ); err == nil {
296
+ if v , ok := reqContext ["request_id" ]; ok {
297
+ return v .(string )
298
+ } else {
299
+ gen = true
300
+ }
301
+ } else {
302
+ log .Errorf ("malformed operation.ReqContext %v, ignoring error" , op .ReqContext )
303
+ }
304
+ }
305
+
306
+ if len (op .ReqContext ) == 0 || gen {
307
+ reqID = uuid .New ().String ()
308
+ reqContext ["request_id" ] = reqID
309
+ b , err := json .Marshal (reqContext )
310
+ if err == nil {
311
+ op .ReqContext = b
312
+ } else {
313
+ log .Errorf ("error marshaling operation.ReqContext %v, ignoring error" , reqContext )
314
+ reqID = ""
315
+ }
316
+ }
317
+ return reqID
318
+ }
319
+
287
320
func (s * Server ) unlimitedDo (pkt * protocol.Packet , connName string ) response {
288
321
spanCtx , err := tracing .SpanContextFromBinary (pkt .Operation .JaegerSpan )
289
322
if err != nil {
@@ -292,14 +325,17 @@ func (s *Server) unlimitedDo(pkt *protocol.Packet, connName string) response {
292
325
span , ctx := opentracing .StartSpanFromContext (context .Background (), "operation execution" , ext .RPCServerOption (spanCtx ))
293
326
defer span .Finish ()
294
327
tracing .SetOperationSpanTags (span , & pkt .Operation )
328
+ reqID := addOperationRequestID (& pkt .Operation )
329
+ span .SetTag ("request_id" , reqID )
295
330
296
- log .Debugf ("connection %s: limited=false opcode=%s id=%d sni=%s ip=%s ski=%v" ,
331
+ log .Debugf ("connection %s: limited=false opcode=%s id=%d sni=%s ip=%s ski=%v request-id=%s " ,
297
332
connName ,
298
333
pkt .Operation .Opcode ,
299
334
pkt .Header .ID ,
300
335
pkt .Operation .SNI ,
301
336
pkt .Operation .ServerIP ,
302
- pkt .Operation .SKI )
337
+ pkt .Operation .SKI ,
338
+ reqID )
303
339
304
340
var opts crypto.SignerOpts
305
341
switch pkt .Operation .Opcode {
@@ -362,10 +398,10 @@ func (s *Server) unlimitedDo(pkt *protocol.Packet, connName string) response {
362
398
key , err := s .keys .Get (ctx , & pkt .Operation )
363
399
logKeyLoadDuration (loadStart )
364
400
if err != nil {
365
- log .Errorf ("failed to load key with sni=%s ip=%s ski=%v : %v" , pkt .Operation .SNI , pkt .Operation .ServerIP , pkt . Operation . SKI , err )
401
+ log .Errorf ("failed to load key with sni=%s ski=%v request-id=%s : %v" , pkt .Operation .SNI , pkt .Operation .SKI , reqID , err )
366
402
return makeErrResponse (pkt , protocol .ErrInternal )
367
403
} else if key == nil {
368
- log .Errorf ("failed to load key with sni=%s ip=%s ski=%v : %v" , pkt .Operation .SNI , pkt .Operation .ServerIP , pkt . Operation . SKI , protocol .ErrKeyNotFound )
404
+ log .Errorf ("failed to load key with sni=%s ski=%v request-id=%s : %v" , pkt .Operation .SNI , pkt .Operation .SKI , reqID , protocol .ErrKeyNotFound )
369
405
return makeErrResponse (pkt , protocol .ErrKeyNotFound )
370
406
}
371
407
@@ -376,14 +412,14 @@ func (s *Server) unlimitedDo(pkt *protocol.Packet, connName string) response {
376
412
377
413
sig , err := key .Sign (rand .Reader , pkt .Operation .Payload , crypto .Hash (0 ))
378
414
if err != nil {
379
- log .Errorf ("Connection: %s: Signing error: %v" , connName , protocol .ErrCrypto , err )
415
+ log .Errorf ("Connection: %s: sni=%s ski=%v request-id=%s: Signing error: %v: request-id:%s: " , connName , pkt . Operation . SNI , pkt . Operation . SKI , reqID , protocol .ErrCrypto , err , reqID )
380
416
// This indicates that a remote keyserver is being used
381
417
var remoteConfigurationErr RemoteConfigurationErr
382
418
if errors .As (err , & remoteConfigurationErr ) {
383
- log .Errorf ("Connection %v: %s: Signing error: %v\n " , connName , protocol .ErrRemoteConfiguration , err )
419
+ log .Errorf ("Connection %v: sni=%s ski=%v request-id=%s: %s: Signing error: %v request-id:%s \n " , connName , pkt . Operation . SNI , pkt . Operation . SKI , reqID , protocol .ErrRemoteConfiguration , err , reqID )
384
420
return makeErrResponse (pkt , protocol .ErrRemoteConfiguration )
385
421
} else {
386
- log .Errorf ("Connection %v: %s: Signing error: %v\n " , connName , protocol .ErrCrypto , err )
422
+ log .Errorf ("Connection %v: sni=%s ski=%v request-id=%s: %s: Signing error: %v request-id:%s \n " , connName , pkt . Operation . SNI , pkt . Operation . SKI , reqID , protocol .ErrCrypto , err , reqID )
387
423
return makeErrResponse (pkt , protocol .ErrCrypto )
388
424
}
389
425
}
@@ -394,37 +430,37 @@ func (s *Server) unlimitedDo(pkt *protocol.Packet, connName string) response {
394
430
key , err := s .keys .Get (ctx , & pkt .Operation )
395
431
logKeyLoadDuration (loadStart )
396
432
if err != nil {
397
- log .Errorf ("failed to load key with sni=%s ip=%s ski=%v: %v" , pkt .Operation .SNI , pkt .Operation .ServerIP , pkt .Operation .SKI , err )
433
+ log .Errorf ("failed to load key with sni=%s ip=%s ski=%v request-id=%s : %v" , pkt .Operation .SNI , pkt .Operation .ServerIP , pkt .Operation .SKI , reqID , err )
398
434
return makeErrResponse (pkt , protocol .ErrInternal )
399
435
} else if key == nil {
400
- log .Errorf ("failed to load key with sni=%s ip=%s ski=%v: %v" , pkt .Operation .SNI , pkt .Operation .ServerIP , pkt .Operation .SKI , protocol .ErrKeyNotFound )
436
+ log .Errorf ("failed to load key with sni=%s ip=%s ski=%v request-id=%s : %v" , pkt .Operation .SNI , pkt .Operation .ServerIP , pkt .Operation .SKI , reqID , protocol .ErrKeyNotFound )
401
437
return makeErrResponse (pkt , protocol .ErrKeyNotFound )
402
438
}
403
439
404
440
if _ , ok := key .Public ().(* rsa.PublicKey ); ! ok {
405
- log .Errorf ("Connection %v: %s: Key is not RSA" , connName , protocol .ErrCrypto )
441
+ log .Errorf ("Connection %v: sni=%s request-id=%s: %s: Key is not RSA" , connName , pkt . Operation . SNI , reqID , protocol .ErrCrypto )
406
442
return makeErrResponse (pkt , protocol .ErrCrypto )
407
443
}
408
444
409
445
if rsaKey , ok := key .(* rsa.PrivateKey ); ok {
410
446
// Decrypt without removing padding; that's the client's responsibility.
411
447
ptxt , err := textbook_rsa .Decrypt (rsaKey , pkt .Operation .Payload )
412
448
if err != nil {
413
- log .Errorf ("connection %v: %v " , connName , err )
449
+ log .Errorf ("connection %v: sni=%s ip=%s ski=%v request-id=%s: %v " , connName , pkt . Operation . SNI , pkt . Operation . ServerIP , pkt . Operation . SKI , reqID , err )
414
450
return makeErrResponse (pkt , protocol .ErrCrypto )
415
451
}
416
452
return makeRespondResponse (pkt , ptxt )
417
453
}
418
454
419
455
rsaKey , ok := key .(crypto.Decrypter )
420
456
if ! ok {
421
- log .Errorf ("Connection %v: %s: Key is not Decrypter" , connName , protocol .ErrCrypto )
457
+ log .Errorf ("Connection %v: sni=%s request-id=%s: %s: Key is not Decrypter" , connName , pkt . Operation . SNI , reqID , protocol .ErrCrypto )
422
458
return makeErrResponse (pkt , protocol .ErrCrypto )
423
459
}
424
460
425
461
ptxt , err := rsaKey .Decrypt (nil , pkt .Operation .Payload , nil )
426
462
if err != nil {
427
- log .Errorf ("Connection %v: %s: Decryption error: %v" , connName , protocol .ErrCrypto , err )
463
+ log .Errorf ("Connection %v: sni=%s ip=%s ski=%v request-id=%s: %s: Decryption error: %v" , connName , pkt . Operation . SNI , pkt . Operation . ServerIP , pkt . Operation . SKI , reqID , protocol .ErrCrypto , err )
428
464
return makeErrResponse (pkt , protocol .ErrCrypto )
429
465
}
430
466
@@ -457,10 +493,10 @@ func (s *Server) unlimitedDo(pkt *protocol.Packet, connName string) response {
457
493
key , err := s .keys .Get (ctx , & pkt .Operation )
458
494
logKeyLoadDuration (loadStart )
459
495
if err != nil {
460
- log .Errorf ("failed to load key with sni=%s ip=%s ski=%v: %v" , pkt .Operation .SNI , pkt .Operation .ServerIP , pkt .Operation .SKI , err )
496
+ log .Errorf ("failed to load key with sni=%s ip=%s ski=%v request-id=%s : %v" , pkt .Operation .SNI , pkt .Operation .ServerIP , pkt .Operation .SKI , reqID , err )
461
497
return makeErrResponse (pkt , protocol .ErrInternal )
462
498
} else if key == nil {
463
- log .Errorf ("failed to load key with sni=%s ip=%s ski=%v: %v" , pkt .Operation .SNI , pkt .Operation .ServerIP , pkt .Operation .SKI , protocol .ErrKeyNotFound )
499
+ log .Errorf ("failed to load key with sni=%s ip=%s ski=%v request-id=%s : %v" , pkt .Operation .SNI , pkt .Operation .ServerIP , pkt .Operation .SKI , reqID , protocol .ErrKeyNotFound )
464
500
return makeErrResponse (pkt , protocol .ErrKeyNotFound )
465
501
}
466
502
@@ -490,17 +526,17 @@ func (s *Server) unlimitedDo(pkt *protocol.Packet, connName string) response {
490
526
}
491
527
if err != nil {
492
528
if attempts > 1 {
493
- log .Debugf ("Connection %v: failed sign attempt: %s, %d attempt(s) left" , connName , err , attempts - 1 )
529
+ log .Debugf ("Connection %v sni=%s ip=%s ski=%v request-id=%s : failed sign attempt: %s, %d attempt(s) left" , connName , pkt . Operation . SNI , pkt . Operation . ServerIP , pkt . Operation . SKI , reqID , err , attempts - 1 )
494
530
continue
495
531
} else {
496
532
tracing .LogError (span , err )
497
533
// This indicates that a remote keyserver is being used
498
534
var remoteConfigurationErr RemoteConfigurationErr
499
535
if errors .As (err , & remoteConfigurationErr ) {
500
- log .Errorf ("Connection %v: %s: Signing error: %v\n " , connName , protocol .ErrRemoteConfiguration , err )
536
+ log .Errorf ("Connection %v sni=%s ip=%s ski=%v request-id=%s : %s: Signing error: %v\n " , connName , pkt . Operation . SNI , pkt . Operation . ServerIP , pkt . Operation . SKI , reqID , protocol .ErrRemoteConfiguration , err )
501
537
return makeErrResponse (pkt , protocol .ErrRemoteConfiguration )
502
538
} else {
503
- log .Errorf ("Connection %v: %s: Signing error: %v\n " , connName , protocol .ErrCrypto , err )
539
+ log .Errorf ("Connection %v sni=%s ip=%s ski=%v request-id=%s : %s: Signing error: %v\n " , connName , pkt . Operation . SNI , pkt . Operation . ServerIP , pkt . Operation . SKI , reqID , protocol .ErrCrypto , err )
504
540
return makeErrResponse (pkt , protocol .ErrCrypto )
505
541
}
506
542
}
0 commit comments