Skip to content

Commit 9e907f9

Browse files
ADD-SPdndx
andauthored
feature: add mtls client cert support (#72)
Co-authored-by: Datong Sun <[email protected]>
1 parent 4e17b37 commit 9e907f9

File tree

9 files changed

+314
-4
lines changed

9 files changed

+314
-4
lines changed

README.markdown

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,21 @@ SSL handshake if the `wss://` scheme is used.
394394

395395
Specifies custom headers to be sent in the handshake request. The table is expected to contain strings in the format `{"a-header: a header value", "another-header: another header value"}`.
396396

397+
* `client_cert`
398+
399+
Specifies a client certificate chain cdata object that will be used while TLS handshaking with remote server.
400+
These objects can be created using
401+
[ngx.ssl.parse_pem_cert](https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md#parse_pem_cert)
402+
function provided by lua-resty-core.
403+
Note that specifying the `client_cert` option requires corresponding `client_priv_key` be provided too. See below.
404+
405+
* `client_priv_key`
406+
407+
Specifies a private key corresponds to the `client_cert` option above.
408+
These objects can be created using
409+
[ngx.ssl.parse_pem_priv_key](https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md#parse_pem_priv_key)
410+
function provided by lua-resty-core.
411+
397412
The SSL connection mode (`wss://`) requires at least `ngx_lua` 0.9.11 or OpenResty 1.7.4.1.
398413

399414
[Back to TOC](#table-of-contents)

lib/resty/websocket/client.lua

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ local type = type
2626
local debug = ngx.config.debug
2727
local ngx_log = ngx.log
2828
local ngx_DEBUG = ngx.DEBUG
29+
local assert = assert
2930
local ssl_support = true
3031

3132
if not ngx.config
@@ -98,7 +99,9 @@ function _M.connect(self, uri, opts)
9899
path = "/"
99100
end
100101

101-
local ssl_verify, headers, proto_header, origin_header, sock_opts = false
102+
local ssl_verify, server_name, headers, proto_header, origin_header
103+
local sock_opts = false
104+
local client_cert, client_priv_key
102105

103106
if opts then
104107
local protos = opts.protocols
@@ -122,11 +125,20 @@ function _M.connect(self, uri, opts)
122125
sock_opts = { pool = pool }
123126
end
124127

125-
if opts.ssl_verify then
128+
client_cert = opts.client_cert
129+
client_priv_key = opts.client_priv_key
130+
131+
if client_cert then
132+
assert(client_priv_key,
133+
"client_priv_key must be provided with client_cert")
134+
end
135+
136+
if opts.ssl_verify or opts.server_name then
126137
if not ssl_support then
127138
return nil, "ngx_lua 0.9.11+ required for SSL sockets"
128139
end
129-
ssl_verify = true
140+
ssl_verify = opts.ssl_verify
141+
server_name = opts.server_name or host
130142
end
131143

132144
if opts.headers then
@@ -151,7 +163,13 @@ function _M.connect(self, uri, opts)
151163
if not ssl_support then
152164
return nil, "ngx_lua 0.9.11+ required for SSL sockets"
153165
end
154-
ok, err = sock:sslhandshake(false, host, ssl_verify)
166+
if client_cert then
167+
ok, err = sock:setclientcert(client_cert, client_priv_key)
168+
if not ok then
169+
return nil, "failed to set TLS client certificate: " .. err
170+
end
171+
end
172+
ok, err = sock:sslhandshake(false, server_name, ssl_verify)
155173
if not ok then
156174
return nil, "ssl handshake failed: " .. err
157175
end

t/cert/mtls_ca.crt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDPDCCAiQCE02SO/h/om49Gjo0vAbL7/G0E5cwDQYJKoZIhvcNAQELBQAwWjEL
3+
MAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxEjAQBgNVBAoMCU9wZW5S
4+
ZXN0eTEiMCAGA1UEAwwZT3BlblJlc3R5IFRlc3RpbmcgUm9vdCBDQTAgFw0yMjAz
5+
MjIxMTUxNTJaGA8yMTIyMDIyNjExNTE1MlowWjELMAkGA1UEBhMCQVUxEzARBgNV
6+
BAgMClNvbWUtU3RhdGUxEjAQBgNVBAoMCU9wZW5SZXN0eTEiMCAGA1UEAwwZT3Bl
7+
blJlc3R5IFRlc3RpbmcgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
8+
AQoCggEBAKaitHvQzQf1/pqD9ybzu2c2x6cOfAer4mRBrVJb7ib3UJYz9TEOG9OH
9+
NbfEvTzv7svgW/s2HB/f3HLP9DYKRQe6aTuTS7OrxQqO8qE5aXNeG+KmhJANP0tD
10+
6LsnubtnvKwIh+SDArEjjz5ZIyu/HWgh9Aajb95WCdvwThassJpiMgASukn41zWi
11+
ugqjv9EUM+mn73Klv9gggPQAJzjidqYABzU6NqUKZwPHWLut4fbLt66P335bZ2tI
12+
529mrRnwRDbbhZ6AuQU3TCqUYeLCmK5Cxiw1zHOsXOr7BGY5UvNa0n6t6RfAtETm
13+
XIijMtNhOuCoqpczVe7jwKbAjcOQfa0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA
14+
GS96499Wn8Pyo5FOW3Z+4r5QQSr9f3g+gNY/5yQRdhs4NS3Seoe9fSTyyqaf0j0/
15+
ctYWM08PkC5NIrtjBbpyT1TZDiCu6MbyTMjkpkfXwhLzNrVAEvgafdKwGe22eNeg
16+
CNCb4HglZS8sBPIFf39h2MPwXPAxpnSWUmszu8tul7wNr15ho52TGdOkL7u2GZVX
17+
5tYGr+lK7gatOSAtRKsoxmPrIYe0ny3YGkpLtnzbF6Ejel+eopYi/vQApHsOTy0D
18+
ZV2PZ9Bn4YcrY1LZRRJqzCuXSfX5m0EUTIwpDMx+bv3iEeb5ItyLk5hRzYkRX81X
19+
vZ6a4jis7U92TLmcyyZYhg==
20+
-----END CERTIFICATE-----

t/cert/mtls_ca.key

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCmorR70M0H9f6a
3+
g/cm87tnNsenDnwHq+JkQa1SW+4m91CWM/UxDhvThzW3xL087+7L4Fv7Nhwf39xy
4+
z/Q2CkUHumk7k0uzq8UKjvKhOWlzXhvipoSQDT9LQ+i7J7m7Z7ysCIfkgwKxI48+
5+
WSMrvx1oIfQGo2/eVgnb8E4WrLCaYjIAErpJ+Nc1oroKo7/RFDPpp+9ypb/YIID0
6+
ACc44namAAc1OjalCmcDx1i7reH2y7euj99+W2drSOdvZq0Z8EQ224WegLkFN0wq
7+
lGHiwpiuQsYsNcxzrFzq+wRmOVLzWtJ+rekXwLRE5lyIozLTYTrgqKqXM1Xu48Cm
8+
wI3DkH2tAgMBAAECggEAGLsUGz4pd9GACHGmeC77NL3SEs6ZBNBzSJrgvNTs+vaA
9+
jNJIRRAJfDLYe54k0crwP2zcaeOld+uS/a00WuLaTOPTI2bgeNl45HDDvL7XEiq4
10+
68H38aMtrh91hnVGYPRr8YJQnM7+0shqxX+YMzFpjV9gpq2R+Eb/rpczF7Vofnjw
11+
A/MHyBOT8XIb2E4YiAjN7T3rPnDVNp27pZRIp02P3ZI4F7IQSLhEzY54eFQe23+7
12+
cRjw8oFpHxGn4fGLISUri9z38U32Q7HCC8PvTy2zekx3Ifdrq0S/I7mAqXM+XeHZ
13+
o/fdJxiwvAPnUufFR79lX6zvUo2bKtkkJniDUpkMtwKBgQDXMbN96BF2IcDIsHPl
14+
fGnYA+e6OTF++cDt4Ge64oL8FaGY6/+aJ3X9NvPMNhf3WRqTomNkuGiHjSEkTfR/
15+
BgQ3Z7x2v055+dAdLPUh/+flEcv5aPqZqBzYYNrhUC8jjte2zt5VN4SmlL6wCDWt
16+
A5UPnMGg5uExBScAIPu/8quCHwKBgQDGO8uq5YvWmFy3m9tD4g9cxyh2EStovptQ
17+
S3zH/nWBCP2Rx9YixFbZvjYujVWcuCC9D/5CwLpcyEa3NIRF4RByAgzB/AGABi2Q
18+
JlpAByYrbqtFMN17qBwpBrTwdgs+JD8cN8rPgSviZlL8xOIdX8Mw1HuCFtasBvUW
19+
95Wrqb8+swKBgQCTaxjrR++uXbETys2aiIB52zMD/+pIchAY5YIqJMJWrvrlJ8cS
20+
c7YAoYSigOwqJoBuYvB0L2Bse+IYXM8Btb1tt0MElknMhbZsRkAn6oeSBX8WfTQv
21+
z1rzYGaRs7yXP2PHeDAXcNEOzRdUwEsFG08iQuDiuUfLrRvqmq3b8QJNQQKBgHaJ
22+
iRdPHhibkU3F6A6mnhMXkG1RhQikedFA4oPg+DjJvH8w5S5zA5A++r1JjHkjbYhA
23+
iQU3o/kZVZf10mbK13+lFCXnYKpCh3pcRLlmzP9JtSaxuq9X7kbmGMp1e/GT0R05
24+
i5AbqLdAAr3dqWxxOBH57UT0DThfDK3ILPqyjYabAoGAXgtdrmgFOfywNRuq0Qox
25+
Eh+EYY4SnrZUFUFraVV7zZsRlJXTE8kxBGh73j0sX409Wbmy1CEoFw91f9FBIZzJ
26+
CjaF4Xod77FVnanL+rOUMHEdaYo2LzATRFZJzB/3D60hkHJjP3fCvY+Xln7Lt35B
27+
HDQslqp0wC9aeznXl+eMQYY=
28+
-----END PRIVATE KEY-----

t/cert/mtls_client.crt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDFzCCAf8CFElxMXCkerhj2Kjjh+Hm3cucOlILMA0GCSqGSIb3DQEBCwUAMFox
3+
CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMRIwEAYDVQQKDAlPcGVu
4+
UmVzdHkxIjAgBgNVBAMMGU9wZW5SZXN0eSBUZXN0aW5nIFJvb3QgQ0EwHhcNMjIw
5+
MzIyMTIwMjU5WhcNMzIwMzE5MTIwMjU5WjA2MQswCQYDVQQGEwJBVTETMBEGA1UE
6+
CAwKU29tZS1TdGF0ZTESMBAGA1UECgwJT3BlblJlc3R5MIIBIjANBgkqhkiG9w0B
7+
AQEFAAOCAQ8AMIIBCgKCAQEAyqq9ZO3Zx3nVly5ZHao5HecjhafNdHIM735y5sim
8+
WINjpqBr4b0hwdrvUBfNLVpf5qLXf8NDH9Rb7gS9/gs+bmVrqDVKsvYjBpbvA/v1
9+
YdAk9PlmITxSRaYQyIu0EQAw5nZq9FMiAvGynEYKXir4vSqou4Av7FgAOBQQE3Mm
10+
G0XjAgFbTw2dQRH0M8f5a7Tu/BdfEkNRQb7n++m7JZoTIBfESUkhaN0DR33JSqdh
11+
ysrvH3KZq5DkVsX131kM6Y3lfWARdpFNANo0r3FSB31F46HttnjfNR5+GurA2wOE
12+
ymb7cDGpuWonjhT9ohJtN2fWDUTIf4LRuLYLjzmq6O5SnQIDAQABMA0GCSqGSIb3
13+
DQEBCwUAA4IBAQAdEMkoOA1bovMjzp3HpKQcygpalSa+Ipyqe5UJy/UsRaqupxcq
14+
bDjfHkqcjcqtuDnxKMksxFFPPPcoXEwBzTcQExfPchqRkX9Fa+SRsLri5kLVGtBm
15+
DZTXqvbH51MQKDTs2CfKtZQn8WxzU2pQyd4ae3Qwc1S/I+/5HsX0xmv6BwMXzeqj
16+
VjO4vk6wnbgKMqMUEAsHjcWqmc6yBBmh2EN2X1wMfpuH8iJQWAv4QBPXPUGnV2Jh
17+
RoPDko/Fyx4yLv3T7BiHDJ2Sf0xtKtxP6eKMo8IGeGod0cueSRQ7w7hFSNd7+4SW
18+
6QOdJ347xcyMyAwpCnqsmSxspLkBtfYOnvn8
19+
-----END CERTIFICATE-----

t/cert/mtls_client.key

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDKqr1k7dnHedWX
3+
Llkdqjkd5yOFp810cgzvfnLmyKZYg2OmoGvhvSHB2u9QF80tWl/motd/w0Mf1Fvu
4+
BL3+Cz5uZWuoNUqy9iMGlu8D+/Vh0CT0+WYhPFJFphDIi7QRADDmdmr0UyIC8bKc
5+
RgpeKvi9Kqi7gC/sWAA4FBATcyYbReMCAVtPDZ1BEfQzx/lrtO78F18SQ1FBvuf7
6+
6bslmhMgF8RJSSFo3QNHfclKp2HKyu8fcpmrkORWxfXfWQzpjeV9YBF2kU0A2jSv
7+
cVIHfUXjoe22eN81Hn4a6sDbA4TKZvtwMam5aieOFP2iEm03Z9YNRMh/gtG4tguP
8+
Oaro7lKdAgMBAAECggEAKKMlyNgcg+/9EQxdGCKqw0E2kTU9cCzyRQ9w0K/JExR9
9+
Zcri9ueqnildNQ0gughWFHPwjBDGI9q7+DUBN7Bfe1lgxeCxssLB8S9Qi9b4s/09
10+
e9WKUf27bXXIBb5lg8crBvsVpRoKRtbZ/pXYvFsXdy7XmIkyksxudtAnDQ9Yw7zb
11+
R3tSeJScx267XObPunep5kvm27iCv2BQCGhRppIoZeh6VxEJIKKsyGoG12XrFyQZ
12+
DTQ3Eh3T9JwolAZu3fyV5l1QxSlCrg0uIchNFODmN9mqQwjjsYoz4nnv17r/tmJw
13+
nuz56M3P638IXTTEwDkr5AqylT9yUT50V2xIz5lGLQKBgQDbS+teT2T/Zi2Bd6XE
14+
q4WzXaC1VLzhSaGGceZjPGtGJLV7n4qCEJ2y1lN43L456AW5Ef8hIWwM9lE6UbPL
15+
makfEccztjZRk/8G93IcEX0vQZyxBlLgIkCb9sCZdhqQqwX4tfe/m9GhPXMT6lD0
16+
TLD/7fCyMSgt9LpEN1rCb9XUrwKBgQDslkz28STIFslapN6xK6dTgOUtAsDkCg48
17+
fd6Z4C+yi4HCpH81PPBUfgvDUfDSYetU7I/ZboWVJvwaPzb5pxnw489uDrUauaIx
18+
a71jGE6JXIixWKMC5zE7/nPxFmyPBzM175ezBw/K9cYhgbt5F6ORRbbOA1oBW767
19+
tyjfeZ64cwKBgQC8F/4lwkuKlIVrishwS/49vozde3UWdyVIP+GwNF5+p3XSNyGC
20+
NeZNQnAONqgi2tQtzTXboOMgqxU4xGNGuuHIeGM4A43LovkXbJ4/XPDW25weaqIj
21+
BL4OCDNibV6Tv1072jhJ7Mh9WEugRVZydGVM3zWYYXlpEYPChwgdxfbOmQKBgBjr
22+
b+nm1n/43nacvRQeS/6gqgMGsjiS0pMOkv7UPVHqHd3Zo8iAxbOwnx6Qp/QQ+k+0
23+
pyY43Psr4wwEso6zSik0ZanrBKpu+SWJeqZQbh1L0N4VPv5USbxO/flb6k1abct1
24+
lB34VXKEVr06w/tqQQFRPYMPmVBhUILHNRfs4In/AoGAWRYRN1ktIQvdrWl9arNG
25+
J1a2MY3Ek1RTpBRx5lRg5JsjCgnyDQB6LtXgmir3n3c1dinA6Ct2dyg++K4N5ntn
26+
2PEa6MXIWjvRvbcaLnS+21iGch4FWS/Xwyd7vj+4nU5VXKPeLjagM5uCm1PTOK3f
27+
zAKenQxYOMxVdosUPNB/MMI=
28+
-----END PRIVATE KEY-----

t/cert/mtls_server.crt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDLDCCAhQCFACm5o1DAUE5rcxAm4J0zmlxjt0CMA0GCSqGSIb3DQEBCwUAMFox
3+
CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMRIwEAYDVQQKDAlPcGVu
4+
UmVzdHkxIjAgBgNVBAMMGU9wZW5SZXN0eSBUZXN0aW5nIFJvb3QgQ0EwIBcNMjIw
5+
MzIyMTIwMTMzWhgPMjEyMjAyMjYxMjAxMzNaMEkxCzAJBgNVBAYTAkFVMRMwEQYD
6+
VQQIDApTb21lLVN0YXRlMRIwEAYDVQQKDAlPcGVuUmVzdHkxETAPBgNVBAMMCHRl
7+
c3QuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuj3XwuffQXHa
8+
9+BNlKuYC8itkl7ydQEe3JDm0/49twXSMO9/U0/wBaHLsLo4HS95HZ9Ed/jXzAph
9+
eJxn3MZ5spbDKJzqv0kqzLrhEtOW0GNLVoqnjC4Z7My/punI5v2wvqULgHmFgxAT
10+
oa0plOfAEZPpjIjwA6ottZmHYNMsT5fC1E3wq4hqDFOgu4INAt96VlOaBKF27XHt
11+
//omwpaueubfxmDwJ8Mh6AWxj0tdxNWwuxGURsBFarLPRaeIkTrCu7vMEPWLuSpC
12+
gBDmcHsOXEvpX0w1EExcawzd40xJ3hoCvdUaH9Jrz+f2DCZNKJgCt7svUvgygt4v
13+
gLuExRxYVwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCRqRbPStilYE3CVff9NEGR
14+
j+j0XV0xQoOEDHMgoemzR+MMysnlUSA0d+5LcHIVq9Iz8WvsIX/QlCvKTlwJWiF1
15+
u0ZHDqgyfk5aNUTH1Hi2mMNg/0ssZcLmnHHYxBM65tBp1iNsV54isRzjko5tRoBZ
16+
e9x2/r/+8Pm9hk6nnPkTiPxeMkkKQAMk5mremGT7jFd3xO5sDkdZL7Ga8Kt70s1+
17+
XROKySFEC+ngvP5YNWZ/zI43lUS0E4wo6DIKrHkQkv7noq4ewoiuuxoB1fmKXu+c
18+
WcxJaAF2O5pV0Y94KRTG+bT3afW7RMHnfkYf4VENMKABxZXgmmg12g3mtYei6rdR
19+
-----END CERTIFICATE-----

t/cert/mtls_server.key

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC6PdfC599Bcdr3
3+
4E2Uq5gLyK2SXvJ1AR7ckObT/j23BdIw739TT/AFocuwujgdL3kdn0R3+NfMCmF4
4+
nGfcxnmylsMonOq/SSrMuuES05bQY0tWiqeMLhnszL+m6cjm/bC+pQuAeYWDEBOh
5+
rSmU58ARk+mMiPADqi21mYdg0yxPl8LUTfCriGoMU6C7gg0C33pWU5oEoXbtce3/
6+
+ibClq565t/GYPAnwyHoBbGPS13E1bC7EZRGwEVqss9Fp4iROsK7u8wQ9Yu5KkKA
7+
EOZwew5cS+lfTDUQTFxrDN3jTEneGgK91Rof0mvP5/YMJk0omAK3uy9S+DKC3i+A
8+
u4TFHFhXAgMBAAECggEAE+5JWFDjKghKtCs7cjUY3O35cUga712S1WzmXvp+1UbY
9+
syb2O866s4eYmk2bcrghYIOqWqJ1SZ80xikKzmwpGu0abo64aockfuti6dZd9egi
10+
aF0HSC+o05gnzG+JcfrlPsm/3NxkZt3CFBPJdueEPP1UyZbgBKxiHuSSwdBnlg7L
11+
Zu64iXqO+juz9GppkwuakJa/3e6mk0el5B6JY+Gk8b0sPrd9z7FrXyq7DffaQ2ON
12+
18I+r/dDyxVPV+0tAU+64YFtWjKzoIGhrPenOdk7s+DPiIuXnEuun65Q/w/hVWKy
13+
Wm64lstNoxU4RShxYGV3MznKgJ1XJyT9YzwqjqW20QKBgQDTa8lVIomHxSIlfMH+
14+
lLRsoFoYIBYUwjcEy9jxh2llJHTPX0CKphpH/ByqwzYn+iVHrCfxYwSkWnN/KsGg
15+
Ix7b+BemhbRIUukjOU8QI5/p5LgrmmC1orpZ54o8cVl9K77I/hBhGhUZzHuzTLH9
16+
ViPUhDrARNtXUKBV3Y+TmfhtpwKBgQDhgudculLDzq20sYOqb/NB+SlcowZDkLaN
17+
TXIhYKmGK8DaJeiojVmIOqOl8+P/j4cQg3m54KZ8T/4bQt2ynBwmYH4+2lUbpGf9
18+
N6I9CEWmjX7ZARZYI4RvM1aDPrSbC6xb0W6nC4wQkjhck6ngNTHkHYdE+Q6vHy7P
19+
gAmVfBb10QKBgQCe8ATnD5O8kaJd9DASptAMaW/Rey2eZXLfFC//QwEknAeEbeMj
20+
WEOhohIa/a4U16R3ASD2Aq5Wr/jrvMTbEgv86cE92n3xcQL7C/Y399AcEWmyvde+
21+
NJtLQxlU3xGbW+uNRhIiLW13e5Xy8NFN1hgRh2ZzbFBIj8A5TNrG55UvOQKBgQCM
22+
rI4K6CgNAXaWi02pGmDSvM0yfne/2hwmlTMm4xedHNoWuyMhUduSAZJoSXXmy+/j
23+
O0DJ1PvF/Fh1RQbrDjr5LaRTLPt+XNaJvRS1od1hAk8oq2b24GESxSGoiYs8VNHW
24+
DRVLmwZqp+wExBBqToSq2kixm/OvBnK6+hIAcAIaoQKBgG0kwGYFumhYNOO7qVjL
25+
AnfXbml94n7QGc8hWNs3aq6wKH0Oc3mSzMlsClnV0bVUnyF5fxTDwtZ4g1hRio4A
26+
+h321+H+7SxqrK/P5S9bhhyPMM0wByRU/Wa6pRQ6+NvFFY0fU3faVd3j2rcBEm41
27+
6H6KpGxP868KXvVcot92emgZ
28+
-----END PRIVATE KEY-----

t/cs.t

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,15 @@ check_accum_error_log();
2222
no_long_string();
2323
#no_diff();
2424

25+
sub read_file {
26+
my $infile = shift;
27+
open my $in, $infile
28+
or die "cannot open $infile for reading: $!";
29+
my $cert = do { local $/; <$in> };
30+
close $in;
31+
$cert;
32+
}
33+
2534
run_tests();
2635

2736
__DATA__
@@ -2056,3 +2065,129 @@ GET /c
20562065
failed to receive: failed to receive the first 2 bytes: closed
20572066
--- error_log
20582067
failed to send close: bad status code
2068+
2069+
2070+
2071+
=== TEST 29: mutual TLS with client certs
2072+
--- no_check_leak
2073+
--- http_config eval: $::HttpConfig
2074+
--- config
2075+
listen $TEST_NGINX_RAND_PORT_1 ssl;
2076+
server_name test.com;
2077+
ssl_certificate ../../cert/mtls_server.crt;
2078+
ssl_certificate_key ../../cert/mtls_server.key;
2079+
ssl_client_certificate ../../cert/mtls_ca.crt;
2080+
ssl_verify_client on;
2081+
server_tokens off;
2082+
2083+
resolver 127.0.0.1:1953 ipv6=off;
2084+
resolver_timeout 1s;
2085+
2086+
lua_ssl_trusted_certificate ../../cert/mtls_ca.crt;
2087+
lua_ssl_verify_depth 2;
2088+
2089+
location = /c {
2090+
content_by_lua_block {
2091+
local ssl = require "ngx.ssl"
2092+
local f = assert(io.open('t/cert/mtls_client.crt'))
2093+
local cert_data = f:read("*a")
2094+
f:close()
2095+
2096+
f = assert(io.open('t/cert/mtls_client.key'))
2097+
local key_data = f:read("*a")
2098+
f:close()
2099+
2100+
local chain = assert(ssl.parse_pem_cert(cert_data))
2101+
local priv = assert(ssl.parse_pem_priv_key(key_data))
2102+
2103+
local client = require "resty.websocket.client"
2104+
local wb, err = client:new()
2105+
2106+
local uri = "wss://test.com:$TEST_NGINX_RAND_PORT_1/s"
2107+
local ok, err = wb:connect(uri, {ssl_verify = true, client_cert = chain, client_priv_key = priv})
2108+
if not ok then
2109+
ngx.say("failed to connect: " .. err)
2110+
return
2111+
end
2112+
2113+
local data = "hello"
2114+
local bytes, err = wb:send_text(data)
2115+
if not bytes then
2116+
ngx.say("failed to send frame: ", err)
2117+
return
2118+
end
2119+
2120+
local typ
2121+
data, typ, err = wb:recv_frame()
2122+
if not data then
2123+
ngx.say("failed to receive 2nd frame: ", err)
2124+
return
2125+
end
2126+
2127+
ngx.say("received: ", data, " (", typ, ")")
2128+
2129+
local ok, err = wb:close()
2130+
if not ok then
2131+
ngx.say("failed to close conn: ", err)
2132+
return
2133+
end
2134+
}
2135+
}
2136+
2137+
location = /s {
2138+
content_by_lua '
2139+
local server = require "resty.websocket.server"
2140+
local wb, err = server:new()
2141+
if not wb then
2142+
ngx.log(ngx.ERR, "failed to new websocket: ", err)
2143+
return ngx.exit(444)
2144+
end
2145+
2146+
local data, typ, err = wb:recv_frame()
2147+
if not data then
2148+
-- ngx.log(ngx.ERR, "failed to receive a frame: ", err)
2149+
return ngx.exit(444)
2150+
end
2151+
2152+
-- send it back!
2153+
local bytes, err = wb:send_text(data)
2154+
if not bytes then
2155+
ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)
2156+
return ngx.exit(444)
2157+
end
2158+
';
2159+
}
2160+
--- udp_listen: 1953
2161+
--- udp_reply eval
2162+
sub {
2163+
# Get DNS request ID from passed UDP datagram
2164+
my $dns_id = unpack("n", shift);
2165+
# Set name and encode it
2166+
my $name = "test.com";
2167+
$name =~ s/([^.]+)\.?/chr(length($1)) . $1/ge;
2168+
$name .= "\0";
2169+
my $s = '';
2170+
$s .= pack("n", $dns_id);
2171+
# DNS response flags, hardcoded
2172+
my $flags = (1 << 15) + (0 << 11) + (0 << 10) + (0 << 9) + (1 << 8) + (1 << 7) + 0;
2173+
$flags = pack("n", $flags);
2174+
$s .= $flags;
2175+
$s .= pack("nnnn", 1, 1, 0, 0);
2176+
$s .= $name;
2177+
$s .= pack("nn", 1, 1);
2178+
# Set response address and pack it
2179+
my @addr = split /\./, "127.0.0.1";
2180+
my $data = pack("CCCC", @addr);
2181+
$s .= $name. pack("nnNn", 1, 1, 1, 4) . $data;
2182+
return $s;
2183+
}
2184+
--- request
2185+
GET /c
2186+
--- response_body
2187+
received: hello (text)
2188+
2189+
--- no_error_log
2190+
[error]
2191+
[warn]
2192+
2193+
--- timeout: 10

0 commit comments

Comments
 (0)