Nếu bạn là một developer web hoặc app, khi phát triển dự án có khả năng bạn sẽ gặp phải trở ngại như lỗi ERR_OSSL_EVP_UNSUPPORTED.

Trong bài viết này, chúng ta sẽ thảo luận về lỗi ERR_OSSL_EVP_UNSUPPORTED và nguyên nhân gây ra nó. Sau đó, chúng ta sẽ tìm cách khắc phục trong ba trường hợp khác nhau.

Hãy cùng bắt đầu ngay thôi!

Lỗi ERR_OSSL_EVP_UNSUPPORTED là gì?

Hãy bắt đầu bằng cách xem lỗi ERR_OSSL_EVP_UNSUPPORTED có thể trông như thế nào trong môi trường phát triển:

Thoạt nhìn, những từ như “UNSUPPORTED” và “ERR” nổi bật vì chúng có ý nghĩa rõ ràng. Tuy nhiên, để hiểu đúng về lỗi này, chúng ta cần tập trung vào phần có nội dung “OSSL”.
Từ OSSL này đại diện cho phần mềm bảo mật OpenSSL.

OpenSSL sử dụng mã hóa, nên nó phụ thuộc vào các thuật toán băm nhất định. Khi các thuật toán này phát triển với mỗi phiên bản mới của phần mềm, có thể xuất hiện sự không tương thích với các công cụ phát triển khác. Điều này dẫn đến nguyên nhân gây ra lỗi ERR_OSSL_EVP_UNSUPPORTED.

Điều gì gây ra lỗi ERR_OSSL_EVP_UNSUPPORTED?

Vấn đề này xoay quanh việc "hỗ trợ" của OpenSSL.

Mặc dù đi kèm với nhiều cải tiến, nhưng việc OpenSSL 3.0 được tích hợp cho NodeJS 17 trở đi đã khiến ứng dụng NodeJS gặp lỗi ERR_OSSL_EVP_UNSUPPORTED sau khi nâng cấp version.

Thông báo lỗi cho biết rằng có điều gì đó trong quá trình phát triển web của bạn không tương thích với các file OpenSSL mà bạn đang chạy.

Nhưng tại sao điều này lại xảy ra? Khi các thuật toán băm phát triển để cung cấp bảo mật nâng cao, các hạn chế của chúng có thể trở nên nghiêm ngặt hơn và kích thước khóa (key size) của chúng có thể thay đổi. Do đó, khi các thuật toán băm của OpenSSL được sửa đổi, sự không nhất quán giữa các công cụ phát triển của bạn có thể xảy ra.

Cách khắc phục

Như chúng ta đã thảo luận, phần mềm lập trình lỗi thời có thể là nguyên nhân gây ra lỗi ERR_OSSL_EVP_UNSUPPORTED. Vì vậy, chúng tôi sẽ hướng dẫn bạn cách nâng cấp ba công cụ phát triển khác nhau để khắc phục vấn đề này.

  1. Giải pháp tạm thời
    Nếu vì bất kỳ lý do gì mà bạn không muốn nâng cấp, bạn có thể đơn giản kích hoạt trình cung cấp legacy của OpenSSL 3.0 như một giải pháp tạm thời. Tất cả những gì bạn cần làm là sử dụng lệnh với tham số--openssl-legacy-provider. Ngoài ra, đây là 2 cách để khắc phục lỗi ERR_OSSL_EVP_UNSUPPORTED!
  2. Sử dụng Node.js version <17
    Với những ứng dụng cố gắng sử dụng một thuật toán hoặc key size không còn được phép theo với OpenSSL 3.0, việc sử back về sử dụng NodeJS version <17 chạy OpenSSL 1.1.1 là một gợi ý.
  3. Cập nhật thuật toán
    Chắc chắn khi gặp cảnh báo này, thuật toán mà bạn đang sử dụng không còn được NodeJS (version 17 trở lên) hỗ trợ nữa. Vì vậy bạn nên cập nhật hoặc sửa đổi logic thuật toán mới hơn và được OpenSSL support.

Ví dụ

Tôi đã gặp bài toán này khi nâng cấp NodeJS version 16 -> 20.

Đoạn code đơn giản với thuật toán mã hóa Blowfish (thuật toán này không còn được hỗ trợ kể từ OpenSSL 3.0):

const crypto = require('crypto');

