Skip to content

Commit 831abae

Browse files
authored
Implemented TLS client certificate authentication
1 parent 6a9964b commit 831abae

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@ Usage of ./nginx-prometheus-exporter:
7777
-nginx.scrape-uri string
7878
A URI or unix domain socket path for scraping NGINX or NGINX Plus metrics.
7979
For NGINX, the stub_status page must be available through the URI. For NGINX Plus -- the API. The default value can be overwritten by SCRAPE_URI environment variable. (default "http://127.0.0.1:8080/stub_status")
80+
-nginx.ssl-ca-cert string
81+
Path to the PEM encoded CA certificate file used to validate the servers SSL certificate. The default value can be overwritten by SSL_CA_CERT environment variable.
82+
-nginx.ssl-client-cert string
83+
Path to the PEM encoded client certificate file to use when connecting to the server. The default value can be overwritten by SSL_CLIENT_CERT environment variable.
84+
-nginx.ssl-client-key string
85+
Path to the PEM encoded client certificate key file to use when connecting to the server. The default value can be overwritten by SSL_CLIENT_KEY environment variable.
8086
-nginx.ssl-verify
8187
Perform SSL certificate verification. The default value can be overwritten by SSL_VERIFY environment variable. (default true)
8288
-nginx.timeout duration

exporter.go

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ package main
33
import (
44
"context"
55
"crypto/tls"
6+
"crypto/x509"
67
"flag"
78
"fmt"
9+
"io/ioutil"
810
"log"
911
"net"
1012
"net/http"
@@ -225,6 +227,9 @@ var (
225227
defaultNginxPlus = getEnvBool("NGINX_PLUS", false)
226228
defaultScrapeURI = getEnv("SCRAPE_URI", "http://127.0.0.1:8080/stub_status")
227229
defaultSslVerify = getEnvBool("SSL_VERIFY", true)
230+
defaultSslCaCert = getEnv("SSL_CA_CERT", "")
231+
defaultSslClientCert = getEnv("SSL_CLIENT_CERT", "")
232+
defaultSslClientKey = getEnv("SSL_CLIENT_KEY", "")
228233
defaultTimeout = getEnvPositiveDuration("TIMEOUT", time.Second*5)
229234
defaultNginxRetries = getEnvUint("NGINX_RETRIES", 0)
230235
defaultNginxRetryInterval = getEnvPositiveDuration("NGINX_RETRY_INTERVAL", time.Second*5)
@@ -247,6 +252,15 @@ For NGINX, the stub_status page must be available through the URI. For NGINX Plu
247252
sslVerify = flag.Bool("nginx.ssl-verify",
248253
defaultSslVerify,
249254
"Perform SSL certificate verification. The default value can be overwritten by SSL_VERIFY environment variable.")
255+
sslCaCert = flag.String("nginx.ssl-ca-cert",
256+
defaultSslCaCert,
257+
"Path to the PEM encoded CA certificate file used to validate the servers SSL certificate. The default value can be overwritten by SSL_CA_CERT environment variable.")
258+
sslClientCert = flag.String("nginx.ssl-client-cert",
259+
defaultSslClientCert,
260+
"Path to the PEM encoded client certificate file to use when connecting to the server. The default value can be overwritten by SSL_CLIENT_CERT environment variable.")
261+
sslClientKey = flag.String("nginx.ssl-client-key",
262+
defaultSslClientKey,
263+
"Path to the PEM encoded client certificate key file to use when connecting to the server. The default value can be overwritten by SSL_CLIENT_KEY environment variable.")
250264
nginxRetries = flag.Uint("nginx.retries",
251265
defaultNginxRetries,
252266
"A number of retries the exporter will make on start to connect to the NGINX stub_status page/NGINX Plus API before exiting with an error. The default value can be overwritten by NGINX_RETRIES environment variable.")
@@ -289,8 +303,30 @@ func main() {
289303

290304
registry.MustRegister(buildInfoMetric)
291305

306+
sslConfig := &tls.Config{InsecureSkipVerify: !*sslVerify}
307+
if *sslCaCert != "" {
308+
caCert, err := ioutil.ReadFile(*sslCaCert)
309+
if err != nil {
310+
log.Fatalf("Loading CA cert failed: %v", err)
311+
}
312+
sslCaCertPool := x509.NewCertPool()
313+
ok := sslCaCertPool.AppendCertsFromPEM(caCert)
314+
if !ok {
315+
log.Fatal("Parsing CA cert file failed.")
316+
}
317+
sslConfig.RootCAs = sslCaCertPool
318+
}
319+
320+
if *sslClientCert != "" && *sslClientKey != "" {
321+
clientCert, err := tls.LoadX509KeyPair(*sslClientCert, *sslClientKey)
322+
if err != nil {
323+
log.Fatalf("Loading client certificate failed: %v", err)
324+
}
325+
sslConfig.Certificates = []tls.Certificate{clientCert}
326+
}
327+
292328
transport := &http.Transport{
293-
TLSClientConfig: &tls.Config{InsecureSkipVerify: !*sslVerify},
329+
TLSClientConfig: sslConfig,
294330
}
295331
if strings.HasPrefix(*scrapeURI, "unix:") {
296332
socketPath, requestPath, err := parseUnixSocketAddress(*scrapeURI)

0 commit comments

Comments
 (0)