Skip to content

Commit bdd2633

Browse files
authored
Merge pull request fooinha#8 from fooinha/feature/ja3-string
nginx-ssl-ja3: $http_ssl_ja3 and $stream_ssl_ja3
2 parents 7744f79 + 256f2c8 commit bdd2633

File tree

4 files changed

+76
-5
lines changed

4 files changed

+76
-5
lines changed

README.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@ No directives yet.
1616

1717
### Variables
1818

19+
#### $http_ssl_ja3
20+
21+
The ja3 fingerprint string for a SSL connection for a HTTP server.
22+
23+
```
24+
771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53-10,0-23-65281-10-11-35-16-5-13-18-51-45-43-21,0-29-23-24,0
25+
```
26+
1927
#### $http_ssl_ja3_hash
2028

2129
The ja3 fingerprint MD5 hash for a SSL connection for a HTTP server.
@@ -29,11 +37,15 @@ http {
2937
ssl_certificate cert.pem;
3038
ssl_certificate_key rsa.key;
3139
error_log /dev/stderr debug;
32-
return 200 "$time_iso8601-$http_ssl_ja3_hash\n";
40+
return 200 "$time_iso8601\n\n$http_user_agent\n\n$http_ssl_ja3\n\n$http_ssl_ja3_hash\n";
3341
}
3442
}
3543
```
3644

45+
#### $stream_ssl_ja3
46+
47+
The ja3 fingerprint string for a SSL connection for a stream server.
48+
3749
#### $stream_ssl_ja3_hash
3850

3951
The ja3 fingerprint MD5 hash for a SSL connection for a stream server.
@@ -47,7 +59,7 @@ stream {
4759
ssl_certificate cert.pem;
4860
ssl_certificate_key rsa.key;
4961
error_log /dev/stderr debug;
50-
return "$time_iso8601-$stream_ssl_ja3_hash\n";
62+
return "$time_iso8601\n\n$stream_ssl_ja3\n\n$stream_ssl_ja3_hash\n";
5163
}
5264
}
5365
```

docker/debian-nginx-ssl-ja3/nginx.conf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ http {
1212
ssl_certificate cert.pem;
1313
ssl_certificate_key rsa.key;
1414
error_log /dev/stderr debug;
15-
return 200 "$time_iso8601-$http_ssl_ja3_hash\n";
15+
return 200 "$time_iso8601\n\n$http_user_agent\n\n$http_ssl_ja3\n\n$http_ssl_ja3_hash\n";
1616
}
1717
}
1818

@@ -22,6 +22,6 @@ stream {
2222
ssl_certificate cert.pem;
2323
ssl_certificate_key rsa.key;
2424
error_log /dev/stderr debug;
25-
return "$time_iso8601-$stream_ssl_ja3_hash\n";
25+
return "$time_iso8601\n\n$stream_ssl_ja3\n\n$stream_ssl_ja3_hash\n";
2626
}
2727
}

src/ngx_http_ssl_ja3_module.c

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ ngx_module_t ngx_http_ssl_ja3_module = {
6262
NGX_MODULE_V1_PADDING
6363
};
6464

65-
6665
static ngx_int_t
6766
ngx_http_ssl_ja3_hash(ngx_http_request_t *r,
6867
ngx_http_variable_value_t *v, uintptr_t data)
@@ -112,6 +111,31 @@ ngx_http_ssl_ja3_hash(ngx_http_request_t *r,
112111
return NGX_OK;
113112
}
114113

114+
static ngx_int_t
115+
ngx_http_ssl_ja3(ngx_http_request_t *r,
116+
ngx_http_variable_value_t *v, uintptr_t data)
117+
{
118+
ngx_ssl_ja3_t ja3;
119+
ngx_str_t fp = ngx_null_string;
120+
121+
if (r->connection == NULL) {
122+
return NGX_OK;
123+
}
124+
125+
if (ngx_ssl_ja3(r->connection, r->pool, &ja3) == NGX_DECLINED) {
126+
return NGX_ERROR;
127+
}
128+
129+
ngx_ssl_ja3_fp(r->pool, &ja3, &fp);
130+
131+
v->data = fp.data;
132+
v->len = fp.len;
133+
v->valid = 1;
134+
v->no_cacheable = 1;
135+
v->not_found = 0;
136+
137+
return NGX_OK;
138+
}
115139

116140
static ngx_http_variable_t ngx_http_ssl_ja3_variables_list[] = {
117141

@@ -120,6 +144,11 @@ static ngx_http_variable_t ngx_http_ssl_ja3_variables_list[] = {
120144
ngx_http_ssl_ja3_hash,
121145
0, 0, 0
122146
},
147+
{ ngx_string("http_ssl_ja3"),
148+
NULL,
149+
ngx_http_ssl_ja3,
150+
0, 0, 0
151+
},
123152

124153
};
125154

src/ngx_stream_ssl_ja3_preread_module.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,31 @@ ngx_stream_ssl_ja3_hash(ngx_stream_session_t *s,
109109
return NGX_OK;
110110
}
111111

112+
static ngx_int_t
113+
ngx_stream_ssl_ja3(ngx_stream_session_t *s,
114+
ngx_stream_variable_value_t *v, uintptr_t data)
115+
{
116+
ngx_ssl_ja3_t ja3;
117+
ngx_str_t fp = ngx_null_string;
118+
119+
if (s->connection == NULL) {
120+
return NGX_OK;
121+
}
122+
123+
if (ngx_ssl_ja3(s->connection, s->connection->pool, &ja3) == NGX_DECLINED) {
124+
return NGX_ERROR;
125+
}
126+
ngx_ssl_ja3_fp(s->connection->pool, &ja3, &fp);
127+
128+
v->data = fp.data;
129+
v->len = fp.len;
130+
v->valid = 1;
131+
v->no_cacheable = 1;
132+
v->not_found = 0;
133+
134+
return NGX_OK;
135+
}
136+
112137

113138
static ngx_stream_variable_t ngx_stream_ssl_ja3_variables_list[] = {
114139

@@ -117,6 +142,11 @@ static ngx_stream_variable_t ngx_stream_ssl_ja3_variables_list[] = {
117142
ngx_stream_ssl_ja3_hash,
118143
0, 0, 0
119144
},
145+
{ ngx_string("stream_ssl_ja3"),
146+
NULL,
147+
ngx_stream_ssl_ja3,
148+
0, 0, 0
149+
},
120150

121151
};
122152

0 commit comments

Comments
 (0)