@@ -1294,4 +1294,90 @@ ngx_http_lua_ffi_set_priv_key(ngx_http_request_t *r,
1294
1294
}
1295
1295
1296
1296
1297
+ static int
1298
+ ngx_ssl_verify_callback (int ok , X509_STORE_CTX * x509_store )
1299
+ {
1300
+ /*
1301
+ * we never terminate handshake here and user can later use
1302
+ * $ssl_client_verify to check verification result.
1303
+ *
1304
+ * this is consistent with Nginx behavior.
1305
+ */
1306
+ return 1 ;
1307
+ }
1308
+
1309
+
1310
+ int
1311
+ ngx_http_lua_ffi_ssl_verify_client (ngx_http_request_t * r ,
1312
+ int depth ,
1313
+ void * cdata , char * * err )
1314
+ {
1315
+ ngx_ssl_conn_t * ssl_conn ;
1316
+ STACK_OF (X509 ) * chain = cdata ;
1317
+ STACK_OF (X509_NAME ) * name_chain = NULL ;
1318
+ X509 * x509 = NULL ;
1319
+ X509_NAME * subject = NULL ;
1320
+ #ifdef OPENSSL_IS_BORINGSSL
1321
+ size_t i ;
1322
+ #else
1323
+ int i ;
1324
+ #endif
1325
+
1326
+ if (r -> connection == NULL || r -> connection -> ssl == NULL ) {
1327
+ * err = "bad request" ;
1328
+ return NGX_ERROR ;
1329
+ }
1330
+
1331
+ ssl_conn = r -> connection -> ssl -> connection ;
1332
+ if (ssl_conn == NULL ) {
1333
+ * err = "bad ssl conn" ;
1334
+ return NGX_ERROR ;
1335
+ }
1336
+
1337
+ SSL_set_verify (ssl_conn , SSL_VERIFY_PEER , ngx_ssl_verify_callback );
1338
+
1339
+ SSL_set_verify_depth (ssl_conn , depth );
1340
+
1341
+ if (chain != NULL ) {
1342
+ /* construct name chain */
1343
+
1344
+ name_chain = sk_X509_NAME_new_null ();
1345
+ if (name_chain == NULL ) {
1346
+ * err = "sk_X509_NAME_new_null() failed" ;
1347
+ return NGX_ERROR ;
1348
+ }
1349
+
1350
+ for (i = 0 ; i < sk_X509_num (chain ); i ++ ) {
1351
+ x509 = sk_X509_value (chain , i );
1352
+ if (x509 == NULL ) {
1353
+ * err = "sk_X509_value() failed" ;
1354
+ goto failed ;
1355
+ }
1356
+
1357
+ if ((subject = X509_NAME_dup (
1358
+ X509_get_subject_name (x509 ))) == NULL ) {
1359
+ * err = "X509_get_subject_name() failed" ;
1360
+ goto failed ;
1361
+ }
1362
+
1363
+ if (!sk_X509_NAME_push (name_chain , subject )) {
1364
+ * err = "sk_X509_NAME_push() failed" ;
1365
+ X509_NAME_free (subject );
1366
+ goto failed ;
1367
+ }
1368
+ }
1369
+
1370
+ SSL_set_client_CA_list (ssl_conn , name_chain );
1371
+ }
1372
+
1373
+ return NGX_OK ;
1374
+
1375
+ failed :
1376
+
1377
+ sk_X509_NAME_free (name_chain );
1378
+
1379
+ return NGX_ERROR ;
1380
+ }
1381
+
1382
+
1297
1383
#endif /* NGX_HTTP_SSL */
0 commit comments