nginx module for SSL/TLS ja3 fingerprint.
This module adds to nginx the ability of new nginx variables for the TLS/SSL ja3 fingerprint.
For details about the ja3 fingerprint algorithm, check initial project.
No directives yet.
The ja3 fingerprint string for a SSL connection for a HTTP server.
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
The ja3 fingerprint MD5 hash for a SSL connection for a HTTP server.
Example:
http {
server {
listen 127.0.0.1:443 ssl;
ssl_certificate cert.pem;
ssl_certificate_key rsa.key;
error_log /dev/stderr debug;
return 200 "$time_iso8601\n\n$http_user_agent\n\n$ja3\n\n$ja3_hash\n";
}
}
The ja3 fingerprint string for a SSL connection for a stream server.
The ja3 fingerprint MD5 hash for a SSL connection for a stream server.
Example:
stream {
server {
listen 127.0.0.1:12345 ssl;
ssl_certificate cert.pem;
ssl_certificate_key rsa.key;
error_log /dev/stderr debug;
return "$time_iso8601\n\n$ja3\n\n$ja3_hash\n";
}
}
- OpenSSL - 1.1.1
The master version OpenSSL is required because this module fetches the extensions types declared at SSL/TLS Client Hello by using the new early callback SSL_CTX_set_client_hello_cb.
I was unable to find a way to get these values with the current versions of nginx and OpenSSL.
So, in order to, have the client extensions available for the fingerprint, we also need to apply a patch to the nginx code.
If you use, for development, the docker supplied in this repo, the patch is already applied. Check the Dockerfile of the dev image.
- nginx - save client hello extensions
- openssl - more tls extensions: for versions up to 1.1.1d and for openssl versions from 1.1.1e
Build as a common nginx module.
# Hack/patch openssl - to include more common extensions
$ patch -p1 < /build/nginx-ssl-ja3/patches/openssl_1.1.1d.extensions.patch
patching file include/openssl/tls1.h
patching file ssl/statem/extensions.c
patching file ssl/ssl_locl.h
# Hack/patch nginx
$ patch -p1 < /build/ngx_ssl_ja3/patches/nginx.latest.patch
patching file src/event/ngx_event_openssl.c
Hunk #1 succeeded at 1358 (offset 137 lines).
Hunk #2 succeeded at 1426 (offset 143 lines).
patching file src/event/ngx_event_openssl.h
Hunk #1 succeeded at 99 (offset 1 line).
# Configure
## Static module
$ ./configure --add-module=/build/ngx_ssl_ja3 --with-http_ssl_module --with-stream_ssl_module --with-debug --with-stream
## Dynamic module
$ ./configure --add-dynamic-module=/build/ngx_ssl_ja3 --with-http_ssl_module --with-stream_ssl_module --with-debug --with-stream
# Install
$ make && make install
Make sure that the lib directory for nginx-tests is available in the 't' directory.
$ TEST_NGINX_BINARY=/usr/local/nginx/sbin/nginx prove -v
Docker images and a docker compose file is available at the ./docker directory.
$ docker-compose up --build -d
Creating nginx-ssl-ja3
@fooinha - author
@Sessa93
@bartebor
@tiandrey
THIS IS NOT PRODUCTION ready.
So there's no guarantee of success. It most probably blow up when running in real life scenarios.