@@ -1317,4 +1317,90 @@ ngx_stream_lua_ffi_set_priv_key(ngx_stream_lua_request_t *r,
1317
1317
}
1318
1318
1319
1319
1320
+ static int
1321
+ ngx_ssl_verify_callback (int ok , X509_STORE_CTX * x509_store )
1322
+ {
1323
+ /*
1324
+ * we never terminate handshake here and user can later use
1325
+ * $ssl_client_verify to check verification result.
1326
+ *
1327
+ * this is consistent with Nginx behavior.
1328
+ */
1329
+ return 1 ;
1330
+ }
1331
+
1332
+
1333
+ int
1334
+ ngx_stream_lua_ffi_ssl_verify_client (ngx_stream_lua_request_t * r ,
1335
+ int depth ,
1336
+ void * cdata , char * * err )
1337
+ {
1338
+ ngx_ssl_conn_t * ssl_conn ;
1339
+ STACK_OF (X509 ) * chain = cdata ;
1340
+ STACK_OF (X509_NAME ) * name_chain = NULL ;
1341
+ X509 * x509 = NULL ;
1342
+ X509_NAME * subject = NULL ;
1343
+ #ifdef OPENSSL_IS_BORINGSSL
1344
+ size_t i ;
1345
+ #else
1346
+ int i ;
1347
+ #endif
1348
+
1349
+ if (r -> connection == NULL || r -> connection -> ssl == NULL ) {
1350
+ * err = "bad request" ;
1351
+ return NGX_ERROR ;
1352
+ }
1353
+
1354
+ ssl_conn = r -> connection -> ssl -> connection ;
1355
+ if (ssl_conn == NULL ) {
1356
+ * err = "bad ssl conn" ;
1357
+ return NGX_ERROR ;
1358
+ }
1359
+
1360
+ SSL_set_verify (ssl_conn , SSL_VERIFY_PEER , ngx_ssl_verify_callback );
1361
+
1362
+ SSL_set_verify_depth (ssl_conn , depth );
1363
+
1364
+ if (chain != NULL ) {
1365
+ /* construct name chain */
1366
+
1367
+ name_chain = sk_X509_NAME_new_null ();
1368
+ if (name_chain == NULL ) {
1369
+ * err = "sk_X509_NAME_new_null() failed" ;
1370
+ return NGX_ERROR ;
1371
+ }
1372
+
1373
+ for (i = 0 ; i < sk_X509_num (chain ); i ++ ) {
1374
+ x509 = sk_X509_value (chain , i );
1375
+ if (x509 == NULL ) {
1376
+ * err = "sk_X509_value() failed" ;
1377
+ goto failed ;
1378
+ }
1379
+
1380
+ if ((subject = X509_NAME_dup (
1381
+ X509_get_subject_name (x509 ))) == NULL ) {
1382
+ * err = "X509_get_subject_name() failed" ;
1383
+ goto failed ;
1384
+ }
1385
+
1386
+ if (!sk_X509_NAME_push (name_chain , subject )) {
1387
+ * err = "sk_X509_NAME_push() failed" ;
1388
+ X509_NAME_free (subject );
1389
+ goto failed ;
1390
+ }
1391
+ }
1392
+
1393
+ SSL_set_client_CA_list (ssl_conn , name_chain );
1394
+ }
1395
+
1396
+ return NGX_OK ;
1397
+
1398
+ failed :
1399
+
1400
+ sk_X509_NAME_free (name_chain );
1401
+
1402
+ return NGX_ERROR ;
1403
+ }
1404
+
1405
+
1320
1406
#endif /* NGX_STREAM_SSL */
0 commit comments