@@ -10,7 +10,7 @@ my $openssl_version = eval { `$NginxBinary -V 2>&1` };
10
10
if ($openssl_version =~ m / built with OpenSSL (0|1\. 0\. (?:0|1[^\d ]|2[a-d]).*)/ ) {
11
11
plan(skip_all => " too old OpenSSL, need 1.0.2e, was $1 " );
12
12
} else {
13
- plan tests => repeat_each() * (blocks() * 5 + 1);
13
+ plan tests => repeat_each() * (blocks() * 5 - 1);
14
14
}
15
15
16
16
$ENV {TEST_NGINX_HTML_DIR } ||= html_dir();
@@ -67,7 +67,7 @@ ffi.cdef[[
67
67
68
68
void ngx_stream_lua_ffi_free_priv_key(void *cdata);
69
69
70
- int ngx_stream_lua_ffi_ssl_verify_client(void *r, void *cdata, int depth, char **err);
70
+ int ngx_stream_lua_ffi_ssl_verify_client(void *r, void *cdata, void *cdata, int depth, char **err);
71
71
72
72
int ngx_stream_lua_ffi_ssl_client_random(ngx_stream_lua_request_t *r,
73
73
unsigned char *out, size_t *outlen, char **err);
@@ -722,7 +722,7 @@ lua ssl server name: "test.com"
722
722
return
723
723
end
724
724
725
- local rc = ffi.C.ngx_stream_lua_ffi_ssl_verify_client(r, cert, -1, errmsg)
725
+ local rc = ffi.C.ngx_stream_lua_ffi_ssl_verify_client(r, cert, nil, -1, errmsg)
726
726
if rc ~= 0 then
727
727
ngx.log(ngx.ERR, "failed to set cdata cert: ",
728
728
ffi.string(errmsg[0]))
@@ -778,7 +778,7 @@ client certificate subject: emailAddress=agentzh@gmail.com,CN=test.com
778
778
return
779
779
end
780
780
781
- local rc = ffi.C.ngx_stream_lua_ffi_ssl_verify_client(r, nil, -1, errmsg)
781
+ local rc = ffi.C.ngx_stream_lua_ffi_ssl_verify_client(r, nil, nil, -1, errmsg)
782
782
if rc ~= 0 then
783
783
ngx.log(ngx.ERR, "failed to set cdata cert: ",
784
784
ffi.string(errmsg[0]))
@@ -843,7 +843,7 @@ client certificate subject: emailAddress=agentzh@gmail.com,CN=test.com
843
843
return
844
844
end
845
845
846
- local rc = ffi.C.ngx_stream_lua_ffi_ssl_verify_client(r, cert, 1, errmsg)
846
+ local rc = ffi.C.ngx_stream_lua_ffi_ssl_verify_client(r, cert, nil, 1, errmsg)
847
847
if rc ~= 0 then
848
848
ngx.log(ngx.ERR, "failed to set cdata cert: ",
849
849
ffi.string(errmsg[0]))
@@ -1236,3 +1236,141 @@ lua ssl server name: "test.com"
1236
1236
--- no_error_log
1237
1237
[error]
1238
1238
[alert]
1239
+
1240
+
1241
+
1242
+ === TEST 12: verify client, but server don't trust root ca
1243
+ --- stream_config
1244
+ server {
1245
+ listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
1246
+
1247
+ ssl_certificate ../../cert/mtls_server.crt;
1248
+ ssl_certificate_key ../../cert/mtls_server.key;
1249
+
1250
+ ssl_certificate_by_lua_block {
1251
+ collectgarbage()
1252
+
1253
+ local ffi = require "ffi"
1254
+ require "defines"
1255
+
1256
+ local errmsg = ffi.new("char *[1]")
1257
+
1258
+ local r = require "resty.core.base" .get_request()
1259
+ if not r then
1260
+ ngx.log(ngx.ERR, "no request found")
1261
+ return
1262
+ end
1263
+
1264
+ local f = assert(io.open("t/cert/mtls_server.crt", "rb"))
1265
+ local cert_data = f:read("*all")
1266
+ f:close()
1267
+
1268
+ local client_certs = ffi.C.ngx_stream_lua_ffi_parse_pem_cert(cert_data, #cert_data, errmsg)
1269
+ if not client_certs then
1270
+ ngx.log(ngx.ERR, "failed to parse PEM client certs: ",
1271
+ ffi.string(errmsg[0]))
1272
+ return
1273
+ end
1274
+
1275
+ local rc = ffi.C.ngx_stream_lua_ffi_ssl_verify_client(r, client_certs, nil, 1, errmsg)
1276
+ if rc ~= 0 then
1277
+ ngx.log(ngx.ERR, "failed to set cdata cert: ",
1278
+ ffi.string(errmsg[0]))
1279
+ return
1280
+ end
1281
+
1282
+ ffi.C.ngx_stream_lua_ffi_free_cert(client_certs)
1283
+ }
1284
+
1285
+ content_by_lua_block {
1286
+ ngx.say(ngx.var.ssl_client_verify)
1287
+ }
1288
+ }
1289
+ --- stream_server_config
1290
+ proxy_pass unix:$TEST_NGINX_HTML_DIR/nginx.sock;
1291
+ proxy_ssl on;
1292
+ proxy_ssl_certificate ../../cert/mtls_client.crt;
1293
+ proxy_ssl_certificate_key ../../cert/mtls_client.key;
1294
+ proxy_ssl_session_reuse off;
1295
+
1296
+ --- stream_response
1297
+ FAILED:unable to verify the first certificate
1298
+
1299
+ --- no_error_log
1300
+ [error]
1301
+ [alert]
1302
+
1303
+
1304
+
1305
+ === TEST 13: verify client and server trust root ca
1306
+ --- stream_config
1307
+ server {
1308
+ listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
1309
+
1310
+ ssl_certificate ../../cert/mtls_server.crt;
1311
+ ssl_certificate_key ../../cert/mtls_server.key;
1312
+
1313
+ ssl_certificate_by_lua_block {
1314
+ collectgarbage()
1315
+
1316
+ local ffi = require "ffi"
1317
+ require "defines"
1318
+
1319
+ local errmsg = ffi.new("char *[1]")
1320
+
1321
+ local r = require "resty.core.base" .get_request()
1322
+ if not r then
1323
+ ngx.log(ngx.ERR, "no request found")
1324
+ return
1325
+ end
1326
+
1327
+ local f = assert(io.open("t/cert/mtls_server.crt", "rb"))
1328
+ local cert_data = f:read("*all")
1329
+ f:close()
1330
+
1331
+ local client_certs = ffi.C.ngx_stream_lua_ffi_parse_pem_cert(cert_data, #cert_data, errmsg)
1332
+ if not client_certs then
1333
+ ngx.log(ngx.ERR, "failed to parse PEM client certs: ",
1334
+ ffi.string(errmsg[0]))
1335
+ return
1336
+ end
1337
+
1338
+ local f = assert(io.open("t/cert/mtls_ca.crt", "rb"))
1339
+ local cert_data = f:read("*all")
1340
+ f:close()
1341
+
1342
+ local trusted_certs = ffi.C.ngx_stream_lua_ffi_parse_pem_cert(cert_data, #cert_data, errmsg)
1343
+ if not trusted_certs then
1344
+ ngx.log(ngx.ERR, "failed to parse PEM trusted certs: ",
1345
+ ffi.string(errmsg[0]))
1346
+ return
1347
+ end
1348
+
1349
+ local rc = ffi.C.ngx_stream_lua_ffi_ssl_verify_client(r, client_certs, trusted_certs, 1, errmsg)
1350
+ if rc ~= 0 then
1351
+ ngx.log(ngx.ERR, "failed to set cdata cert: ",
1352
+ ffi.string(errmsg[0]))
1353
+ return
1354
+ end
1355
+
1356
+ ffi.C.ngx_stream_lua_ffi_free_cert(client_certs)
1357
+ ffi.C.ngx_stream_lua_ffi_free_cert(trusted_certs)
1358
+ }
1359
+
1360
+ content_by_lua_block {
1361
+ ngx.say(ngx.var.ssl_client_verify)
1362
+ }
1363
+ }
1364
+ --- stream_server_config
1365
+ proxy_pass unix:$TEST_NGINX_HTML_DIR/nginx.sock;
1366
+ proxy_ssl on;
1367
+ proxy_ssl_certificate ../../cert/mtls_client.crt;
1368
+ proxy_ssl_certificate_key ../../cert/mtls_client.key;
1369
+ proxy_ssl_session_reuse off;
1370
+
1371
+ --- stream_response
1372
+ SUCCESS
1373
+
1374
+ --- no_error_log
1375
+ [error]
1376
+ [alert]
0 commit comments