Skip to content

Commit 70c2b9b

Browse files
staeblerarschles
authored andcommitted
Add ability to specify CA certs to use for TLS authentication. (#1112)
* Add ability to specify CA certs to use for TLS authentication. Modify ups-broker walkthrough example to support using TLS. * Validate InsecureSkipTLSVerify and CABundle are not both present in a broker spec. * Add comments in ups-broker.yaml explaining TLS optional values. * Fix incorrect case in btroker validation error message
1 parent 2aa5039 commit 70c2b9b

File tree

33 files changed

+613
-87
lines changed

33 files changed

+613
-87
lines changed

charts/ups-broker/templates/broker-deployment.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@ spec:
2727
args:
2828
- --port
2929
- "8080"
30+
{{- if .Values.tls.cert}}
31+
- --tlsCert
32+
- "{{ .Values.tls.cert }}"
33+
{{- end}}
34+
{{- if .Values.tls.key}}
35+
- --tlsKey
36+
- "{{ .Values.tls.key }}"
37+
{{- end}}
3038
ports:
3139
- containerPort: 8080
3240
readinessProbe:

charts/ups-broker/values.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,9 @@
33
image: quay.io/kubernetes-service-catalog/user-broker:v0.0.16
44
# ImagePullPolicy; valid values are "IfNotPresent", "Never", and "Always"
55
imagePullPolicy: Always
6+
# Certificate details to use for TLS. Leave blank to not use TLS
7+
tls:
8+
# base-64 encoded PEM data for the TLS certificate
9+
cert:
10+
# base-64 encoded PEM data for the private key matching the certificate
11+
key:

contrib/cmd/user-broker/user-broker.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,15 @@ import (
3333
)
3434

3535
var options struct {
36-
Port int
36+
Port int
37+
TLSCert string
38+
TLSKey string
3739
}
3840

3941
func init() {
4042
flag.IntVar(&options.Port, "port", 8005, "use '--port' option to specify the port for broker to listen on")
43+
flag.StringVar(&options.TLSCert, "tlsCert", "", "base-64 encoded PEM block to use as the certificate for TLS. If '--tlsCert' is used, then '--tlsKey' must also be used. If '--tlsCert' is not used, then TLS will not be used.")
44+
flag.StringVar(&options.TLSKey, "tlsKey", "", "base-64 encoded PEM block to use as the private key matching the TLS certificate. If '--tlsKey' is used, then '--tlsCert' must also be used")
4145
flag.Parse()
4246
}
4347

@@ -60,9 +64,22 @@ func runWithContext(ctx context.Context) error {
6064
fmt.Printf("%s/%s\n", path.Base(os.Args[0]), pkg.VERSION)
6165
return nil
6266
}
67+
if (options.TLSCert != "" || options.TLSKey != "") &&
68+
(options.TLSCert == "" || options.TLSKey == "") {
69+
fmt.Println("To use TLS, both --tlsCert and --tlsKey must be used")
70+
return nil
71+
}
6372

6473
addr := ":" + strconv.Itoa(options.Port)
65-
return server.Run(ctx, addr, controller.CreateController())
74+
ctrlr := controller.CreateController()
75+
76+
var err error
77+
if options.TLSCert == "" && options.TLSKey == "" {
78+
err = server.Run(ctx, addr, ctrlr)
79+
} else {
80+
err = server.RunTLS(ctx, addr, options.TLSCert, options.TLSKey, ctrlr)
81+
}
82+
return err
6683
}
6784

