Summary
Two operator-facing documents warn that openssl genrsa produces a PKCS#1 key which QAuth's
importPKCS8 will reject. That has not been true since OpenSSL 3.0: genrsa now emits
PKCS#8 by default, and -traditional is required to get the old PKCS#1 output.
An operator on any current OpenSSL follows the warning, cannot reproduce the problem it
describes, and is left unsure whether the rest of the key guidance is trustworthy.
Evidence
$ openssl version
OpenSSL 3.5.6 7 Apr 2026
$ openssl genrsa 2048 | head -1
-----BEGIN PRIVATE KEY----- # PKCS#8, not PKCS#1
Occurrences:
What is still true
The underlying QAuth requirement is unchanged and worth keeping: private keys must be
PKCS#8 (libs/core/crypto/src/lib/key-management.ts:47-49 calls importPKCS8 directly, so a
BEGIN RSA PRIVATE KEY PEM is rejected), and openssl genpkey remains the right
recommendation. Only the claim about genrsa's default output is wrong.
Tasks
Acceptance Criteria
Additional Notes
Found while a new operate/keys.md page was extracted from the certification runbook's key
section: the new page inherited the claim verbatim, and a review checking it against a live
openssl run caught it. Worth noting that no automated guard could have — it is a claim about
an external tool's behaviour, not about this repository, so nothing in the docs invariants suite
has visibility into it. The new page is being corrected on the documentation branch; this issue
covers the two pre-existing occurrences, which sit outside that branch's scope.
References
libs/core/crypto/src/lib/key-management.ts:47-49 — the actual PKCS#8 requirement
- OpenSSL 3.0 migration notes —
genrsa output-format change
Summary
Two operator-facing documents warn that
openssl genrsaproduces a PKCS#1 key which QAuth'simportPKCS8will reject. That has not been true since OpenSSL 3.0:genrsanow emitsPKCS#8 by default, and
-traditionalis required to get the old PKCS#1 output.An operator on any current OpenSSL follows the warning, cannot reproduce the problem it
describes, and is left unsure whether the rest of the key guidance is trustworthy.
Evidence
Occurrences:
docs/oidf-op-certification-runbook.md:44— "Pitfall:openssl genrsaemits PKCS#1(
-----BEGIN RSA PRIVATE KEY-----), whichimportPKCS8rejects.".env.example— the same pitfall, per that runbook's own note at line 94 recording it wasadded there under chore: pursue OpenID Foundation OP conformance certification #286.
What is still true
The underlying QAuth requirement is unchanged and worth keeping: private keys must be
PKCS#8 (
libs/core/crypto/src/lib/key-management.ts:47-49callsimportPKCS8directly, so aBEGIN RSA PRIVATE KEYPEM is rejected), andopenssl genpkeyremains the rightrecommendation. Only the claim about
genrsa's default output is wrong.Tasks
-traditional; 3.x defaults to PKCS#8openssl genpkeyas the recommended command, and keep theopenssl pkcs8 -topk8 -nocryptconversion recipe for anyone who does have a PKCS#1 keyAcceptance Criteria
genrsaemits PKCS#1 without version qualificationAdditional Notes
Found while a new
operate/keys.mdpage was extracted from the certification runbook's keysection: the new page inherited the claim verbatim, and a review checking it against a live
opensslrun caught it. Worth noting that no automated guard could have — it is a claim aboutan external tool's behaviour, not about this repository, so nothing in the docs invariants suite
has visibility into it. The new page is being corrected on the documentation branch; this issue
covers the two pre-existing occurrences, which sit outside that branch's scope.
References
libs/core/crypto/src/lib/key-management.ts:47-49— the actual PKCS#8 requirementgenrsaoutput-format change