ERR_OSSL_EVP_UNSUPPORTEDの解決方法





[Node.jsのバージョン17以降から、OpenSSL3.0に対応するようになったため](https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V17.md#openssl-30)、既存のエコシステムに影響が生じるようになったようだ。それが原因で、Reactアプリを立ち上げるときに、`ERR_OSSL_EVP_UNSUPPORTED`というエラーに遭遇した。

今回、このエラーを解決することができたので、手順と周辺情報を共有したい。

同様のエラーに遭遇した方のお役に立てれば、幸いである。

## エラー解決手順

![https://images.unsplash.com/photo-1600880292203-757bb62b4baf?ixlib=rb-1.2.1&q=85&fm=jpg&crop=entropy&cs=srgb](https://images.unsplash.com/photo-1600880292203-757bb62b4baf?ixlib=rb-1.2.1&q=85&fm=jpg&crop=entropy&cs=srgb)

まず解決手順を簡潔に記そう。

1. NVMをインストール
2. NVMでNode.jsのバージョン16をインストール。（バージョン17はインストール済み）
3. NVMを使って、Node.js バージョン17 → 16へ切り替え

以上である。

では次に、`ERR_OSSL_EVP_UNSUPPORTED` というエラーが出現した経緯について説明する。

## ERR_OSSL_EVP_UNSUPPORTEDに遭遇した経緯



---

[Create React App](https://reactjs.org/docs/create-a-new-react-app.html#create-react-app)にある次のコードを実行した：

```bash
npx create-react-app my-app
cd my-app
npm start
```

---

npm start 後、ブラウザが立ち上がったものの、次の画面が現れた：

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552712/1de983a0-9d17-a93d-e4d3-fa5f05c9c789.png)


---

エラー遭遇後、`ERR_OSSL_EVP_UNSUPPORTED` についてググってみた。

すると「[How To Fix ERR_OSSL_EVP_UNSUPPORTED In React JS Application](https://roytuts.com/how-to-fix-err_ossl_evp_unsupported-in-react-js-application/)」という記事にたどり着き、次のエラー解決策が示されていた。

![Untitled 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552712/5e4a49ac-742b-da17-4ac6-29d1f01c913a.png)


ここで示されている、Package.json を変更する方法でも解決するのかもしれない。しかし、本質的に理解できなかったので、もう少し調べてみた。すると、[Node.js のGithubページ](https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V17.md#openssl-30) に次の記載があった。

> OpenSSL 3.0
>
>
> Node.js now includes OpenSSL 3.0, specifically [quictls/openssl](https://github.com/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](https://github.com/nodejs/node/blob/master/BUILDING.md#building-nodejs-with-fips-compliant-openssl).
>
> 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](https://www.openssl.org/blog/blog/2021/09/07/OpenSSL3.Final).
>

ポイントは、

- Node.js 17を使うと場合によっては、`ERR_OSSL_EVP_UNSUPPORTED`が現れる。
- オプションで`--openssl-legacy-provider` を使うと回避できる

ということ。

ただ、明確にNode.js 17を使う目的はなかったので、Node.js 16に落とすことで解決しようと考えた。

Node.js 17から16へ切り替えるためには、NVMというパッケージが必要になる。

## NVM

![Frame 1 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552712/a7a634bc-5330-58ee-2c7b-f65dc910decd.png)


NVMとは「Node Version Maneger」のことであり、Node.jsのバージョンを簡単に切り替えるためのツールである。NPMやNPXとちがって、Node.jsインストールしたとき同時にインストールされない。追加でインストールする必要がある。

[詳細については、NVMのGithubページをみてほしい。](https://github.com/nvm-sh/nvm)

それでは、NVMのインストール方法を見ていこう

## NVMのインストールとバージョン切り替え方法

![https://images.unsplash.com/photo-1623707430101-9e74cefe05e2?ixlib=rb-1.2.1&q=85&fm=jpg&crop=entropy&cs=srgb](https://images.unsplash.com/photo-1623707430101-9e74cefe05e2?ixlib=rb-1.2.1&q=85&fm=jpg&crop=entropy&cs=srgb)

[NVMのGithubのReadme](https://github.com/nvm-sh/nvm)を見ると、インストール方法は2種類ある。

今回は私が行ったインストール方法を紹介する。と言っても、次のコマンドを実行するだけだ。

---

NVMをインストールする：

```bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
```

これで、NVMのインストールは完了である。

つぎに、NVM経由でNode.jsをインストールする。

---

NVMでNode.js（最新）をインストールする：

```bash
nvm install node # 最新バージョンのNodeをインストール
```

NVMでNode.jsをバージョン指定してインストールする：

```bash
nvm install １６.13.0 # or 16.3.0, 12.22.1, etc
```

これで、あなたのPCには複数のNode.jsがインストールされ、任意に切り替え可能となった。どのバージョンが現在インストールされているか確認したい場合は、

---

インストール済みNode.jsバージョン確認する：

```bash
% 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バージョンを切り替える：

```bash
% nvm use １６.13.0 # １６．１３．０ の部分は使いたいバージョンにする
```

バージョンが切り替わったか確認する：

```bash
% nvm ls
->     v16.13.0 # V1７ だったが、V1６ に切り替わった
        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)![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552712/6e7e9bc9-4144-d3ad-5b03-f6d37ec2ce06.png)

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を立ち上げてみよう.

## エラーが解決したか確認

![https://images.unsplash.com/photo-1516321318423-f06f85e504b3?ixlib=rb-1.2.1&q=85&fm=jpg&crop=entropy&cs=srgb](https://images.unsplash.com/photo-1516321318423-f06f85e504b3?ixlib=rb-1.2.1&q=85&fm=jpg&crop=entropy&cs=srgb)

React App を立ち上げる：

```bash
npm start
```

ブラウザが起動して、次の画面が表示された：

![Untitled 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552712/40de265c-b178-7cd3-a845-8a97de95a612.png)

正常に起動した。やったー

## まとめ

- Node.js バージョン17以降、OpenSSL3.0に対応
- OpenSSL3.0対応により、影響の出るパッケージあり
- ERR_OSSL_EVP_UNSUPPORTED が遭遇した場合、Node.jsのバージョンを16へ変更してみる

以上である。![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552712/6f1b3388-9fef-dbe1-8722-5dce66d32a40.png)