6885
// cancelOnInterrupt calls f when os.Interrupt or SIGTERM is received.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDJzCCAg+gAwIBAgIQaAAvrIN4pJqdJ86zwvHsATANBgkqhkiG9w0BAQsFADAS
3+
MRAwDgYDVQQKEwdBY21lIENvMCAXDTE3MDgwODE3MDczMloYDzIxMzEwOTA3MDgw
4+
NzMyWjASMRAwDgYDVQQKEwdBY21lIENvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
5+
MIIBCgKCAQEA0DZDZywpAJydy0wzOtqOITtO9K+AWgQ4LN4TNyWIdWiVqMm3y8iJ
6+
CbaaleUJp9e1+uXhQfkSjzIkbVflxjItQrchgV2qM8eyrecQ9cGyUk+rbjjwPfbc
7+
kgQ4LRCqB7GmgSYmB/UB1aSIWAM/tNVSWYpTzobAqSBe1g2hHA0gVsBMNC8Bd83k
8+
ozuTUAM+QmMMi24vRoz0/kxnTvyEHV2a2rE+wsNxZt0gXb6SZ9+r/aAzBItB1C7f
9+
0jndkts42qSmhkJm+nDsxSHFrFHwoB9QriDAtitje3ZTFiPtAkuzUGrrzNbgvLg+
10+
K2GX7dzOoIb8qlWjJ1GSxigDIxuvcvQRzwIDAQABo3cwdTAOBgNVHQ8BAf8EBAMC
11+
AqQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zA9BgNVHREE
12+
NjA0gjJ1cHMtYnJva2VyLXVwcy1icm9rZXIudXBzLWJyb2tlci5zdmMuY2x1c3Rl
13+
ci5sb2NhbDANBgkqhkiG9w0BAQsFAAOCAQEAgFjXewXfM507ctvVP+IpHMFl184J
14+
VoWeOt0p8A1Y6JOkZohb4kguDyMsDZy3UHy1AtOHcrfOYa9qvDB2xbCsv5cMY8cn
15+
nk67LyPNWje/ESwCrPyB684uUOwqG7fOanjYW7AwmXiNm8i4tJRY9QkausEFZZoy
16+
hk6gJYT7PPcV/nyyHcFEWAGOQZookKwJtBvDNTNsz59twjpQFBi7aHdplTT6l+ML
17+
cThTArnoXK2A6u1LtsuW5Rz3/ar3t9h+1UHs8/3/abYaPVm7CWfmz5oyvLWA5wqd
18+
8fhvWCxJojRVhaZRcQFjtygGSOVFaMlvuzYqBBrjXrzcLQ6oqpzdOVIevQ==
19+
-----END CERTIFICATE-----
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEogIBAAKCAQEA0DZDZywpAJydy0wzOtqOITtO9K+AWgQ4LN4TNyWIdWiVqMm3
3+
y8iJCbaaleUJp9e1+uXhQfkSjzIkbVflxjItQrchgV2qM8eyrecQ9cGyUk+rbjjw
4+
PfbckgQ4LRCqB7GmgSYmB/UB1aSIWAM/tNVSWYpTzobAqSBe1g2hHA0gVsBMNC8B
5+
d83kozuTUAM+QmMMi24vRoz0/kxnTvyEHV2a2rE+wsNxZt0gXb6SZ9+r/aAzBItB
6+
1C7f0jndkts42qSmhkJm+nDsxSHFrFHwoB9QriDAtitje3ZTFiPtAkuzUGrrzNbg
7+
vLg+K2GX7dzOoIb8qlWjJ1GSxigDIxuvcvQRzwIDAQABAoIBACJp1Zon4l8Hg80m
8+
OxFvLi6v7szidQRrzh0cV3C182f0cUgEjyxPaNcCJ2q/AGmNbbaaaDDPShIA56Rq
9+
8r9fa7urKQ6IvKjySMYVeugjq6WPJXaCUrLrKmm36NEKABBlfG+8Lm0CQdtd5msl
10+
nlH1MDc8db2c6BsMDqCyf/5y7PVpZtuhPXBmzs330SWrLLLM//v6U2XCAVEJtSzE
11+
Qe3XO35VRFN8D3rumx+kITrLUf5S9GZA2mx0jRX+bXSWeFPI7WY6lqMg5MBMkaCp
12+
BhdSQ6u2jyKkHXLK9KuqSlz1fiesY97jQF0sdjlipTISZUa3oM9wHCobhrKmK5e0
13+
KZF34wECgYEA6fdJPA2ead4AAAD9BZdGI2+4PxwRd5+TJur3d9Q2/wZ/8f+DyDIC
14+
PI/KTnb7Bz3nDdu4YzevVC78qrMYxHvIIC1KlJm8q52VWv8uiBMR+WmM5DEfzq6R
15+
C8Tc03sRt1ZoEyvhB0A69/1R+pvsMUey4H7jy84WMXry3W5RTXUPUSkCgYEA49IS
16+
LV06duBNXm29kBD7ML4RFZmHC3pyA7xIAmeQRFjmvmAqyxLeJmX7zr5N15HZ+pcd
17+
uZ4I9mbXxqezx7JmhHoONL9wYaVwAsDtjZm2G/KoZxRIdaE2Bh8Cg50pdi6zitgA
18+
E7Wp0HDILgkoZ9BkwmJAyX58ZqF/TdbULzAm0jcCgYBxDeEBd8M4fOGbHt8kuHhX
19+
30A0nqeCGkXM5HU4Hf+FM+rXURSoxCF4ijLDv5KFaVAgzi9HIj1CfIHzKh+psfZ+
20+
NeR38eHNO5RUKEKf1jc1Qd+m1GX+RTQpb7MVLb7dzI711JokGtFjy7C1XGrBVVgG
21+
SspgTPFEb5izjv8SYqJIIQKBgDFoTKLj9hrz2DOjbxoAZMmUXtYlXqFBo9plieRj
22+
m2kHMruU1ZMG+4CuW2bh5LXcnr526W5o9J6jfSZLFnU3nn4ajlwoLHIw09L1Dk/I
23+
RzNWc+ku/+vq03GOZhgvDF/iDvQMli+wFSzsWK2LNOUWz9NMRaqtMMN9QMOb1JaL
24+
RdAPAoGARZxy64AOq4Bx8Iig+ZLckyuYq9v70DNee/z6+fqtOje+IQO65doXZ/WG
25+
tDUDRAXUR6HSBcLybEf2rJJOGFY4Nf41E/2lQfB6qaKn4v/q7HN5zh2u8D8Dr9xs
26+
Fo45Jbsxk4nKHaoHrnWJNDMC6uBs3SG6p+vIsA0u9+kLIIvt09Q=
27+
-----END RSA PRIVATE KEY-----

