Request: 였λ₯˜: μΈμ¦μ„œ 체인의 자체 μ„œλͺ…λœ μΈμ¦μ„œ

에 λ§Œλ“  2016λ…„ 02μ›” 05일  Β·  14μ½”λ©˜νŠΈ  Β·  좜처: request/request

Charles Proxyλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλ²„μ— λŒ€ν•œ μš”μ²­μ„ λΆ„μ„ν•˜λ €κ³  ν•©λ‹ˆλ‹€. μ„œλ²„λŠ” TSL을 μ‚¬μš©ν•˜λ―€λ‘œ λͺ…ν™•ν•œ νŠΈλž˜ν”½μ„ λ³Ό 수 μžˆλŠ” 고전적인 κ°€μ§œ μΈμ¦μ„œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

NodeJS / μš”μ²­μ΄ 그것을 μ’‹μ•„ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λ‚΄ μŠ€ν¬λ¦½νŠΈκ°€ μ‹€ν–‰λ˜μ§€ μ•Šκ³  ν•΄λ‹Ή 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

μ–΄λ–»κ²Œ μš°νšŒν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

                console.log('Response status: ' + response.statusCode);
                                                          ^
TypeError: Cannot read property 'statusCode' of undefined
    at Request._callback (/xxx:88:59)
    at self.callback (/xxx:199:22)
    at Request.emit (events.js:107:17)
    at Request.onRequestError (/xxx:821:8)
    at ClientRequest.emit (events.js:107:17)
    at TLSSocket.socketErrorListener (_http_client.js:271:9)
    at TLSSocket.emit (events.js:107:17)
    at TLSSocket.<anonymous> (_tls_wrap.js:942:18)
    at TLSSocket.emit (events.js:104:17)
    at TLSSocket._finishInit (_tls_wrap.js:460:8)
Error: Error: self signed certificate in certificate chain
Help (please use Stackoverflow)

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ„€λͺ… κ°μ‚¬ν•©λ‹ˆλ‹€. 관심 μžˆλŠ” μ‚¬λžŒμ΄ μžˆμ„ 경우λ₯Ό λŒ€λΉ„ν•˜μ—¬ κ°€μ§œ μΈμ¦μ„œ 문제λ₯Ό ν”Όν•˜λŠ” 방법을 μ•Œμ•„λƒˆμŠ΅λ‹ˆλ‹€.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

이λ₯Ό 톡해 κ°€μ§œ SSL 인증을 μ‚¬μš©ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ 톡신을 검사할 수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  14 λŒ“κΈ€

이 경우 response λŠ” μ •μ˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
응닡을 μ •μ˜ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
응닡은 μ‹€μ œ 응닡이 λ„μ°©ν•œ κ²½μš°μ—λ§Œ μ •μ˜λ©λ‹ˆλ‹€.
일뢀 μ—°κ²° 였λ₯˜κ°€ μžˆλŠ” 경우 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€.

μ •μ˜ν•  error λ˜λŠ” response.statusCode κ°€ 400보닀 ν¬κ±°λ‚˜ 같은지 ν™•μΈν•˜μ‹­μ‹œμ˜€.

이 μ‚¬μš©μ„ λ””λ²„κ·Έν•˜λ €λ©΄

env NODE_DEBUG="*" node asdf.js

μ„€λͺ… κ°μ‚¬ν•©λ‹ˆλ‹€. 관심 μžˆλŠ” μ‚¬λžŒμ΄ μžˆμ„ 경우λ₯Ό λŒ€λΉ„ν•˜μ—¬ κ°€μ§œ μΈμ¦μ„œ 문제λ₯Ό ν”Όν•˜λŠ” 방법을 μ•Œμ•„λƒˆμŠ΅λ‹ˆλ‹€.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

이λ₯Ό 톡해 κ°€μ§œ SSL 인증을 μ‚¬μš©ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ 톡신을 검사할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚΄ 였λ₯˜λ„ λΉ„μŠ·ν–ˆμ§€λ§Œ μ§€κΈˆμ€ κ°μ‚¬ν•©λ‹ˆλ‹€ @nmaxcom

였λ₯˜: 첫 번째 μΈμ¦μ„œλ₯Ό 확인할 수 μ—†μŠ΅λ‹ˆλ‹€.
였λ₯˜ μ‹œ(κΈ°λ³Έ)
TLSSocketμ—μ„œ.(_tls_wrap.js:929:36)
TLSSocket.emitμ—μ„œ(events.js:104:17)
TLSSocket._finishInitμ—μ„œ (_tls_wrap.js:460:8)

λ˜λŠ” 합법적인 CAμ—μ„œ μ„œλͺ…ν•œ μΈμ¦μ„œλ₯Ό μ•”ν˜Έν™”ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
자체 μ„œλͺ…λœ μΈμ¦μ„œλŠ” 이제 μ˜λ―Έκ°€ μ—†μŠ΅λ‹ˆλ‹€.

