はじめに
node.js 16が2023年9月11日にサポート終了することに伴いnode.js 18にバージョンアップをおこなった。その際に発生した事象の対応方法についてまとめる。
発生事象
axiosで他システムとの通信時に下記のエラーが発生した。
EPROTO B8150000:error:0A000152:SSL routines:final_renegotiate:unsafe legacy renegotiation disabled
エラーの内容としては、危険なSSLのリゴシネーションが拒否されているとのこと。
node.js 18以前はSSLのリゴシネーションがデフォルトで許可されていたが、CVE-2009-3555の脆弱性に対処するためにデフォルトで許可しないように対応されたことが原因となっている。全ての通信でSSLのリゴシネーションの許可が必要になる訳ではないので、必要に応じて対処してあげる必要がある。
対応策
バージョンアップ後に動作確認を行ったところ、axiosの引数にhttpsAgentがあるので、Agentを生成してsecureOptions
に
crypto.constants.SSL_OP_LEGACY_SERVER_CONNECT
を設定してあげることで従来通りの通信ができるようになる。
axios.js
import crypto from 'crypto';
import https from 'https';
const allowLegacyRenegotiationforNodeJsOptions = {
httpsAgent: new https.Agent({
secureOptions: crypto.constants.SSL_OP_LEGACY_SERVER_CONNECT,
}),
};
function makeRequest(url: string, data: object) {
return axios({
...allowLegacyRenegotiationforNodeJsOptions,
url,
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
method: 'POST',
data: { some: 'data' },
});
}
参考