Skip to content

Commit 42bde72

Browse files
authored
Merge pull request #5 from Shopify/custom-server-name-option
let users to pass custom server_name to tcpsock:sslhandshake function
2 parents 6227b39 + ce88ef0 commit 42bde72

File tree

5 files changed

+259
-2
lines changed

5 files changed

+259
-2
lines changed

README.markdown

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ http {
5858
type = "http",
5959
-- type = "https",
6060
-- ssl_verify = true, -- verify SSL certs
61+
-- ssl_server_name = "custom_server_name" -- if given, will be passed to tcpsock:sslhandshake as server_name instead of peer.name
6162
-- ssl_reuse_session = true, -- this makes sure SSL session will be reused
6263
6364
http_req = "GET /status HTTP/1.0\r\nHost: foo.com\r\n\r\n",

lib/resty/upstream/healthcheck.lua

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,8 @@ local function check_peer(ctx, id, peer, is_backup)
235235
end
236236

237237
if ctx.type == "https" then
238-
local session, err = sock:sslhandshake(ctx.session, name,
238+
local session, err = sock:sslhandshake(ctx.session,
239+
ctx.ssl_server_name or name,
239240
ctx.ssl_verify)
240241
if not session then
241242
peer_error(ctx, is_backup, id, peer,
@@ -629,6 +630,7 @@ function _M.spawn_checker(opts)
629630
type = typ,
630631
ssl_verify = ssl_verify,
631632
ssl_reuse_session = ssl_reuse_session,
633+
ssl_server_name = opts.ssl_server_name,
632634
http_req = http_req,
633635
timeout = timeout,
634636
interval = interval,

t/sanity.t

Lines changed: 204 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use Cwd qw(cwd);
99

1010
#repeat_each(2);
1111

12-
plan tests => repeat_each() * (blocks() * 6 - 6);
12+
plan tests => repeat_each() * (blocks() * 6 - 13);
1313

1414
my $pwd = cwd();
1515

@@ -1685,3 +1685,206 @@ Upstream foo.com
16851685
16861686
--- no_error_log
16871687
SSL reused session
1688+
1689+
1690+
1691+
=== TEST 20: SSL health check with certificate created with a different server name should work when ssl_verify is false
1692+
--- http_config eval
1693+
"$::HttpConfig"
1694+
. q{
1695+
lua_ssl_trusted_certificate ../../ssl/foo_bar.crt;
1696+
1697+
upstream foo.com {
1698+
server 127.0.0.1:12355;
1699+
}
1700+
1701+
server {
1702+
listen 12355;
1703+
ssl on;
1704+
ssl_certificate ../../ssl/foo_bar.crt;
1705+
ssl_certificate_key ../../ssl/foo_bar.key;
1706+
location = /status {
1707+
return 200;
1708+
}
1709+
}
1710+
1711+
lua_shared_dict healthcheck 1m;
1712+
init_worker_by_lua_block {
1713+
ngx.shared.healthcheck:flush_all()
1714+
local hc = require "resty.upstream.healthcheck"
1715+
local ok, err = hc.spawn_checker{
1716+
shm = "healthcheck",
1717+
upstream = "foo.com",
1718+
type = "https",
1719+
ssl_verify = false,
1720+
ssl_reuse_session = true,
1721+
http_req = "GET /status HTTP/1.0\r\nHost: localhost\r\n\r\n",
1722+
interval = 100, -- 100ms
1723+
fall = 2,
1724+
valid_statuses = {200},
1725+
}
1726+
if not ok then
1727+
ngx.log(ngx.ERR, "failed to spawn health checker: ", err)
1728+
return
1729+
end
1730+
}
1731+
}
1732+
--- config
1733+
location = /t {
1734+
access_log off;
1735+
content_by_lua_block {
1736+
ngx.sleep(0.52)
1737+
1738+
local hc = require "resty.upstream.healthcheck"
1739+
ngx.print(hc.status_page())
1740+
}
1741+
}
1742+
--- request
1743+
GET /t
1744+
1745+
--- response_body
1746+
Upstream foo.com
1747+
Primary Peers
1748+
127.0.0.1:12355 up
1749+
Backup Peers
1750+
1751+
--- error_log
1752+
SSL reused session
1753+
1754+
--- no_error_log
1755+
certificate host mismatch
1756+
1757+
1758+
1759+
=== TEST 21: SSL health check with certificate created with a different server name should fail when ssl_verify is true
1760+
--- http_config eval
1761+
"$::HttpConfig"
1762+
. q{
1763+
lua_ssl_trusted_certificate ../../ssl/foo_bar.crt;
1764+
1765+
upstream foo.com {
1766+
server 127.0.0.1:12355;
1767+
}
1768+
1769+
server {
1770+
listen 12355;
1771+
ssl on;
1772+
ssl_certificate ../../ssl/foo_bar.crt;
1773+
ssl_certificate_key ../../ssl/foo_bar.key;
1774+
location = /status {
1775+
return 200;
1776+
}
1777+
}
1778+
1779+
lua_shared_dict healthcheck 1m;
1780+
init_worker_by_lua_block {
1781+
ngx.shared.healthcheck:flush_all()
1782+
local hc = require "resty.upstream.healthcheck"
1783+
local ok, err = hc.spawn_checker{
1784+
shm = "healthcheck",
1785+
upstream = "foo.com",
1786+
type = "https",
1787+
ssl_verify = true,
1788+
ssl_reuse_session = true,
1789+
http_req = "GET /status HTTP/1.0\r\nHost: localhost\r\n\r\n",
1790+
interval = 100, -- 100ms
1791+
fall = 2,
1792+
valid_statuses = {200},
1793+
}
1794+
if not ok then
1795+
ngx.log(ngx.ERR, "failed to spawn health checker: ", err)
1796+
return
1797+
end
1798+
}
1799+
}
1800+
--- config
1801+
location = /t {
1802+
access_log off;
1803+
content_by_lua_block {
1804+
ngx.sleep(0.52)
1805+
1806+
local hc = require "resty.upstream.healthcheck"
1807+
ngx.print(hc.status_page())
1808+
}
1809+
}
1810+
--- request
1811+
GET /t
1812+
1813+
--- response_body
1814+
Upstream foo.com
1815+
Primary Peers
1816+
127.0.0.1:12355 DOWN
1817+
Backup Peers
1818+
1819+
--- error_log
1820+
certificate host mismatch
1821+
1822+
1823+
1824+
1825+
=== TEST 22: SSL health check with certificate created with a different server name should work when ssl_verify is true and correct server name is given
1826+
--- http_config eval
1827+
"$::HttpConfig"
1828+
. q{
1829+
lua_ssl_trusted_certificate ../../ssl/foo_bar.crt;
1830+
1831+
upstream foo.com {
1832+
server 127.0.0.1:12355;
1833+
}
1834+
1835+
server {
1836+
listen 12355;
1837+
ssl on;
1838+
ssl_certificate ../../ssl/foo_bar.crt;
1839+
ssl_certificate_key ../../ssl/foo_bar.key;
1840+
location = /status {
1841+
return 200;
1842+
}
1843+
}
1844+
1845+
lua_shared_dict healthcheck 1m;
1846+
init_worker_by_lua_block {
1847+
ngx.shared.healthcheck:flush_all()
1848+
local hc = require "resty.upstream.healthcheck"
1849+
local ok, err = hc.spawn_checker{
1850+
shm = "healthcheck",
1851+
upstream = "foo.com",
1852+
type = "https",
1853+
ssl_verify = true,
1854+
ssl_reuse_session = true,
1855+
ssl_server_name = "foo.bar",
1856+
http_req = "GET /status HTTP/1.0\r\nHost: localhost\r\n\r\n",
1857+
interval = 100, -- 100ms
1858+
fall = 2,
1859+
valid_statuses = {200},
1860+
}
1861+
if not ok then
1862+
ngx.log(ngx.ERR, "failed to spawn health checker: ", err)
1863+
return
1864+
end
1865+
}
1866+
}
1867+
--- config
1868+
location = /t {
1869+
access_log off;
1870+
content_by_lua_block {
1871+
ngx.sleep(0.52)
1872+
1873+
local hc = require "resty.upstream.healthcheck"
1874+
ngx.print(hc.status_page())
1875+
}
1876+
}
1877+
--- request
1878+
GET /t
1879+
1880+
--- response_body
1881+
Upstream foo.com
1882+
Primary Peers
1883+
127.0.0.1:12355 up
1884+
Backup Peers
1885+
1886+
--- error_log
1887+
SSL reused session
1888+
1889+
--- no_error_log
1890+
certificate host mismatch

t/ssl/foo_bar.crt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIID7TCCAtWgAwIBAgIJAICJM4WgN4tdMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV
3+
BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
4+
aWRnaXRzIFB0eSBMdGQxEDAOBgNVBAMTB2Zvby5iYXIwHhcNMTcwMjIyMjIwOTIx
5+
WhcNMjcwMjIwMjIwOTIxWjBXMQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1T
6+
dGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRAwDgYDVQQD
7+
Ewdmb28uYmFyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArI75zE4O
8+
cwwZ0wFz6aC17hgDd+GdhcRxhQFyY+TMCaq1cffOvgeoFdz33vWoWK6bxWlaY6ik
9+
6J1YvYZwtXmhtevVCGGhNAGb/4P/ebexYZt2ZnqLokLeZwzcWhcJdZxhxAMPO4pH
10+
ah+fL8SlOeYh+DZ44lUkVK2LPfywcxAEdXTxTzKaplXtoNyUbTEV8KYVZRejOqZw
11+
I7gamUhih7ETYYbjEAtcPszfftAsFn4BBPqOxfCsDRMo3zgTeMkENpp6mrSDSVXh
12+
ZB3tHrph7ZxZYVHgimswVlHFHuzKGKVSXwMh+IW3nPAJuEE21a4UkZv3/bd30eGc
13+
YLZraclhUzKNvQIDAQABo4G7MIG4MB0GA1UdDgQWBBTzWsRjCS+iM9IFKRkRObEp
14+
MzIMvTCBiAYDVR0jBIGAMH6AFPNaxGMJL6Iz0gUpGRE5sSkzMgy9oVukWTBXMQsw
15+
CQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJu
16+
ZXQgV2lkZ2l0cyBQdHkgTHRkMRAwDgYDVQQDEwdmb28uYmFyggkAgIkzhaA3i10w
17+
DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAQTOtOjA8cRpVO7Pn8Cr7
18+
e0Zw7wb8vM4oLND50KmK1V7xz2FG1Mn6He7ppc7tWAs3KAy0+hjudk8rk4TEYc5G
19+
eVYljDVG3kv05N/PjVpoyYGpOq/ZQZJvK3tMGfz8arHyq4u1GDBZ4Y8v/uJ09Qq4
20+
Zub88DN71MLdE+duv1LH4LrqsCGch0piZC9azP4meJ/HE2xLvRVyo4lSEKJTMnx/
21+
7kXTsGEEuXzJ0HBqLT0jp7nSEZK+SoCD1k9DE9T793gn8OWyhsQgq8B7ve3we6DL
22+
ePTxz0rtiZHu2xKwcEqfMMJZt2xAKKmZQ2F0ADXvuXvln9Bn02z/Z5PB03V770Pc
23+
aA==
24+
-----END CERTIFICATE-----

t/ssl/foo_bar.key

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEpAIBAAKCAQEArI75zE4OcwwZ0wFz6aC17hgDd+GdhcRxhQFyY+TMCaq1cffO
3+
vgeoFdz33vWoWK6bxWlaY6ik6J1YvYZwtXmhtevVCGGhNAGb/4P/ebexYZt2ZnqL
4+
okLeZwzcWhcJdZxhxAMPO4pHah+fL8SlOeYh+DZ44lUkVK2LPfywcxAEdXTxTzKa
5+
plXtoNyUbTEV8KYVZRejOqZwI7gamUhih7ETYYbjEAtcPszfftAsFn4BBPqOxfCs
6+
DRMo3zgTeMkENpp6mrSDSVXhZB3tHrph7ZxZYVHgimswVlHFHuzKGKVSXwMh+IW3
7+
nPAJuEE21a4UkZv3/bd30eGcYLZraclhUzKNvQIDAQABAoIBAQCrOeiHoYDXCk/p
8+
wExLrIw6qRtv7rGHVgmrCGeA1jzc7sbDQzmj+ScCItTXKf6VmRW7CzKFJ4gTxmaT
9+
Ef9vJDWhtlUazv3OBDbOkiWEmxFpoIEZaUp7hUz5Bpr0zl01liqw/LQ1yZ3ZoW0t
10+
Ujz9ue1FRpAnToMRf29m4AIa+u7huLkghgQBieerfDMfVyXo18U4NdwcJMdDUiQC
11+
P77qwkoSnlN7fpVbKCUtKNMDkOzxWt/VEkiIYaPzSphv4dCYBUXkjJ+TewMDmuCO
12+
gBMTgIgXKlz8+vRAPLUAtjNQWS3c1Gc1tp70TZKOVckhXfKQrDN6prCjngFcERN0
13+
9ZB8jZMlAoGBAOXBp95wZBOoR4l37qFUTwdCIOKtIohq1EMpG6grcR9NAiwwzSjs
14+
fTapO6NGDE8EE5tLLZ9sEMNZS4Eg7551emipDc7LGBGcO0bmh5vhSY5TFrmoTNsj
15+
ymNUCMp/EdKgMNIPFTOqMphKu6cv7SCcYQSlk17GznpvkCikBzfEBjaTAoGBAMBE
16+
yRGk69vxFF+HjMPy2wpvrwO4Ada9Sh3ctRIm7Y+3oRO4lN5wH/htSMs7Ehfno0vV
17+
GybSAuMo1GHlzi0knXZi97kwZqvjdyoG1MICyF1kNEszasO9Zl5t1jtrBy69A3rd
18+
DT91tkdvx6yZtyCkwnF5GPC+RPpK3MxVFN5DhgxvAoGACGygXhya3smlzdmS62Fv
19+
AGIhWI5mnL/mBoxkUjc9j5tAQCSN8TkyoiV0ZVk1LFSG74PDKXxJ5Q/KH/L4NkQy
20+
d9HzCqkRuduTpNbhFAsfqlNLmwUbxFE8o4W6SMp9+c4b3CfnbByKfGEJHmk4daCm
21+
QghcLfZ2LbEXhRX2mcnbPHcCgYAuP11uFRF2siKIZ/6AE6aEeCDM8DHhCV8Ol8wm
22+
NZ7m9vCT4c5NQwMtqnvcBrVvcpRg5T3GtLVlFqkfczuIuEn39A5KSU4pAmnjfgkn
23+
MawoarX5cMC5nJFHHXxuhmwP3f88SnepUBMsU8LfzYmzHG55BPvuzJWi7ub1b3G5
24+
lNxlmQKBgQCuoTK8E95zIzfI5xdjhLGuHGOPY6iKUBJ45etcaDpW8xzzk5qPehOn
25+
a6A5C9owcoGUcYhyU3qFZ3Ah7a7++wPQFvrs1ayUHaP+yVLkbcKxi7L1AcsBCOSX
26+
D8N9Z7w4nWjel50x+UOSUCr+hQmy9XrGevQzfkmFWc8I2G+QVH614A==
27+
-----END RSA PRIVATE KEY-----

0 commit comments

Comments
 (0)