contrib/examples/walkthrough/ups-broker.yaml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,18 @@ metadata:
44
name: ups-broker
55
spec:
66
url: http://ups-broker-ups-broker.ups-broker.svc.cluster.local
7+
#####
8+
# Values below are useful if you are using TLS to communicate with the broker.
9+
# TLS can be enabled by setting the tls.cert and tls.key values when running the helm chart.
10+
#
11+
# If TLS is enabled, then the https url below should be used instead of the http url above.
12+
#
13+
# If the TLS cert at contrib/examples/walkthrough/ups-broker-test-cert.pem is used, then
14+
# the caBundle below can be used so that the broker client will accept that certificate.
15+
#
16+
# If you want to ignore all TLS verification, then the insecureSkipTLSVerify below can be used.
17+
# Note that caBundle and insecureSkipTLSVerify cannot be used together.
18+
#####
19+
##url: https://ups-broker-ups-broker.ups-broker.svc.cluster.local:80
20+
##caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURKekNDQWcrZ0F3SUJBZ0lRYUFBdnJJTjRwSnFkSjg2end2SHNBVEFOQmdrcWhraUc5dzBCQVFzRkFEQVMKTVJBd0RnWURWUVFLRXdkQlkyMWxJRU52TUNBWERURTNNRGd3T0RFM01EY3pNbG9ZRHpJeE16RXdPVEEzTURndwpOek15V2pBU01SQXdEZ1lEVlFRS0V3ZEJZMjFsSUVOdk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBCk1JSUJDZ0tDQVFFQTBEWkRaeXdwQUp5ZHkwd3pPdHFPSVR0TzlLK0FXZ1E0TE40VE55V0lkV2lWcU1tM3k4aUoKQ2JhYWxlVUpwOWUxK3VYaFFma1NqeklrYlZmbHhqSXRRcmNoZ1YycU04ZXlyZWNROWNHeVVrK3Jiamp3UGZiYwprZ1E0TFJDcUI3R21nU1ltQi9VQjFhU0lXQU0vdE5WU1dZcFR6b2JBcVNCZTFnMmhIQTBnVnNCTU5DOEJkODNrCm96dVRVQU0rUW1NTWkyNHZSb3owL2t4blR2eUVIVjJhMnJFK3dzTnhadDBnWGI2U1o5K3IvYUF6Qkl0QjFDN2YKMGpuZGt0czQycVNtaGtKbStuRHN4U0hGckZId29COVFyaURBdGl0amUzWlRGaVB0QWt1elVHcnJ6TmJndkxnKwpLMkdYN2R6T29JYjhxbFdqSjFHU3hpZ0RJeHV2Y3ZRUnp3SURBUUFCbzNjd2RUQU9CZ05WSFE4QkFmOEVCQU1DCkFxUXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUhBd0V3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekE5QmdOVkhSRUUKTmpBMGdqSjFjSE10WW5KdmEyVnlMWFZ3Y3kxaWNtOXJaWEl1ZFhCekxXSnliMnRsY2k1emRtTXVZMngxYzNSbApjaTVzYjJOaGJEQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFnRmpYZXdYZk01MDdjdHZWUCtJcEhNRmwxODRKClZvV2VPdDBwOEExWTZKT2tab2hiNGtndUR5TXNEWnkzVUh5MUF0T0hjcmZPWWE5cXZEQjJ4YkNzdjVjTVk4Y24Kbms2N0x5UE5XamUvRVN3Q3JQeUI2ODR1VU93cUc3Zk9hbmpZVzdBd21YaU5tOGk0dEpSWTlRa2F1c0VGWlpveQpoazZnSllUN1BQY1Yvbnl5SGNGRVdBR09RWm9va0t3SnRCdkROVE5zejU5dHdqcFFGQmk3YUhkcGxUVDZsK01MCmNUaFRBcm5vWEsyQTZ1MUx0c3VXNVJ6My9hcjN0OWgrMVVIczgvMy9hYllhUFZtN0NXZm16NW95dkxXQTV3cWQKOGZodldDeEpvalJWaGFaUmNRRmp0eWdHU09WRmFNbHZ1ellxQkJyalhyemNMUTZvcXB6ZE9WSWV2UT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
21+
##insecureSkipTLSVerify: true

