承前
悲しい時ー!悲しい時ー!今の現場で使ってるローカル開発環境でオレオレ証明使ってて
Got error: UNABLE_TO_VERIFY_LEAF_SIGNATURE
とか出て死ぬ時ー!
そもそも何がやりたいの
ローカル開発環境を作りたい(今まで無かったらしい。マジですか?)。DockerでNode使って建てているサーバから別のDockerコンテナのAPIサーバにリクエスト送って認証通す機能があったのですが、そのAPIサーバがオレオレ証明で上記のエラーが出てました。
環境
node: 10.23.0-alpine 古いです。変えたいです。
API側: nginx + PHP
Nodeのコードはこんな感じです。
// この"baseUrl"が"https://"付いてる
axios.post(baseUrl + "/api/something/authentication", {
token: token,
httpsAgent: new https.Agent({ rejectUnauthorized: false, keepAlive: true }),
}).then((response) => {
// このloggerはconstで事前に宣言してあると思って下さい
logger.error(response.data);
if (response.data.result === "OK") {
logger.info('authentication. END');
// 認証OKなら接続を許可
next();
} else {
logger.error('authorization END');
// 認証NGなら接続を拒否
next(new Error("not authorized."));
}
}).catch((error) => {
logger.error("authorization Error.");
logger.error(error);
// 認証リクエスト異常
next(new Error("not authorized."));
});
うーん、通りそうに見えるけど・・・https.AgentのrejectUnauthorizedもfalseにしてるし・・・バージョンいくつだっけ?10.23.0か・・・そうか・・・・・・・・・10.23.0!!?!!?!?!!????!?ふっる!!!!今2024年ですが!?
node 10だとhttpsAgentのrejectUnauthorizedが機能しない?
ソース読んだんですけどよく分かりませんでした。optionsにそれらしき値はあったんですけどね。つよい人教えて。
//この辺
Agent.prototype.getName = function getName(options) {
var name = HttpAgent.prototype.getName.call(this, options);
name += ':';
if (options.ca)
name += options.ca;
// ------ 中略 ------
name += ':';
if (options.rejectUnauthorized !== undefined)
name += options.rejectUnauthorized;
// ------ 中略 ------
name += ':';
if (options.sessionIdContext)
name += options.sessionIdContext;
return name;
};
どーすればいいのー!?
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
で、通りました。めでたし。当然これだと証明書チェックを行わないので環境変数などの値を見て切り換える対応が必要。