@@ -1490,3 +1490,103 @@ func TestUpdateTLSCert(t *testing.T) {
1490
1490
assert .Error (t , err )
1491
1491
assert .Contains (t , err .Error (), "certificate is valid for notlocalhost.org1.example.com, notlocalhost, not localhost" )
1492
1492
}
1493
+
1494
+ func TestCipherSuites (t * testing.T ) {
1495
+ t .Parallel ()
1496
+
1497
+ // default cipher suites
1498
+ defaultCipherSuites := []uint16 {
1499
+ tls .TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ,
1500
+ tls .TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ,
1501
+ tls .TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 ,
1502
+ tls .TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 ,
1503
+ tls .TLS_RSA_WITH_AES_128_GCM_SHA256 ,
1504
+ tls .TLS_RSA_WITH_AES_256_GCM_SHA384 ,
1505
+ }
1506
+ // the other cipher suites supported by Go
1507
+ otherCipherSuites := []uint16 {
1508
+ tls .TLS_RSA_WITH_RC4_128_SHA ,
1509
+ tls .TLS_RSA_WITH_3DES_EDE_CBC_SHA ,
1510
+ tls .TLS_RSA_WITH_AES_128_CBC_SHA ,
1511
+ tls .TLS_RSA_WITH_AES_256_CBC_SHA ,
1512
+ tls .TLS_RSA_WITH_AES_128_CBC_SHA256 ,
1513
+ tls .TLS_ECDHE_ECDSA_WITH_RC4_128_SHA ,
1514
+ tls .TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA ,
1515
+ tls .TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA ,
1516
+ tls .TLS_ECDHE_RSA_WITH_RC4_128_SHA ,
1517
+ tls .TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA ,
1518
+ tls .TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA ,
1519
+ tls .TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA ,
1520
+ tls .TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 ,
1521
+ tls .TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 ,
1522
+ tls .TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 ,
1523
+ tls .TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 ,
1524
+ }
1525
+ certPEM , err := ioutil .ReadFile (filepath .Join ("testdata" , "certs" ,
1526
+ "Org1-server1-cert.pem" ))
1527
+ assert .NoError (t , err )
1528
+ keyPEM , err := ioutil .ReadFile (filepath .Join ("testdata" , "certs" ,
1529
+ "Org1-server1-key.pem" ))
1530
+ assert .NoError (t , err )
1531
+ caPEM , err := ioutil .ReadFile (filepath .Join ("testdata" , "certs" ,
1532
+ "Org1-cert.pem" ))
1533
+ assert .NoError (t , err )
1534
+ certPool , err := createCertPool ([][]byte {caPEM })
1535
+ assert .NoError (t , err )
1536
+
1537
+ serverConfig := comm.ServerConfig {
1538
+ SecOpts : & comm.SecureOptions {
1539
+ ServerCertificate : certPEM ,
1540
+ ServerKey : keyPEM ,
1541
+ UseTLS : true ,
1542
+ }}
1543
+
1544
+ var tests = []struct {
1545
+ name string
1546
+ port int
1547
+ clientCiphers []uint16
1548
+ success bool
1549
+ }{
1550
+ {
1551
+ name : "server default / client all" ,
1552
+ port : 8340 ,
1553
+ success : true ,
1554
+ },
1555
+ {
1556
+ name : "server default / client match" ,
1557
+ port : 8341 ,
1558
+ clientCiphers : defaultCipherSuites ,
1559
+ success : true ,
1560
+ },
1561
+ {
1562
+ name : "server default / client no match" ,
1563
+ port : 8342 ,
1564
+ clientCiphers : otherCipherSuites ,
1565
+ success : false ,
1566
+ },
1567
+ }
1568
+
1569
+ for _ , test := range tests {
1570
+ test := test
1571
+ t .Run (test .name , func (t * testing.T ) {
1572
+ t .Parallel ()
1573
+ t .Logf ("Running test %s ..." , test .name )
1574
+ address := fmt .Sprintf ("localhost:%d" , test .port )
1575
+ srv , err := comm .NewGRPCServer (address , serverConfig )
1576
+ assert .NoError (t , err )
1577
+ go srv .Start ()
1578
+ defer srv .Stop ()
1579
+ tlsConfig := & tls.Config {
1580
+ RootCAs : certPool ,
1581
+ CipherSuites : test .clientCiphers ,
1582
+ }
1583
+ _ , err = tls .Dial ("tcp" , address , tlsConfig )
1584
+ if test .success {
1585
+ assert .NoError (t , err )
1586
+ } else {
1587
+ t .Log (err )
1588
+ assert .Contains (t , err .Error (), "handshake failure" )
1589
+ }
1590
+ })
1591
+ }
1592
+ }
0 commit comments