contrib/pkg/broker/server/server.go

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ package server
1818

1919
import (
2020
"context"
21+
"crypto/tls"
22+
"encoding/base64"
2123
"fmt"
2224
"net/http"
2325
"time"
@@ -56,8 +58,41 @@ func createHandler(c controller.Controller) http.Handler {
5658
// Run creates the HTTP handler based on an implementation of a
5759
// controller.Controller interface, and begins to listen on the specified address.
5860
func Run(ctx context.Context, addr string, c controller.Controller) error {
61+
listenAndServe := func(srv *http.Server) error {
62+
return srv.ListenAndServe()
63+
}
64+
return run(ctx, addr, listenAndServe, c)
65+
}
66+
67+
// RunTLS creates the HTTPS handler based on an implementation of a
68+
// controller.Controller interface, and begins to listen on the specified address.
69+
func RunTLS(ctx context.Context, addr string, cert string, key string, c controller.Controller) error {
70+
var decodedCert, decodedKey []byte
71+
var tlsCert tls.Certificate
72+
var err error
73+
decodedCert, err = base64.StdEncoding.DecodeString(cert)
74+
if err != nil {
75+
return err
76+
}
77+
decodedKey, err = base64.StdEncoding.DecodeString(key)
78+
if err != nil {
79+
return err
80+
}
81+
tlsCert, err = tls.X509KeyPair(decodedCert, decodedKey)
82+
if err != nil {
83+
return err
84+
}
85+
listenAndServe := func(srv *http.Server) error {
86+
srv.TLSConfig = new(tls.Config)
87+
srv.TLSConfig.Certificates = []tls.Certificate{tlsCert}
88+
return srv.ListenAndServeTLS("", "")
89+
}
90+
return run(ctx, addr, listenAndServe, c)
91+
}
92+
93+
func run(ctx context.Context, addr string, listenAndServe func(srv *http.Server) error, c controller.Controller) error {
5994
glog.Infof("Starting server on %d\n", addr)
60-
srv := http.Server{
95+
srv := &http.Server{
6196
Addr: addr,
6297
Handler: createHandler(c),
6398
}
@@ -69,7 +104,7 @@ func Run(ctx context.Context, addr string, c controller.Controller) error {
69104
srv.Close()
70105
}
71106
}()
72-
return srv.ListenAndServe()
107+
return listenAndServe(srv)
73108
}
74109

75110
func (s *server) catalog(w http.ResponseWriter, r *http.Request) {

glide.lock

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

glide.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,4 @@ import:
6464
- package: code.cloudfoundry.org/lager
6565
version: dfcbcba2dd4a5228c43b0292d219d5c010daed3a
6666
- package: github.com/pmorie/go-open-service-broker-client
67-
version: a15af7d9e6c264f61daf883b78ed3f13a0b53de6
67+
version: 48d1e069bbc4a7ec3fe52dee77a48046fbbf48e4

pkg/apis/servicecatalog/checksum/checksum_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ func TestBrokerSpecChecksum(t *testing.T) {
7777
},
7878
},
7979
},
80+
InsecureSkipTLSVerify: true,
81+
CABundle: []byte{13, 24, 35, 46},
8082
}
8183

