@@ -8,6 +8,7 @@ package etcdraft
8
8
9
9
import (
10
10
"bytes"
11
+ "crypto/x509"
11
12
"encoding/pem"
12
13
"fmt"
13
14
"sync"
@@ -416,12 +417,11 @@ func CheckConfigMetadata(metadata *etcdraft.ConfigMetadata) error {
416
417
417
418
// sanity check of certificates
418
419
for _ , consenter := range metadata .Consenters {
419
- if bl , _ := pem . Decode (consenter .ServerTlsCert ); bl = = nil {
420
- return errors . Errorf ( "invalid server TLS cert: %s" , string ( consenter . ServerTlsCert ))
420
+ if err := validateCert (consenter .ServerTlsCert , "server" ); err ! = nil {
421
+ return err
421
422
}
422
-
423
- if bl , _ := pem .Decode (consenter .ClientTlsCert ); bl == nil {
424
- return errors .Errorf ("invalid client TLS cert: %s" , string (consenter .ClientTlsCert ))
423
+ if err := validateCert (consenter .ClientTlsCert , "client" ); err != nil {
424
+ return err
425
425
}
426
426
}
427
427
@@ -432,6 +432,19 @@ func CheckConfigMetadata(metadata *etcdraft.ConfigMetadata) error {
432
432
return nil
433
433
}
434
434
435
+ func validateCert (pemData []byte , certRole string ) error {
436
+ bl , _ := pem .Decode (pemData )
437
+
438
+ if bl == nil {
439
+ return errors .Errorf ("%s TLS certificate is not PEM encoded: %s" , certRole , string (pemData ))
440
+ }
441
+
442
+ if _ , err := x509 .ParseCertificate (bl .Bytes ); err != nil {
443
+ return errors .Errorf ("%s TLS certificate has invalid ASN1 structure, %v: %s" , certRole , err , string (pemData ))
444
+ }
445
+ return nil
446
+ }
447
+
435
448
// ConsenterCertificate denotes a TLS certificate of a consenter
436
449
type ConsenterCertificate []byte
437
450
@@ -467,16 +480,6 @@ func (conCert ConsenterCertificate) IsConsenterOfChannel(configBlock *common.Blo
467
480
return cluster .ErrNotInChannel
468
481
}
469
482
470
- // SliceOfConsentersIDs converts maps of consenters into slice of consenters ids
471
- func SliceOfConsentersIDs (consenters map [uint64 ]* etcdraft.Consenter ) []uint64 {
472
- result := make ([]uint64 , 0 )
473
- for id := range consenters {
474
- result = append (result , id )
475
- }
476
-
477
- return result
478
- }
479
-
480
483
// NodeExists returns trues if node id exists in the slice
481
484
// and false otherwise
482
485
func NodeExists (id uint64 , nodes []uint64 ) bool {
0 commit comments