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.
Vì 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.
- 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ủaOpenSSL 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! - 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ớiOpenSSL 3.0
, việc sử back về sử dụng NodeJS version <17 chạyOpenSSL 1.1.1
là một gợi ý. - 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à đượcOpenSSL
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.