{"id":43946460,"url":"https://github.com/phuslu/nginx-ssl-fingerprint","last_synced_at":"2026-04-19T06:04:12.318Z","repository":{"id":37035774,"uuid":"418496023","full_name":"phuslu/nginx-ssl-fingerprint","owner":"phuslu","description":"High performance  ja3 and http2 fingerprint for nginx.","archived":false,"fork":false,"pushed_at":"2026-01-08T14:00:11.000Z","size":108,"stargazers_count":203,"open_issues_count":8,"forks_count":39,"subscribers_count":6,"default_branch":"master","last_synced_at":"2026-01-26T14:21:25.588Z","etag":null,"topics":["fingerprint","http2","ja3","nginx","ssl","tls"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/phuslu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-10-18T12:42:04.000Z","updated_at":"2026-01-22T14:01:54.000Z","dependencies_parsed_at":"2024-02-28T17:49:58.798Z","dependency_job_id":"aa2a5ff6-4223-4ef0-8ba8-5b1d6ddcdb33","html_url":"https://github.com/phuslu/nginx-ssl-fingerprint","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/phuslu/nginx-ssl-fingerprint","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phuslu%2Fnginx-ssl-fingerprint","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phuslu%2Fnginx-ssl-fingerprint/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phuslu%2Fnginx-ssl-fingerprint/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phuslu%2Fnginx-ssl-fingerprint/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/phuslu","download_url":"https://codeload.github.com/phuslu/nginx-ssl-fingerprint/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phuslu%2Fnginx-ssl-fingerprint/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29185120,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-07T00:44:15.062Z","status":"online","status_checked_at":"2026-02-07T02:00:07.217Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fingerprint","http2","ja3","nginx","ssl","tls"],"created_at":"2026-02-07T03:04:08.104Z","updated_at":"2026-04-19T06:04:12.291Z","avatar_url":"https://github.com/phuslu.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# nginx-ssl-fingerprint\n\nA high performance nginx module for ja3 ja4 and http2 fingerprint.\n\n## Patches\n - [nginx - save ja3/ja4/http2 fingerprint](patches)\n - [openssl - save clienthello data](patches)\n\n### Support Matrix\n\n|              | openssl-3.5.6 | openssl-3.6.2 | openssl-4.0.0 |\n| ------------ | ------------- | ------------- | ------------- |\n| nginx-1.29.8 |    ✅        |     ✅        |               |\n| nginx-1.30.0 |    ✅        |     ✅        |               |\n\n## Configuration\n\n### HTTP module variables\n\n| Name              | Default Value | Comments                 |\n| ----------------- | ------------- | ------------------------ |\n| http_ssl_greased  | 0             | TLS greased flag.        |\n| http_ssl_ja3      | NULL          | The ja3 fingerprint.     |\n| http_ssl_ja3_hash | NULL          | The ja3 fingerprint hash.|\n| http_ssl_ja4      | NULL          | The ja4 fingerprint.     |\n| http2_fingerprint | NULL          | The http2 fingerprint.   |\n\n#### Example\n\n```nginx\nhttp {\n    server {\n        listen                 127.0.0.1:4433 ssl;\n        http2                  on;\n        ssl_certificate        cert.pem;\n        ssl_certificate_key    priv.key;\n        error_log              /dev/stderr debug;\n        return                 200 \"ja3: $http_ssl_ja3\\nja4: $http_ssl_ja4\\nh2fp: $http2_fingerprint\";\n    }\n}\n```\n\n### Stream module variables\n\n| Name                | Default Value | Comments                 |\n| ------------------- | ------------- | ------------------------ |\n| stream_ssl_greased  | 0             | TLS greased flag.        |\n| stream_ssl_ja3      | NULL          | The ja3 fingerprint.     |\n| stream_ssl_ja3_hash | NULL          | The ja3 fingerprint hash.|\n| stream_ssl_ja4      | NULL          | The ja4 fingerprint.     |\n\n#### Example\n\n```nginx\nstream {\n    server {\n        listen                 127.0.0.1:4443 ssl;\n        ssl_certificate        cert.pem;\n        ssl_certificate_key    priv.key;\n        error_log              /dev/stderr debug;\n        return                 \"ja4: $stream_ssl_ja4\\n\";\n    }\n}\n```\n\n\n## Quick Start\n\n```bash\n\n# Clone\n\n$ git clone -b openssl-3.6.2 --depth=1 https://github.com/openssl/openssl\n$ git clone -b release-1.30.0 --depth=1 https://github.com/nginx/nginx\n$ git clone -b master https://github.com/phuslu/nginx-ssl-fingerprint\n\n# Patch\n\n$ patch -p1 -d openssl \u003c nginx-ssl-fingerprint/patches/openssl-3.6.2.patch\n$ patch -p1 -d nginx \u003c nginx-ssl-fingerprint/patches/release-1.30.0.patch\n\n# Build\n\n$ cd nginx\n$ ASAN_OPTIONS=symbolize=1 ./auto/configure --with-openssl=$(pwd)/../openssl --add-module=$(pwd)/../nginx-ssl-fingerprint --with-http_ssl_module --with-stream_ssl_module --with-debug --with-stream --with-http_v2_module --with-cc-opt=\"-fsanitize=address -O -fno-omit-frame-pointer -DNGX_DEBUG_PALLOC=1\" --with-ld-opt=\"-L/usr/local/lib -Wl,-E -lasan\"\n$ make\n\n# Test\n\n$ objs/nginx -p . -c $(pwd)/../nginx-ssl-fingerprint/nginx.conf\n$ curl -k https://127.0.0.1:4433\n\n# Fuzzing\n\n$ git clone https://github.com/tlsfuzzer/tlsfuzzer\n$ cd tlsfuzzer\n$ python3 -m venv venv\n$ venv/bin/pip install --pre tlslite-ng\n$ PYTHONPATH=. venv/bin/python scripts/test-client-hello-max-size.py\n\n```\n\n## Peformance\n\nA Performance result as below, check github [actions][actions] for more results and details.\n```\n------------- Nginx Baseline -------------\nRunning 30s test @ https://127.0.0.1:4433\n  2 threads and 2000 connections\n  Thread Stats   Avg      Stdev     Max   +/- Stdev\n    Latency    19.54ms   26.60ms 626.85ms   98.89%\n    Req/Sec    37.26k     3.06k   44.23k    82.94%\n  2155428 requests in 30.07s, 2.31GB read\nRequests/sec:  71669.13\nTransfer/sec:     78.81MB\n\n------------- Nginx With Fingerprint -------------\nRunning 30s test @ https://127.0.0.1:4433\n  2 threads and 2000 connections\n  Thread Stats   Avg      Stdev     Max   +/- Stdev\n    Latency    21.03ms   26.36ms 618.44ms   98.63%\n    Req/Sec    37.45k     3.49k   45.50k    77.80%\n  2162578 requests in 30.07s, 2.22GB read\nRequests/sec:  71909.53\nTransfer/sec:     75.44MB\n```\nThe results indicate that nginx-ssl-fingerprint module performs comparably well.\n\n[actions]: https://github.com/phuslu/nginx-ssl-fingerprint/actions/workflows/performance.yml\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphuslu%2Fnginx-ssl-fingerprint","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphuslu%2Fnginx-ssl-fingerprint","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphuslu%2Fnginx-ssl-fingerprint/lists"}