node-forge начинался как реализация TLS на JavaScript, а сегодня его используют в основном ради компонентов PKI: генерации и разбора сертификатов X.509 и CSR, чтения и записи пакетов PKCS#12, шифрования и подписей RSA, а также парсера ASN.1. Он одинаково работает в браузерах и Node.js и не содержит нативного кода.
Эллиптические кривые, кроме Ed25519, не поддерживаются. forge.pki предоставляет только rsa и ed25519, и проверка подтвердила следствие: certificateFromPem() на сертификате ECDSA выбрасывает Cannot read public key. OID is not RSA., а publicKeyFromPem() на открытом ключе EC выбрасывает Cannot read public key. Unknown OID. — хотя собственный парсер ASN.1 в forge без проблем разбирает те же байты. Коду, который разбирает сертификаты, встречающиеся на практике, ключи ECDSA попадаются постоянно, и для них нужен другой парсер; X509Certificate из node:crypto и декодер сертификатов работают с обоими типами ключей.
С RSA библиотека без проблем совместима, если параметры совпадают. Подписи PKCS#1 v1.5 и PSS, созданные в forge, прошли проверку в node:crypto; для PSS дайджест, дайджест MGF1 и длина соли должны совпадать на обеих сторонах, и forge требует указать все три, как это делает пример. Открытые ключи загружаются из PEM с SPKI и PKCS#1 и из PEM-сертификатов, закрытые ключи — из PKCS#8, зашифрованного PKCS#8, PKCS#1 и PKCS#12; чтобы увидеть содержимое пакетов, откройте их в инспекторе PFX.
Подписи Ed25519 из forge при одном и том же seed побайтно совпали с подписями node:crypto. Закрытый ключ в forge хранится в расширенной 64-байтовой форме: сначала seed, затем открытый ключ, поэтому библиотекам, которые ожидают 32-байтовый seed, нужна только первая половина.
Проверка подписей в forge уже не раз страдала от нестрогого разбора, и один случай всё ещё не закрыт. Бюллетень безопасности GHSA-86w9-cpqp-85rv (CVE-2026-85393), опубликованный в сентябре 2026 года без релиза с исправлением, сообщает, что проверка RSA PKCS#1 v1.5 в версиях до 1.4.0 включительно игнорирует лишние элементы внутри идентификатора алгоритма в DigestInfo, из-за чего подписи можно подделать для ключей с малой открытой экспонентой, например 3. В ходе нашей проверки это поведение воспроизвелось: правильно дополненный блок с лишним элементом в этом месте прошёл проверку в forge и был отклонён в node:crypto. Пока исправление не выпущено, проверяйте подписи PKCS#1 v1.5 через node:crypto или WebCrypto и не используйте ключи RSA с экспонентой 3. Предыдущую серию проблем исправила сама версия 1.4.0: в ней и лишнее поле после дайджеста, и неканонические подписи Ed25519 были отклонены, а в версиях до 1.3.0 были более ранние ошибки, позволявшие подделывать подписи (CVE-2022-24771, CVE-2022-24772).