Add configoption to exclude routes from tls upgrading (#2203)
* Add configoption to exclude routes from tls upgrading * Add tests for IsLocationInLocationList * Seperate elements in NoTLSRedirectLocations by comma * Set NoTLSRedirectLocations to "/.well-known/acme-challenge/" by default * Remove trailing slash from "/.well-known/acme-challenge" default
This commit is contained in:
parent
977cfcb4c7
commit
94deb3a01a
5 changed files with 60 additions and 1 deletions
|
@ -133,6 +133,7 @@ The following table shows a configuration option's name, type, and the default v
|
||||||
|[http-redirect-code](#http-redirect-code)|int|308|
|
|[http-redirect-code](#http-redirect-code)|int|308|
|
||||||
|[proxy-buffering](#proxy-buffering)|string|"off"|
|
|[proxy-buffering](#proxy-buffering)|string|"off"|
|
||||||
|[limit-req-status-code](#limit-req-status-code)|int|503|
|
|[limit-req-status-code](#limit-req-status-code)|int|503|
|
||||||
|
|[no-tls-redirect-locations](#no-tls-redirect-locations)|string|"/.well-known/acme-challenge"|
|
||||||
|
|
||||||
## add-headers
|
## add-headers
|
||||||
|
|
||||||
|
@ -731,3 +732,8 @@ Enables or disables [buffering of responses from the proxied server](http://ngin
|
||||||
## limit-req-status-code
|
## limit-req-status-code
|
||||||
|
|
||||||
Sets the [status code to return in response to rejected requests](http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req_status).Default: 503
|
Sets the [status code to return in response to rejected requests](http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req_status).Default: 503
|
||||||
|
|
||||||
|
## no-tls-redirect-locations
|
||||||
|
|
||||||
|
A comma-separated list of locations on which http requests will never get redirected to their https counterpart.
|
||||||
|
Default: "/.well-known/acme-challenge"
|
||||||
|
|
|
@ -490,6 +490,10 @@ type Configuration struct {
|
||||||
SyslogHost string `json:"syslog-host"`
|
SyslogHost string `json:"syslog-host"`
|
||||||
// SyslogPort port
|
// SyslogPort port
|
||||||
SyslogPort int `json:"syslog-port",omitempty`
|
SyslogPort int `json:"syslog-port",omitempty`
|
||||||
|
|
||||||
|
// NoTLSRedirectLocations is a comma-separated list of locations
|
||||||
|
// that should not get redirected to TLS
|
||||||
|
NoTLSRedirectLocations string `json:"no-tls-redirect-locations"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDefault returns the default nginx configuration
|
// NewDefault returns the default nginx configuration
|
||||||
|
@ -587,6 +591,7 @@ func NewDefault() Configuration {
|
||||||
JaegerSamplerParam: "1",
|
JaegerSamplerParam: "1",
|
||||||
LimitReqStatusCode: 503,
|
LimitReqStatusCode: 503,
|
||||||
SyslogPort: 514,
|
SyslogPort: 514,
|
||||||
|
NoTLSRedirectLocations: "/.well-known/acme-challenge",
|
||||||
}
|
}
|
||||||
|
|
||||||
if glog.V(5) {
|
if glog.V(5) {
|
||||||
|
|
|
@ -129,6 +129,7 @@ var (
|
||||||
"buildRateLimit": buildRateLimit,
|
"buildRateLimit": buildRateLimit,
|
||||||
"buildResolvers": buildResolvers,
|
"buildResolvers": buildResolvers,
|
||||||
"buildUpstreamName": buildUpstreamName,
|
"buildUpstreamName": buildUpstreamName,
|
||||||
|
"isLocationInLocationList": isLocationInLocationList,
|
||||||
"isLocationAllowed": isLocationAllowed,
|
"isLocationAllowed": isLocationAllowed,
|
||||||
"buildLogFormatUpstream": buildLogFormatUpstream,
|
"buildLogFormatUpstream": buildLogFormatUpstream,
|
||||||
"buildDenyVariable": buildDenyVariable,
|
"buildDenyVariable": buildDenyVariable,
|
||||||
|
@ -513,6 +514,28 @@ func buildRateLimit(input interface{}) []string {
|
||||||
return limits
|
return limits
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isLocationInLocationList(location interface{}, rawLocationList string) bool {
|
||||||
|
loc, ok := location.(*ingress.Location)
|
||||||
|
if !ok {
|
||||||
|
glog.Errorf("expected an '*ingress.Location' type but %T was returned", location)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
locationList := strings.Split(rawLocationList, ",")
|
||||||
|
|
||||||
|
for _, locationListItem := range locationList {
|
||||||
|
locationListItem = strings.Trim(locationListItem, " ")
|
||||||
|
if locationListItem == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(loc.Path, locationListItem) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func isLocationAllowed(input interface{}) bool {
|
func isLocationAllowed(input interface{}) bool {
|
||||||
loc, ok := input.(*ingress.Location)
|
loc, ok := input.(*ingress.Location)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
|
|
@ -645,3 +645,26 @@ func TestBuildAuthSignURL(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIsLocationInLocationList(t *testing.T) {
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
location *ingress.Location
|
||||||
|
rawLocationList string
|
||||||
|
expected bool
|
||||||
|
}{
|
||||||
|
{&ingress.Location{Path: "/match"}, "/match", true},
|
||||||
|
{&ingress.Location{Path: "/match"}, ",/match", true},
|
||||||
|
{&ingress.Location{Path: "/match"}, "/dontmatch", false},
|
||||||
|
{&ingress.Location{Path: "/match"}, ",/dontmatch", false},
|
||||||
|
{&ingress.Location{Path: "/match"}, "/dontmatch,/match", true},
|
||||||
|
{&ingress.Location{Path: "/match"}, "/dontmatch,/dontmatcheither", false},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, testCase := range testCases {
|
||||||
|
result := isLocationInLocationList(testCase.location, testCase.rawLocationList)
|
||||||
|
if result != testCase.expected {
|
||||||
|
t.Errorf(" expected %v but return %v, path: '%s', rawLocation: '%s'", testCase.expected, result, testCase.location.Path, testCase.rawLocationList)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -779,6 +779,7 @@ stream {
|
||||||
|
|
||||||
{{/* redirect to HTTPS can be achieved forcing the redirect or having a SSL Certificate configured for the server */}}
|
{{/* redirect to HTTPS can be achieved forcing the redirect or having a SSL Certificate configured for the server */}}
|
||||||
{{ if (or $location.Rewrite.ForceSSLRedirect (and (not (empty $server.SSLCertificate)) $location.Rewrite.SSLRedirect)) }}
|
{{ if (or $location.Rewrite.ForceSSLRedirect (and (not (empty $server.SSLCertificate)) $location.Rewrite.SSLRedirect)) }}
|
||||||
|
{{ if not (isLocationInLocationList $location $all.Cfg.NoTLSRedirectLocations) }}
|
||||||
# enforce ssl on server side
|
# enforce ssl on server side
|
||||||
if ($redirect_to_https) {
|
if ($redirect_to_https) {
|
||||||
{{ if $location.UsePortInRedirects }}
|
{{ if $location.UsePortInRedirects }}
|
||||||
|
@ -792,6 +793,7 @@ stream {
|
||||||
{{ end }}
|
{{ end }}
|
||||||
}
|
}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
{{ if $all.Cfg.EnableModsecurity }}
|
{{ if $all.Cfg.EnableModsecurity }}
|
||||||
modsecurity on;
|
modsecurity on;
|
||||||
|
|
Loading…
Reference in a new issue