{"record":{"id":"03df4331000b349e","repo":"ducaale/xh","slug":"message-signature-rsa-private-keys-require-an-explicit","errorCode":null,"errorMessage":"message-signature: RSA private keys require an explicit algorithm. Use --unstable-m-sig-alg=rsa-v1_5-sha256 or --unstable-m-sig-alg=rsa-pss-sha512","messagePattern":"message-signature: RSA private keys require an explicit algorithm\\. Use --unstable-m-sig-alg=rsa-v1_5-sha256 or --unstable-m-sig-alg=rsa-pss-sha512","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/message_signature.rs","lineNumber":271,"sourceCode":"        if pem.contains(\"-----BEGIN\") {\n            if let Some(secret) = parse_pem_secret_key(\n                pem,\n                &[\n                    AlgorithmName::Ed25519,\n                    AlgorithmName::EcdsaP256Sha256,\n                    AlgorithmName::EcdsaP384Sha384,\n                ],\n            ) {\n                let alg = secret.alg();\n                return Ok((MessageSigningKey::Secret(secret, key_id.to_string()), alg));\n            }\n            if parse_pem_secret_key(\n                pem,\n                &[AlgorithmName::RsaV1_5Sha256, AlgorithmName::RsaPssSha512],\n            )\n            .is_some()\n            {\n                bail!(\n                    \"message-signature: RSA private keys require an explicit algorithm. Use --unstable-m-sig-alg=rsa-v1_5-sha256 or --unstable-m-sig-alg=rsa-pss-sha512\"\n                );\n            }\n            bail!(\n                \"message-signature: Failed to parse PEM private key. Supported algorithms: ed25519, ecdsa-p256-sha256, ecdsa-p384-sha384, rsa-v1_5-sha256, rsa-pss-sha512\"\n            );\n        }\n    }\n\n    build_hmac_signing_key(key_material, key_id)\n}\n\nfn build_hmac_signing_key(\n    key_material: &[u8],\n    key_id: &str,\n) -> Result<(MessageSigningKey, AlgorithmName)> {\n    let encoded = STANDARD.encode(key_material);\n    let shared_key = SharedKey::from_base64(&AlgorithmName::HmacSha256, &encoded)","sourceCodeStart":253,"sourceCodeEnd":289,"githubUrl":"https://github.com/ducaale/xh/blob/2404aceecc08b0b2d100fedc96f57745cd5904dc/src/message_signature.rs#L253-L289","documentation":"When the signing key material is a PEM RSA private key, build_signing_key refuses to guess the algorithm and requires the user to select one explicitly via --unstable-m-sig-alg (rsa-v1_5-sha256 or rsa-pss-sha512), since RSA PEM keys alone don't determine the signature scheme.","triggerScenarios":"sign_request called with an RSA PEM private key and no explicit algorithm (m_sig_alg unset or set to a non-RSA algorithm).","commonSituations":"Users supplying a standard RSA .pem signing key without the --unstable-m-sig-alg flag; defaults tuned for ed25519/ECDSA keys.","solutions":["Pass --unstable-m-sig-alg=rsa-v1_5-sha256 (classic RSASSA-PKCS1v15)","Or pass --unstable-m-sig-alg=rsa-pss-sha512 (RSASSA-PSS)","Or use a non-RSA key (ed25519/ECDSA) if explicit algorithm selection is undesirable"],"exampleFix":"# before\nhttp --message-signature key=rsa_key.pem ...\n# after\nhttp --message-signature key=rsa_key.pem --unstable-m-sig-alg=rsa-v1_5-sha256 ...","handlingStrategy":"validation","validationCode":"// before signing, require an explicit algorithm for RSA PEM keys\nif pem_contains_rsa_private_key(key_material) && m_sig_alg.is_none() {\n    anyhow::bail!(\"RSA keys require --unstable-m-sig-alg=rsa-v1_5-sha256 or rsa-pss-sha512\");\n}","typeGuard":"fn needs_explicit_alg(pem: &str, alg: Option<&AlgorithmName>) -> bool {\n    alg.is_none() && pem.contains(\"BEGIN\") && parse_pem_secret_key(pem, &[AlgorithmName::RsaV1_5Sha256, AlgorithmName::RsaPssSha512]).is_some()\n}","tryCatchPattern":"match sign_request(&req, &components, &key) {\n    Ok(s) => s,\n    Err(e) if e.to_string().contains(\"RSA private keys require an explicit algorithm\") => {\n        eprintln!(\"re-run with --unstable-m-sig-alg=rsa-v1_5-sha256 or rsa-pss-sha512\");\n        return Err(e);\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Always pass --unstable-m-sig-alg when using RSA keys","Document required flags per key type in scripts/wrappers","Validate key type vs. chosen algorithm before invoking","Prefer ed25519/ECDSA keys where algorithm inference is safe"],"tags":["cli","signature","rsa","configuration"],"backgroundTag":"missing-required-option","analyzedSha":"2404aceecc08b0b2d100fedc96f57745cd5904dc","analyzedAt":"2026-09-13T19:13:33.814Z","contentChangedAt":"2026-09-13T19:13:33.814Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}