{"record":{"id":"b6e710d780d241ae","repo":"oven-sh/bun","slug":"suite-b-invalid-signature-algorithm","errorCode":"SUITE_B_INVALID_SIGNATURE_ALGORITHM","errorMessage":"SUITE_B_INVALID_SIGNATURE_ALGORITHM","messagePattern":"SUITE_B_INVALID_SIGNATURE_ALGORITHM","errorType":"error_code","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"src/http/error.rs","lineNumber":237,"sourceCode":"    #[error(\"SUBTREE_MINMAX\")]\n    SUBTREE_MINMAX,\n    #[error(\"APPLICATION_VERIFICATION\")]\n    APPLICATION_VERIFICATION,\n    #[error(\"UNSUPPORTED_CONSTRAINT_TYPE\")]\n    UNSUPPORTED_CONSTRAINT_TYPE,\n    #[error(\"UNSUPPORTED_CONSTRAINT_SYNTAX\")]\n    UNSUPPORTED_CONSTRAINT_SYNTAX,\n    #[error(\"UNSUPPORTED_NAME_SYNTAX\")]\n    UNSUPPORTED_NAME_SYNTAX,\n    #[error(\"CRL_PATH_VALIDATION_ERROR\")]\n    CRL_PATH_VALIDATION_ERROR,\n    #[error(\"SUITE_B_INVALID_VERSION\")]\n    SUITE_B_INVALID_VERSION,\n    #[error(\"SUITE_B_INVALID_ALGORITHM\")]\n    SUITE_B_INVALID_ALGORITHM,\n    #[error(\"SUITE_B_INVALID_CURVE\")]\n    SUITE_B_INVALID_CURVE,\n    #[error(\"SUITE_B_INVALID_SIGNATURE_ALGORITHM\")]\n    SUITE_B_INVALID_SIGNATURE_ALGORITHM,\n    #[error(\"SUITE_B_LOS_NOT_ALLOWED\")]\n    SUITE_B_LOS_NOT_ALLOWED,\n    #[error(\"SUITE_B_CANNOT_SIGN_P_384_WITH_P_256\")]\n    SUITE_B_CANNOT_SIGN_P_384_WITH_P_256,\n    #[error(\"HOSTNAME_MISMATCH\")]\n    HOSTNAME_MISMATCH,\n    #[error(\"EMAIL_MISMATCH\")]\n    EMAIL_MISMATCH,\n    #[error(\"IP_ADDRESS_MISMATCH\")]\n    IP_ADDRESS_MISMATCH,\n    #[error(\"INVALID_CALL\")]\n    INVALID_CALL,\n    #[error(\"STORE_LOOKUP\")]\n    STORE_LOOKUP,\n    #[error(\"NAME_CONSTRAINTS_WITHOUT_SANS\")]\n    NAME_CONSTRAINTS_WITHOUT_SANS,\n    #[error(\"UNKNOWN_CERTIFICATE_VERIFICATION_ERROR\")]","sourceCodeStart":219,"sourceCodeEnd":255,"githubUrl":"https://github.com/oven-sh/bun/blob/8c5296ac459e8252d3cd702f3fbcbb0c249d95d5/src/http/error.rs#L219-L255","documentation":"CertError::SUITE_B_INVALID_SIGNATURE_ALGORITHM maps BoringSSL X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM (verify code 59). Under Suite B, every signature in the chain must be ECDSA with SHA-256 or SHA-384 (matching the LOS); a certificate is signed with something else - RSA, RSA-SHA1, ECDSA-SHA512. Message: \"Suite B: invalid signature algorithm\".","triggerScenarios":"Suite B verification with a chain containing an RSA-signed certificate or a signature hash outside {SHA-256, SHA-384} (e.g. SHA-1 intermediates or SHA-512 leafs).","commonSituations":"Chains where keys are ECDSA but signing requests specified RSA-SHA256 by mistake; old SHA-1 intermediates still trusted; signing tools defaulting to SHA-512 on P-384 keys.","solutions":["List signature algorithms: openssl x509 -noout -text | grep 'Signature Algorithm' for every chain cert","Re-sign with ecdsa-with-SHA256 (P-256) or ecdsa-with-SHA384 (P-384) - usually just reissuing from an ECDSA CA with correct defaults","Remove any SHA-1-signed certificate from the chain; Suite B will never accept it","If RSA must stay, disable Suite B flags on the verifier"],"exampleFix":"# before: EC key signed with the wrong digest\nopenssl x509 -req -in csr -CA ca.pem -md sha512 ...\n\n# after: Suite B-consistent digest\nopenssl x509 -req -in csr -CA ca.pem -md sha384 ...","handlingStrategy":"validation","validationCode":"// Assert all chain signatures are ecdsa-with-SHA256/384 before Suite B verification hits them\nimport tls from \"node:tls\";\nimport { X509Certificate } from \"node:crypto\";\nexport function chainSigsSuiteB(host, port = 443) {\n  return new Promise((resolve, reject) => {\n    const s = tls.connect({ host, port, servername: host, rejectUnauthorized: false }, () => {\n      let c = s.getPeerCertificate(true), ok = true;\n      do {\n        const txt = new X509Certificate(c.raw).toString();\n        ok = ok && /Signature Algorithm: ecdsa-with-(SHA256|SHA384)/.test(txt);\n      } while (c.issuerCertificate && (c = c.issuerCertificate) && !Object.is(c, s.getPeerCertificate(true)));\n      s.end(); resolve(ok);\n    });\n    s.on(\"error\", reject);\n  });\n}","typeGuard":"export function isSuiteBInvalidSignatureAlgorithm(e): e is Error & { code: \"SUITE_B_INVALID_SIGNATURE_ALGORITHM\" } {\n  return e instanceof Error && (e as any).code === \"SUITE_B_INVALID_SIGNATURE_ALGORITHM\";\n}","tryCatchPattern":"try {\n  await fetch(url);\n} catch (e) {\n  if (e?.code === \"SUITE_B_INVALID_SIGNATURE_ALGORITHM\") {\n    // a chain signature isn't ecdsa-with-SHA256/384 - re-sign with the Suite B digest\n    resignChainForSuiteB(url);\n  } else throw e;\n}","preventionTips":["Pin -md sha256/sha384 in CA signing commands; never let tools default to sha512/sha1 for Suite B chains","Purge SHA-1-signed intermediates from served chains entirely","Grep 'Signature Algorithm' across the served chain in cert-lint CI"],"tags":["tls","x509","suite-b","signature","ecdsa","fetch","security"],"backgroundTag":null,"analyzedSha":"8c5296ac459e8252d3cd702f3fbcbb0c249d95d5","analyzedAt":"2026-08-16T08:01:58.794Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}