request.get({ uri: 'https://mydocker.com/v2/_catalog', rejectUnauthorized: false }

자체 μ„œλͺ…λœ CA의 경우 'rejectUnauthorized = false'λ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
623ν–‰μ—μ„œ request.jsλ₯Ό ν™•μΈν•˜κ³  node.jsμ—μ„œ _tls_wrap.jsλ₯Ό ν™•μΈν•©λ‹ˆλ‹€.

더 λ‚˜μ€ λŒ€μ•ˆμ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
a) λ‘œλ“œ λ°ΈλŸ°μ„œμ—μ„œ SSL μ’…λ£Œ μˆ˜ν–‰
b) 무료 μΈμ¦μ„œ μ‚¬μš©

μ΄λŸ¬ν•œ λ°©μ‹μœΌλ‘œ λͺ¨λ“  ν™˜κ²½μ—μ„œ 단일 ꡬ성을 κ°–κ²Œ λ©λ‹ˆλ‹€.
배포에 λŒ€ν•΄ 더 높은 확신을 κ°–κ³  더 일찍 였λ₯˜λ₯Ό 필터링할 수 μžˆμŠ΅λ‹ˆλ‹€.

options.rejectUnauthorized = false μŠΉμΈλ˜μ§€ μ•Šμ€ μž‘μ—… κ±°λΆ€
ν•˜μ§€λ§Œ options.agentOptions.rejectUnauthorized = false

이유λ₯Ό λͺ°λΌμš” 😒

https://github.com/request/request/blob/v2.81.1/request.js#L257 -L259

μ£„μ†‘ν•©λ‹ˆλ‹€. μ½”λ“œλ§Œ λ³΄μ„Έμš”. strictSSL λŠ” rejectUnauthorized 의 별칭일 λΏμž…λ‹ˆλ‹€.
λ‚˜μœ 이름이라고 ν•΄μ•Ό ν•˜λ‚˜, κ·Έλƒ₯ rejectUnauthorized 😭

μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” λ™μ•ˆ 이 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.
ꡬ문 뢄석 였λ₯˜: ꡬ문 였λ₯˜, 예기치 μ•Šμ€ 'var'(T_VAR), C:xampphtdocsPHPIMAPadminindex.php의 파일 끝이 146행에 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

var μ•Œλ¦¬λ―Έ = require('메일 μ•Œλ¦¬λ―Έ');
var imap = {
μ‚¬μš©μž 이름: "anandlintas2017",
λΉ„λ°€λ²ˆν˜Έ: "xxxxxxxxx",
호슀트: "imap.gmail.com",
포트: 993, // imap 포트
secure: true // λ³΄μ•ˆ μ—°κ²° μ‚¬μš©
};

μ•Œλ¦¬λ―Έ(imap).on('메일',ν•¨μˆ˜(메일){console.log(메일);}).start();
?>

RejectUnauthorized=falseλ₯Ό μ„€μ •ν•˜λ„λ‘ μ œμ•ˆν•˜λŠ” μ‚¬λžŒλ“€μ˜ 경우 자체 μ„œλͺ…λœ μΈμ¦μ„œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλ‘œ μ•”ν˜Έν™”λœ 연결이 μžˆμ–΄μ•Ό ν•˜λŠ” λ‚΄λΆ€ μ„œλ²„κ°€ μžˆλŠ” κ²½μš°μ—λŠ” rejectUnauthorizedλ₯Ό false둜 μ„€μ •ν•˜λ©΄ 였λ₯˜κ°€ μ€‘μ§€λ˜μ§€λ§Œ λ‚΄ 연결은 MITM 곡격에 100% μ·¨μ•½ν•©λ‹ˆλ‹€. 이것이 nodejs tls 라이브러리의 버그이며 어디에도 μˆ˜μ • 사항을 찾을 수 μ—†μŠ΅λ‹ˆλ‹€. 그것에 λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜μ‹­μ‹œμ˜€. AM λ‚΄κ°€ 여기에 λ­”κ°€λ₯Ό λ†“μΉ˜κ³  μžˆμŠ΅λ‹ˆλ‹€! !!!!! λ‚΄κ°€ ν‹€λ Έλ‹€λ©΄ μ €λ₯Ό μˆ˜μ •ν•˜μ‹­μ‹œμ˜€ !!

rejectUnauthorized works in options.rejectUnauthorized = false
but not in options.agentOptions.rejectUnauthorized = false

λ‘˜ λ‹€ λ‚˜λ₯Ό μœ„ν•΄ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€

request.get({ uri: 'https://s3.amazonaws.com/...',
    rejectUnauthorized: false,
    // strictSSL: false,
    proxy: '127.0.0.1:8080',
    agentOptions: {
        rejectUnauthorized: false,
        // strictSSL: false,
    },
}, (...args) => {
    console.log(args);
    process.exit();
});

PS SSL λΉ„ν™œμ„±ν™” ν”Œλž˜κ·Έκ°€ μΌœμ§„ μƒνƒœμ—μ„œ ELECTRON λ‚΄μ—μ„œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.

μ €μ—κ²Œ Kaspersky λ°”μ΄λŸ¬μŠ€ 백신을 λΉ„ν™œμ„±ν™”ν•˜λ©΄ λ¬Έμ œκ°€ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

https://github.com/request/request/issues/2061#issuecomment -182573171 일반적인 μ§ˆλ¬Έμ— λŒ€ν•œ 닡변인 것 κ°™μŠ΅λ‹ˆλ‹€.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

νš¨κ³Όκ°€ μ—†μŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