node v20.x 에서 TLS v1.2 사용
댓글에 fetch
, axios
에선 TLS v1.2 를 사용할 수 없다고 한다.
axios 는 모르겠지만, fetch 에선 TLS v1.2 로 통신하지 못했다. 그래서 https
를 사용해서 해결했다.
node, SSL_OP_LEGACY_SERVER_CONNECT
- node v17 이상은 OpenSSL의 버전이 v3.0.7 로 올라갔다.
SSL_OP_LEGACY_SERVER_CONNECT
option 은 OpenSSL 3.0 부터 기본값이 disabled 로 변경됐다.- node.js - npm unsafe legacy renegotiation disabled - issue - Stack Overflow
https.Agent
axios 나 fetch 나 이방법으로 해결이 가능하다.
- node.js - Allow Legacy Renegotiation for NodeJs - Stack Overflow : axios 를 사용하는 code를 확인할 수 있다.
const httpsAgent = new https.Agent({
// for self signed you could also add
// rejectUnauthorized: false,
// allow legacy server
secureOptions: crypto.constants.SSL_OP_LEGACY_SERVER_CONNECT,
});
const response = await fetch(url, {
agent: httpsAgent,
});
const html = await response.text();
console.log(html)
실패: secureOptions 없이 node-fetch 에서 https.Agent 를 사용
이 방법은 적어도 windows 에서는 동작하지 않았다.
import https from "https";
const agent = new https.Agent({
rejectUnauthorized: false
});
fetch(myUrl, { agent });
아래와 같은 error 가 떴다.
reason: write EPROTO 382D0000:error:0A000152:SSL routines:final_renegotiate:unsafe legacy renegotiation disabled:c:\ws\deps\openssl\openssl\ssl\statem\extensions.c:922:
at ClientRequest.<anonymous> (D:\a\prog\typescript\nextjs\budgetbuddy\budgetbuddybrain\node_modules\node-fetch\lib\index.js:1501:11)
at ClientRequest.emit (node:events:518:28)
at TLSSocket.socketErrorListener (node:_http_client:500:9)
at TLSSocket.emit (node:events:518:28)
at emitErrorNT (node:internal/streams/destroy:169:8)
at emitErrorCloseNT (node:internal/streams/destroy:128:3)
at processTicksAndRejections (node:internal/process/task_queues:82:21) {
type: 'system',
errno: 'EPROTO',
code: 'EPROTO'
}
...
실패: https.request
처음에는 req.on('data', (chunk) => {})
부분을 실행하지 않았어서 잘 동작하는 줄 알았는데, 아니었다. 이 방법도 에러가 나온다.
const options = {
hostname: 'www.howsmyssl.com',
port: 443,
path: '/a/check',
method: 'GET',
secureProtocol: "TLSv1_2_method"
}
const req = await https.request(options)
let responseBody = '';
req.on('data', (chunk) => {
console.log(chunk)
responseBody += chunk;
});
req.on('end', () => {
console.log('end')
console.log(`BODY: ${responseBody}`);
});
req.on('error', function(e) {
console.log('problem with request: ' + e.message);
});
댓글 없음:
댓글 쓰기