Node.js、React.js、Webpackでデジタル署名を作成する際のエラー "error:0308010C:digital envelope routines::unsupported" の解決方法

2024-04-02

エラーメッセージ "error:0308010C:digital envelope routines::unsupported" の解説

原因

このエラーメッセージは、OpenSSL ライブラリの EVP_DigestSignInit 関数でエラーが発生したことを示しています。この関数は、デジタル署名の作成に使用されます。

エラーの原因はいくつか考えられますが、最も一般的なものは次のとおりです。

  • OpenSSL ライブラリのバージョンが古い
  • OpenSSL ライブラリが正しくインストールされていない
  • 使用しているライブラリが互換性がない

解決策

このエラーメッセージを解決するには、以下の方法を試してください。

  1. OpenSSL ライブラリを最新バージョンにアップデートする

OpenSSL ライブラリのバージョンが古い場合、このエラーが発生する可能性があります。OpenSSL の公式ウェブサイトから最新バージョンをダウンロードしてインストールしてください。

OpenSSL ライブラリが正しくインストールされていない場合、このエラーが発生する可能性があります。インストール手順を確認して、正しくインストールされていることを確認してください。

使用しているライブラリが互換性がない場合、このエラーが発生する可能性があります。使用しているライブラリのバージョンと、OpenSSL ライブラリのバージョンが互換性があることを確認してください。

  • 使用している Node.js のバージョン
  • エラーが発生したコード



const crypto = require('crypto');

const data = 'This is a message to be signed.';
const privateKey = '-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDxqG+z1/7t42f
...
-----END PRIVATE KEY-----';

const signature = crypto.sign('sha256', Buffer.from(data), {
  key: privateKey,
  format: 'pem'
});

console.log(signature.toString('hex'));

このコードを実行すると、デジタル署名のハッシュ値が出力されます。

このコードは、エラーメッセージ "error:0308010C:digital envelope routines::unsupported" の原因となる可能性のあるいくつかの問題を демонстрирует。

このコードを実行する環境で、OpenSSL ライブラリのバージョンが古い場合、このエラーが発生する可能性があります。




エラーメッセージ "error:0308010C:digital envelope routines::unsupported" の解決策の他の方法

--openssl-legacy-provider フラグを使用する

Node.js v17 以降では、OpenSSL v3 がデフォルトで使用されます。OpenSSL v3 では、いくつかの API が変更されており、古いバージョンの OpenSSL と互換性がありません。

--openssl-legacy-provider フラグを使用すると、Node.js は OpenSSL v1.x と互換性のある古い API を使用します。このフラグは、以下のコマンドを使用して指定できます。

node --openssl-legacy-provider your_script.js

NODE_OPTIONS 環境変数を設定して、--openssl-legacy-provider フラグを指定することもできます。

NODE_OPTIONS="--openssl-legacy-provider" node your_script.js

@peculiar/open-crypto ライブラリは、OpenSSL v3 と v1.x の両方に対応した API を提供します。このライブラリを使用すると、OpenSSL のバージョンに関係なく、コードを互換性を持たせることができます。

const crypto = require('@peculiar/open-crypto');

const data = 'This is a message to be signed.';
const privateKey = '-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDxqG+z1/7t42f
...
-----END PRIVATE KEY-----';

const signature = crypto.sign('sha256', Buffer.from(data), {
  key: privateKey,
  format: 'pem'
});

console.log(signature.toString('hex'));

別のデジタル署名ライブラリを使用する

crypto ライブラリ以外にも、デジタル署名を作成するためのライブラリはいくつかあります。別のライブラリを使用すると、このエラーメッセージを解決できる可能性があります。

コードを変更して、OpenSSL に依存しないようにすることもできます。ただし、これはコードの大幅な変更が必要になる可能性があります。

注意事項

上記の解決策はすべて、状況によって有効かどうかが変わってきます。どの方法を試すかは、ご自身の環境と状況に合わせて判断してください。

また、これらの解決策を試しても問題が解決しない場合は、専門家に相談することをお勧めします。


node.js reactjs webpack


Node.jsにおけるファイル操作:テキストファイルの読み込みと配列への格納

以下、その方法を2通りご紹介します。この方法は、ファイルを一度にすべて読み込み、配列に格納します。 コードは以下のようになります。このコードは以下の処理を行います。fsモジュールをrequireします。読み込むファイルのパスをfilePath変数に格納します。...


Axios の cancelToken と AbortController を使いこなす

React、Flux、React-Flux において、非同期処理を扱う上で重要な役割を果たすのが Ajax リクエストです。しかし、状況によってはリクエストをキャンセルしたり中止したりする必要が生じます。Axios は、非同期 HTTP リクエストを扱う人気のある JavaScript ライブラリですが、キャンセル機能はデフォルトでは提供されていません。...


Material-UI v5でスタイルをコンポーネントに適用する:makeStyles vs. withStyles

withStylesは、Material-UI v4以前のバージョンで使用されていた主要な方法です。コンポーネントにスタイルを適用するには、以下の手順が必要です。スタイル定義関数を用意する。この関数は、テーマオブジェクトを引数とし、スタイルオブジェクトを返す必要があります。...


React StrictMode で発生する findDOMNode の非推奨警告とその解決策

この警告メッセージは、Reactの開発モードである StrictMode で findDOMNode 関数が使用された場合に表示されます。findDOMNode は、Reactコンポーネントインスタンスから対応するDOMノードを取得するために使用される関数です。...


React で .eslintcache ファイルを削除する npm スクリプトを作成する方法

キャッシュは通常、パフォーマンスを向上させるために使用されます。ただし、コードに変更を加えた場合、ESLint はキャッシュされた結果を使用するため、変更が反映されない場合があります。このような場合は、.eslintcache ファイルを削除する必要があります。これにより、ESLint はコードを再分析し、最新の変更を反映することができます。...


SQL SQL SQL SQL Amazon で見る



Gatsbyで発生する「digital envelope routines::unsupported ... ERR_OSSL_EVP_UNSUPPORTED」エラーの原因と解決策

このエラーは、Node. js 17. 0.1 と Gatsby を一緒に使用する場合に発生することがあります。これは、Gatsby のツールが古い暗号化アルゴリズムまたは鍵サイズを使用しており、OpenSSL 3.0 でデフォルトで無効化されていることが原因です。