Skip to content

Commit 7d1b476

Browse files
committed
Add support for specifying root CA or ignoring SSL verification for keystone server
1 parent fed74d1 commit 7d1b476

File tree

2 files changed

+45
-4
lines changed

2 files changed

+45
-4
lines changed

pkg/api/keystone/keystone_requests.go

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,15 @@ package keystone
22

33
import (
44
"bytes"
5+
"crypto/tls"
6+
"crypto/x509"
57
"encoding/json"
68
"errors"
9+
"io/ioutil"
710
"net/http"
11+
12+
"github.com/grafana/grafana/pkg/log"
13+
"github.com/grafana/grafana/pkg/setting"
814
)
915

1016
///////////////////////
@@ -166,8 +172,7 @@ func authenticate(data *Auth_data, b []byte) error {
166172
return err
167173
}
168174

169-
client := &http.Client{}
170-
resp, err := client.Do(request)
175+
resp, err := GetHttpClient().Do(request)
171176
if err != nil {
172177
return err
173178
} else if resp.StatusCode != 201 {
@@ -203,8 +208,7 @@ func GetProjects(data *Projects_data) error {
203208
}
204209
request.Header.Add("X-Auth-Token", data.Token)
205210

206-
client := &http.Client{}
207-
resp, err := client.Do(request)
211+
resp, err := GetHttpClient().Do(request)
208212
if err != nil {
209213
return err
210214
} else if resp.StatusCode != 200 {
@@ -224,3 +228,35 @@ func GetProjects(data *Projects_data) error {
224228
}
225229
return nil
226230
}
231+
232+
// From https://golang.org/pkg/net/http:
233+
// "Clients and Transports are safe for concurrent use by multiple goroutines and for efficiency should only be created once and re-used."
234+
var client *http.Client
235+
236+
func GetHttpClient() *http.Client {
237+
if client != nil {
238+
return client
239+
} else {
240+
var certPool *x509.CertPool
241+
if pemfile := setting.KeystoneRootCAPEMFile; pemfile != "" {
242+
certPool = x509.NewCertPool()
243+
pemFileContent, err := ioutil.ReadFile(pemfile)
244+
if err != nil {
245+
panic(err)
246+
}
247+
if !certPool.AppendCertsFromPEM(pemFileContent) {
248+
log.Error(3, "Failed to load any certificates from Root CA PEM file %s", pemfile)
249+
} else {
250+
log.Info("Successfully loaded certificate(s) from %s", pemfile)
251+
}
252+
}
253+
tr := &http.Transport{
254+
TLSClientConfig: &tls.Config{RootCAs: certPool,
255+
InsecureSkipVerify: !setting.KeystoneVerifySSLCert},
256+
}
257+
tr.Proxy = http.ProxyFromEnvironment
258+
259+
client = &http.Client{Transport: tr}
260+
return client
261+
}
262+
}

pkg/setting/setting.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ var (
135135
KeystoneEditorRoles []string
136136
KeystoneAdminRoles []string
137137
KeystoneGlobalAdminRoles []string
138+
KeystoneVerifySSLCert bool
139+
KeystoneRootCAPEMFile []string
138140

139141
// SMTP email settings
140142
Smtp SmtpSettings
@@ -487,6 +489,9 @@ func NewConfigContext(args *CommandLineArgs) error {
487489
KeystoneAdminRoles = strings.Split(keystone.Key("admin_roles").String(), ",")
488490
KeystoneGlobalAdminRoles = strings.Split(keystone.Key("global_admin_roles").String(), ",")
489491

492+
KeystoneVerifySSLCert = keystone.Key("verify_ssl_cert").MustBool(true)
493+
KeystoneRootCAPEMFile = keystone.Key("root_ca_pem_file").String()
494+
490495
readSessionConfig()
491496
readSmtpSettings()
492497
readQuotaSettings()

0 commit comments

Comments
 (0)