React Nativeの開発時にyarn webをしたらERR_OSSL_EVP_UNSUPPORTEDが出た
エラーの発生経緯
1. React Nativeの開発環境の構築をyarnを使って行った
サブPCでリポジトリを落とし、yarn install --frozen-lockfileを実行して環境構築した
2. yarn webを実行する
package.jsonは以下のようになっていた
code:package.json
{
"name": "(リポジトリ名)",
"version": "1.0.0",
"main": "node_modules/expo/AppEntry.js",
"scripts": {
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios",
"web": "expo start --web"
},
"dependencies": {
"@expo/webpack-config": "^0.17.2",
"cross-env": "^7.0.3",
"expo": "~47.0.9",
"expo-status-bar": "~1.4.2",
"react": "18.1.0",
"react-dom": "18.1.0",
"react-native": "0.70.5",
"react-native-web": "~0.18.9"
},
"devDependencies": {
"@babel/core": "^7.12.9",
"@types/react": "~18.0.14",
"@types/react-native": "~0.70.6",
"typescript": "^4.6.3"
},
"private": true
}
3. ブラウザで自動的にページが開かれたタイミングでERR_OSSL_EVP_UNSUPPORTEDが発生して強制終了する
code:error(js)
opensslErrorStack: 'error:03000086:digital envelope routines::initialization error' ,
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'
原因
Node.js 17以降のOpenSSL 3.0対応の際に旧来のアルゴリズム等への制限が厳しくなったのが原因
If you hit an ERR_OSSL_EVP_UNSUPPORTED error in your application with Node.js 17, it’s likely that your application or a module you’re using is attempting to use an algorithm or key size which is no longer allowed by default with OpenSSL 3.0. A command-line option, --openssl-legacy-provider, has been added to revert to the legacy provider as a temporary workaround for these tightened restrictions.
https://nodejs.org/en/blog/release/v17.0.0/
Node.js 17を使用したアプリケーションでERR_OSSL_EVP_UNSUPPORTEDエラーに遭遇した場合は、そのアプリケーションやモジュールがOpenSSL 3.0では既に許可されていないアルゴリズムやキーサイズを使用しようとした可能性があります。旧来の仕様に戻し、それらの制限を一時的に回避できるようにするために、コマンドラインオプションの--openssl-legacy-providerが追加されました。
回避策
とりあえず、Node.jsのオプションに--openssl-legacy-providerを追加すれば良い
いくつかのサイトではexportコマンドを使用して回避する方法が紹介されているが、Windowsでは使えないのでここでは別の方法を紹介する
1. cross-envを導入していない場合は導入する
$ yarn add cross-env
2. package.jsonを開く
3. "scripts"内の"web"の値を以下のように書き換える
書き換え前:"expo start --web"
書き換え後:"cross-env NODE_OPTIONS=--openssl-legacy-provider expo start --web"
4. yarn webを使用して正しく起動するかを確かめる
ちなみにこの回避策を踏むと、Node.js 17より前のバージョンでは逆にエラーを吐くようになる
node.exe: --openssl-legacy-provider is not allowed in NODE_OPTIONS
意訳:このオプション使えねぇよ
素直に最新版にアップグレードするしかない
参考
Node.js 17以上にした際のOpenSSL互換エラー対応
/nishio/2022-03-23#623ac743aff09e00004eaed5
Node v17.0.0 (Current) | Node.js