const crypt_key = 'Dugwmmhsdng2ojutfi7Zeylhsfa1viuV';
 
const cipher = crypto.createCipheriv('bf-ecb', Buffer.from(crypt_key), '');
 
console.log(cipher.final('hex')); // 6a4ea1eee7fca0dd

Với NodeJS 16, kết quả nhận được từ đoạn code trên là 6a4ea1eee7fca0dd và không có thông báo lỗi nào.

$ node app2.js
6a4ea1eee7fca0dd

Tuy nhiên với NodeJS 18, tôi gặp lỗi:

$ node --openssl-legacy-provider app2.js
node:internal/crypto/cipher:121
    this[kHandle].initiv(cipher, credential, iv, authTagLength);
                  ^

Error: error:0308010C:digital envelope routines::unsupported
    at Cipheriv.createCipherBase (node:internal/crypto/cipher:121:19)
    at Cipheriv.createCipherWithIV (node:internal/crypto/cipher:140:3)
    at new Cipheriv (node:internal/crypto/cipher:243:3)
    at Object.createCipheriv (node:crypto:147:10)
    at Object.<anonymous> (D:\Projects\gmopoint-playbook\app2.js:15:23)
    at Module._compile (node:internal/modules/cjs/loader:1358:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1416:10)
    at Module.load (node:internal/modules/cjs/loader:1208:32)
    at Module._load (node:internal/modules/cjs/loader:1024:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:174:12) {
  library: 'digital envelope routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_EVP_UNSUPPORTED'
}

Lúc này với option --openssl-legacy-provider, ứng dụng của tôi cho kết quả đúng:

$ node --openssl-legacy-provider app2.js
6a4ea1eee7fca0dd

Cách khác

Nếu các cách trên không khả thi đối với dự án của bạn, thì phương án sử dụng thư viện của bên thứ 3 cũng là một giải pháp.

Việc này nhằm mục đích  tránh cho NodeJS version 17 trở lên phải xử lý một thuật toán đã không còn được hỗ trợ. Lúc này, việc xử lý logic sẽ được chuyển sang cho thư viện. Cá nhân tôi đánh giá đây không phải cách hay.

Ví dụ: đối với đoạn code trên, ở NodeJS 18 nếu không muốn sử dụng option --openssl-legacy-provider, tôi thay thế việc sử dụng thư viện crypto của NodeJS bằng việc crypto-js như sau:

const CryptoJS = require('crypto-js');

// Khóa mã hóa
const crypt_key = 'Dugwmmhsdng2ojutfi7Zeylhsfa1viuV';

// Mã hóa bằng thuật toán Blowfish (ECB)
const encrypted = CryptoJS.Blowfish.encrypt('', CryptoJS.enc.Utf8.parse(crypt_key), {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
});

// Chuyển đổi sang định dạng hex và in kết quả
console.log(encrypted.ciphertext.toString(CryptoJS.enc.Hex)); // 6a4ea1eee7fca0dd

Tóm tắt

Nếu bạn sử dụng OpenSSL để bảo mật các dự án phát triển của mình, bạn có thể gặp phải thông báo lỗi ERR_OSSL_EVP_UNSUPPORTED. Điều này có thể làm chậm tiến độ của bạn. May mắn thay, bạn có thể giải quyết vấn đề khó chịu này bằng một vài cách khác nhau.

Tham khảo

How To Fix the ERR_OSSL_EVP_UNSUPPORTED Error in Node.js | Built In
Learn how to get rid of the ERR_OSSL_EVP_UNSUPPORTED error once and for all in Node.js, React, Nuxt, Next.js, Gatsby and similar technologies.
How To Fix ERR_OSSL_EVP_UNSUPPORTED In React JS Application? - GeeksforGeeks
The ERROSSLEVPUNSUPPORTED error in a React JS application typically arises due to an underlying issue with the version of Node.js and OpenSSL being used. This error is commonly encountered when certain cryptographic algorithms or keys are not supported by the OpenSSL version bundled with the Node.js…
Node.js 17 is here! | OpenJS Foundation
This blog was written by Bethany Griggs, with additional contributions from the Node.js Technical Steering Committee and project collaborators.
How To Fix the ERR_OSSL_EVP_UNSUPPORTED Error (3 Methods)
If you use OpenSSL to secure your development projects, you might encounter the ERR_OSSL_EVP_UNSUPPORTED error message. Here’s how to fix the issue.