BAD SKY.NET

rsa_pkcs1_sha384

rsa_pkcs1_sha384 is RSA PKCS#1 v1.5 with SHA-384, accepted for certificate signatures. Every client we recorded sends it.

TLS signature algorithmCode 0x0501 (1281)recommended

What it is

rsa_pkcs1_sha384 (code 0x0501) is RSASSA-PKCS1-v1_5 with SHA-384. As with rsa_pkcs1_sha256, RFC 8446 allows it in TLS 1.3 only for signatures inside certificates, not for the handshake signature, which must use RSA-PSS. TLS 1.2 also uses it for handshake signatures.

Some certificate authorities sign certificates with SHA-384 instead of SHA-256, especially in hierarchies built on larger keys. Listing this scheme lets a client validate such chains.

PKCS#1 v1.5 with SHA-384 has no known practical weakness; TLS 1.3 prefers RSA-PSS for handshakes because of its stronger security proof.

RFC 8446 also defines rsa_pkcs1_sha512 with the same rules. Go, the Firefox profile of curl-impersonate and the OpenSSL-based clients list the three PKCS#1 schemes together after their RSA-PSS schemes, while the Chrome profiles and macOS curl alternate PSS and PKCS#1 for each hash. In TLS 1.2, where PKCS#1 v1.5 is still allowed for handshakes, a server may sign with it directly.

Who sends it

Chrome 153 (macOS) browserNot recorded
curl_cffi (impersonate chrome) Sent at position 9
curl-impersonate chrome116 Sent at position 6
curl-impersonate ff117 Sent at position 8
curl 8.7 (macOS) Sent at position 5
curl 7.88 (Debian 12) Sent at position 13
Python requests Sent at position 19
Python httpx Sent at position 19
Python httpx (HTTP/2) Sent at position 19
Go net/http Sent at position 7
Node.js fetch Sent at position 19
PHP Guzzle Sent at position 19

Measured on 2026-10-25 against our own test server: sent by 11 of 11 clients. Position counts from 1 and ignores GREASE values.

Why it matters for fingerprinting

Every client we recorded sends it, at very different positions: 5th for macOS curl, 6th for the Chrome profile of curl-impersonate, 7th for Go net/http, 8th for the Firefox profile, 9th for curl_cffi, 13th for Debian curl and 19th for Python requests, httpx, Node.js fetch and Guzzle. Our Chrome capture did not record signature algorithms.

Check whether your client sends it

Open the test from your browser, or call it from your script, and look for rsa_pkcs1_sha384 in the TLS details.

Run the TLS fingerprint test

References

Related