8284
unversionedChecksum := unversioned.BrokerSpecChecksum(spec)

pkg/apis/servicecatalog/checksum/unversioned/checksum.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ func BindingSpecChecksum(spec servicecatalog.BindingSpec) string {
8686
func BrokerSpecChecksum(spec servicecatalog.BrokerSpec) string {
8787
specString := fmt.Sprintf("URL: %v\n", spec.URL)
8888
specString += fmt.Sprintf("AuthInfo: %v\n", spec.AuthInfo)
89+
specString += fmt.Sprintf("InsecureSkipTLSVerify: %v\n", spec.InsecureSkipTLSVerify)
90+
specString += fmt.Sprintf("CABundle: %v\n", spec.CABundle)
8991
glog.V(5).Infof("specString: %v", specString)
9092
sum := sha256.Sum256([]byte(specString))
9193
return fmt.Sprintf("%x", sum)

pkg/apis/servicecatalog/checksum/versioned/v1alpha1/checksum.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ func BindingSpecChecksum(spec v1alpha1.BindingSpec) string {
8686
func BrokerSpecChecksum(spec v1alpha1.BrokerSpec) string {
8787
specString := fmt.Sprintf("URL: %v\n", spec.URL)
8888
specString += fmt.Sprintf("AuthInfo: %v\n", spec.AuthInfo)
89+
specString += fmt.Sprintf("InsecureSkipTLSVerify: %v\n", spec.InsecureSkipTLSVerify)
90+
specString += fmt.Sprintf("CABundle: %v\n", spec.CABundle)
8991
glog.V(5).Infof("specString: %v", specString)
9092
sum := sha256.Sum256([]byte(specString))
9193
return fmt.Sprintf("%x", sum)

pkg/apis/servicecatalog/types.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ type BrokerSpec struct {
5252
// AuthInfo contains the data that the service catalog should use to authenticate
5353
// with the Broker.
5454
AuthInfo *BrokerAuthInfo
55+
56+
// InsecureSkipTLSVerify disables TLS certificate verification when communicating with this Broker.
57+
// This is strongly discouraged. You should use the CABundle instead.
58+
// +optional
59+
InsecureSkipTLSVerify bool `json:"insecureSkipTLSVerify,omitempty"`
60+
// CABundle is a PEM encoded CA bundle which will be used to validate a Broker's serving certificate.
61+
// +optional
62+
CABundle []byte `json:"caBundle,omitempty"`
5563
}
5664

5765
// BrokerAuthInfo is a union type that contains information on one of the authentication methods

0 commit comments

Comments
 (0)