Skip to content

Commit 57a7648

Browse files
committed
feature: add FFI interface to verify SSL client certificate
1 parent d987a0c commit 57a7648

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

src/ngx_stream_lua_ssl_certby.c

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,4 +1317,90 @@ ngx_stream_lua_ffi_set_priv_key(ngx_stream_lua_request_t *r,
13171317
}
13181318

13191319

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+
13201406
#endif /* NGX_STREAM_SSL */

0 commit comments

Comments
 (0)