Node.jsのバージョン17以降から、OpenSSL3.0に対応するようになったため、既存のエコシステムに影響が生じるようになったようだ。それが原因で、Reactアプリを立ち上げるときに、ERR_OSSL_EVP_UNSUPPORTED
というエラーに遭遇した。
今回、このエラーを解決することができたので、手順と周辺情報を共有したい。
同様のエラーに遭遇した方のお役に立てれば、幸いである。
エラー解決手順
まず解決手順を簡潔に記そう。
- NVMをインストール
- NVMでNode.jsのバージョン16をインストール。(バージョン17はインストール済み)
- NVMを使って、Node.js バージョン17 → 16へ切り替え
以上である。
では次に、ERR_OSSL_EVP_UNSUPPORTED
というエラーが出現した経緯について説明する。
ERR_OSSL_EVP_UNSUPPORTEDに遭遇した経緯
Create React Appにある次のコードを実行した:
npx create-react-app my-app
cd my-app
npm start
npm start 後、ブラウザが立ち上がったものの、次の画面が現れた:
エラー遭遇後、ERR_OSSL_EVP_UNSUPPORTED
についてググってみた。
すると「How To Fix ERR_OSSL_EVP_UNSUPPORTED In React JS Application」という記事にたどり着き、次のエラー解決策が示されていた。
ここで示されている、Package.json を変更する方法でも解決するのかもしれない。しかし、本質的に理解できなかったので、もう少し調べてみた。すると、Node.js のGithubページ に次の記載があった。
OpenSSL 3.0
Node.js now includes OpenSSL 3.0, specifically quictls/openssl which provides QUIC support. With OpenSSL 3.0 FIPS support is again available using the new FIPS module. For details about how to build Node.js with FIPS support please see BUILDING.md.
While OpenSSL 3.0 APIs should be mostly compatible with those provided by OpenSSL 1.1.1, we do anticipate some ecosystem impact due to tightened restrictions on the allowed algorithms and key sizes.
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.For details about all the features in OpenSSL 3.0 please see the OpenSSL 3.0 release blog.
ポイントは、
- Node.js 17を使うと場合によっては、
ERR_OSSL_EVP_UNSUPPORTED
が現れる。 - オプションで
--openssl-legacy-provider
を使うと回避できる
ということ。
ただ、明確にNode.js 17を使う目的はなかったので、Node.js 16に落とすことで解決しようと考えた。
Node.js 17から16へ切り替えるためには、NVMというパッケージが必要になる。
NVM
NVMとは「Node Version Maneger」のことであり、Node.jsのバージョンを簡単に切り替えるためのツールである。NPMやNPXとちがって、Node.jsインストールしたとき同時にインストールされない。追加でインストールする必要がある。
それでは、NVMのインストール方法を見ていこう
NVMのインストールとバージョン切り替え方法
NVMのGithubのReadmeを見ると、インストール方法は2種類ある。
今回は私が行ったインストール方法を紹介する。と言っても、次のコマンドを実行するだけだ。
NVMをインストールする:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
これで、NVMのインストールは完了である。
つぎに、NVM経由でNode.jsをインストールする。
NVMでNode.js(最新)をインストールする:
nvm install node # 最新バージョンのNodeをインストール
NVMでNode.jsをバージョン指定してインストールする:
nvm install 16.13.0 # or 16.3.0, 12.22.1, etc
これで、あなたのPCには複数のNode.jsがインストールされ、任意に切り替え可能となった。どのバージョンが現在インストールされているか確認したい場合は、
インストール済みNode.jsバージョン確認する:
% nvm ls
v16.13.0 # インストール済み
-> v17.1.0 # 現在使用中のNode.jsバージョン
system
default -> node (-> v17.1.0)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v17.1.0) (default)
stable -> 17.1 (-> v17.1.0) (default)
lts/* -> lts/gallium (-> v16.13.0)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.7 (-> N/A)
lts/fermium -> v14.18.1 (-> N/A)
lts/gallium -> v16.13.0
では、次にバージョンの切り替えを行おう。
NVMでNode.jsバージョンを切り替える:
% nvm use 16.13.0 # 16.13.0 の部分は使いたいバージョンにする
バージョンが切り替わったか確認する:
% nvm ls
-> v16.13.0 # V17 だったが、V16 に切り替わった
v17.1.0
system
default -> node (-> v17.1.0)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v17.1.0) (default)
stable -> 17.1 (-> v17.1.0) (default)
lts/* -> lts/gallium (-> v16.13.0)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.7 (-> N/A)
lts/fermium -> v14.18.1 (-> N/A)
lts/gallium -> v16.13.0
これで、現在あなたのPCで使用しているNode.jsのバージョンが16へ変更となった。
それでは再びReact Appを立ち上げてみよう.
エラーが解決したか確認
React App を立ち上げる:
npm start
ブラウザが起動して、次の画面が表示された:
正常に起動した。やったー
まとめ
- Node.js バージョン17以降、OpenSSL3.0に対応
- OpenSSL3.0対応により、影響の出るパッケージあり
- ERR_OSSL_EVP_UNSUPPORTED が遭遇した場合、Node.jsのバージョンを16へ変更してみる