Node.js、React.js、Webpackでデジタル署名を作成する際のエラー "error:0308010C:digital envelope routines::unsupported" の解決方法
エラーメッセージ "error:0308010C:digital envelope routines::unsupported" の解説
原因
このエラーメッセージは、OpenSSL ライブラリの EVP_DigestSignInit
関数でエラーが発生したことを示しています。この関数は、デジタル署名の作成に使用されます。
エラーの原因はいくつか考えられますが、最も一般的なものは次のとおりです。
- OpenSSL ライブラリのバージョンが古い
- OpenSSL ライブラリが正しくインストールされていない
- 使用しているライブラリが互換性がない
解決策
このエラーメッセージを解決するには、以下の方法を試してください。
- 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