Skip to content

Commit 57af78c

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

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

src/ngx_http_lua_ssl_certby.c

+86
Original file line numberDiff line numberDiff line change
@@ -1294,4 +1294,90 @@ ngx_http_lua_ffi_set_priv_key(ngx_http_request_t *r,
12941294
}
12951295

12961296

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+
12971383
#endif /* NGX_HTTP_SSL */

0 commit comments

Comments
 (0)