Skip to content

Commit 1814f5f

Browse files
committed
add Mutual-TLS Certificate-Bound Access Tokens support to NGINX
RFC 8705 Signed-off-by: Hans Zandbelt <[email protected]>
1 parent e5e41c7 commit 1814f5f

File tree

6 files changed

+53
-2
lines changed

6 files changed

+53
-2
lines changed

ChangeLog

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
03/08/2024
2+
- add support for RFC 8705 OAuth 2.0 Mutual-TLS Certificate-Bound Access Tokens to the NGINX binding
3+
14
03/04/2024
25
- add support for Redis 6 ACL username based authentication; see: OpenIDC/mod_oauth2#63
36
- bump to 1.6.1dev

include/oauth2/http.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@
5151
#define OAUTH2_HTTP_HDR_WWW_AUTHENTICATE "WWW-Authenticate"
5252
#define OAUTH2_HTTP_HDR_XML_HTTP_REQUEST "XMLHttpRequest"
5353

54+
#define OAUTH2_TLS_CERT_VAR_NAME "SSL_CLIENT_CERT"
55+
5456
/*
5557
* content type
5658
*/

include/oauth2/oauth2.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,6 @@
6565
#define OAUTH2_CLAIM_AUD "aud"
6666
#define OAUTH2_CLAIM_IAT "iat"
6767

68-
#define OAUTH2_TLS_CERT_VAR_NAME "SSL_CLIENT_CERT"
69-
7068
typedef enum {
7169
OAUTH2_UNAUTH_ACTION_UNDEFINED,
7270
OAUTH2_UNAUTH_ACTION_AUTHENTICATE,

src/http.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,11 @@ bool oauth2_http_request_context_set(oauth2_log_t *log,
176176
if (request == NULL)
177177
goto end;
178178

179+
if (strcmp(name, OAUTH2_TLS_CERT_VAR_NAME) == 0)
180+
oauth2_debug(
181+
log, "set SSL client certificate in request context: %s",
182+
value);
183+
179184
rc = oauth2_nv_list_set(log, request->_context, name, value);
180185

181186
end:

src/server/nginx.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,30 @@ void _oauth2_nginx_request_copy(oauth2_nginx_request_context_t *ctx)
198198
return;
199199
}
200200

201+
static void _oauth2_nginx_ssl_cert_set(oauth2_nginx_request_context_t *ctx)
202+
{
203+
ngx_str_t name;
204+
ngx_uint_t key;
205+
ngx_http_variable_value_t *vv = NULL;
206+
207+
char *s_key = "ssl_client_cert";
208+
209+
name.len = strlen(s_key);
210+
name.data = ngx_palloc(ctx->r->pool, name.len);
211+
memcpy(name.data, s_key, name.len);
212+
key = ngx_hash_strlow(name.data, name.data, name.len);
213+
vv = ngx_http_get_variable(ctx->r, &name, key);
214+
215+
if ((vv == NULL) || (vv->not_found))
216+
return;
217+
218+
char *s = oauth2_strndup((char *)vv->data, vv->len);
219+
oauth2_http_request_context_set(ctx->log, ctx->request,
220+
OAUTH2_TLS_CERT_VAR_NAME, s);
221+
222+
ngx_pfree(ctx->r->pool, name.data);
223+
oauth2_mem_free(s);
224+
}
201225
oauth2_nginx_request_context_t *
202226
oauth2_nginx_request_context_init(ngx_http_request_t *r)
203227
{
@@ -224,6 +248,8 @@ oauth2_nginx_request_context_init(ngx_http_request_t *r)
224248

225249
_oauth2_nginx_request_copy(ctx);
226250

251+
_oauth2_nginx_ssl_cert_set(ctx);
252+
227253
oauth2_debug(ctx->log, "created NGINX request context: %p", ctx);
228254

229255
// end:

test/server_stubs.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,12 @@ void *ngx_palloc(ngx_pool_t *pool, size_t size)
149149
return p;
150150
}
151151

152+
ngx_int_t ngx_pfree(ngx_pool_t *pool, void *p)
153+
{
154+
oauth2_mem_free(p);
155+
return NGX_OK;
156+
}
157+
152158
void *ngx_list_push(ngx_list_t *l)
153159
{
154160
void *elt;
@@ -183,4 +189,15 @@ void *ngx_list_push(ngx_list_t *l)
183189
return elt;
184190
}
185191

192+
ngx_http_variable_value_t *
193+
ngx_http_get_variable(ngx_http_request_t *r, ngx_str_t *name, ngx_uint_t key)
194+
{
195+
return NULL;
196+
}
197+
198+
ngx_uint_t ngx_hash_strlow(u_char *dst, u_char *src, size_t n)
199+
{
200+
return 0;
201+
}
202+
186203
#endif

0 commit comments

Comments
 (0)