Request: 였λ₯˜: DEPTH_ZERO_SELF_SIGNED_CERT

에 λ§Œλ“  2013λ…„ 01μ›” 22일  Β·  51μ½”λ©˜νŠΈ  Β·  좜처: request/request

λ‚΄ apache2 μ„œλ²„μ—μ„œ 자체 μ„œλͺ…λœ ν…ŒμŠ€νŠΈ μΈμ¦μ„œλ₯Ό μ‚¬μš©ν•˜κ³  있으며 μš”μ²­μ„ ν˜ΈμΆœν•  λ•Œ λ‹€μŒ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

였λ₯˜: DEPTH_ZERO_SELF_SIGNED_CERT

λ‚˜λŠ” 그것을 ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•΄ μ•„λž˜μ˜ λ‹€μŒ μ½”λ“œλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” λ˜ν•œ λ°”λŠ˜ 을 μ‚¬μš©ν•˜κ³  있으며 μ΄λŠ” rejectUnauthorized=true μ˜΅μ…˜κ³Ό ν•¨κ»˜ μž‘λ™ μš”μ²­ μ‹œ ν•΄λ‹Ή ν•­λͺ©μ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€( strictSSL=falseλ₯Ό μ‹œλ„ν–ˆμ§€λ§Œ

var request = require('request'),
    needle = require('needle');

request('https://127.0.0.1', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log("REQUEST:"+body);
  } else {
    console.error("REQUEST: "+error)
  }
});

needle.get('https://127.0.0.1',{rejectUnauthorized:false},function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log("NEEDLE:"+body);
  }
});

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

rejectUnauthorized: false 이(κ°€) μž‘λ™ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. λŒ€μ‹  λ‹€μŒμ„ μΆ”κ°€ν•˜λ©΄ 였λ₯˜κ°€ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" // Avoids DEPTH_ZERO_SELF_SIGNED_CERT error for self-signed certs

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

같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ…Έλ“œ v0.10.1 및 μ΅œμ‹  μš”μ²­ 버전을 μ‚¬μš©ν•©λ‹ˆλ‹€.

v0.10.2λ₯Ό μ‚¬μš©ν•˜λŠ” λ™μΌν•œ 문제

v0.11.1-pre의 λ™μΌν•œ 문제. λ³΄μ•ˆ 도ꡬλ₯Ό 개발 μ€‘μ΄λ―€λ‘œ μœ νš¨ν•˜μ§€ μ•Šμ€ μΈμ¦μ„œλ₯Ό μˆ˜λ½ν•΄μ•Ό ν•©λ‹ˆλ‹€.

@client = tls.connect @port , @target , {rejectUnhauthorized : false}, =>
@client.write λ©”μ‹œμ§€
@client.setEncoding 'utf-8'

ν•„μš”ν•œ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

request({ url : 'https://127.0.0.1', rejectUnhauthorized : false }, function...

νŽΈμ§‘: λ‚΄κ°€ λ§Œλ“  엉터리 λŒ“κΈ€μ„ μ œκ±°ν–ˆμŠ΅λ‹ˆλ‹€.

rejectUnauthorized: false

rejectUnauthorized: false 이(κ°€) μž‘λ™ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. λŒ€μ‹  λ‹€μŒμ„ μΆ”κ°€ν•˜λ©΄ 였λ₯˜κ°€ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" // Avoids DEPTH_ZERO_SELF_SIGNED_CERT error for self-signed certs

NODE_TLS_REJECT_UNAUTHORIZED=0이 μž‘λ™ν•˜λŠ”μ§€ 확인할 수 μžˆμ§€λ§Œ rejectUnauthorized: falseλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
λ…Έλ“œ v0.10.1 μ‚¬μš©

@dankohn & @cliffano 여기에 κ·€ν•˜μ˜ μ œμ•ˆμ— λŒ€ν•΄ +1ν•©λ‹ˆλ‹€.

@case NODE_TLS_REJECT_UNAUTHORIZEDλŠ” https://github.com/joyent/node/pull/4023 에 따라 이전 λ™μž‘(잘λͺ»λœ 자체 μ„œλͺ… μΈμ¦μ„œ ν—ˆμš©)으둜 되돌리기 μœ„ν•œ νƒˆμΆœκ΅¬μΌ λΏμž…λ‹ˆλ‹€. -μ„œλͺ…λœ μΈμ¦μ„œ μž‘μ—….
λ”°λΌμ„œ RejectUnauthorized: falseλŠ” ν•΄μ•Ό ν•  일을 ν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

μš°λ¦¬λŠ” λ§Žμ€ κ²½μš°μ— {rejectUnauthorized:false} μž‘λ™ν•˜κ³  μ–΄λ–€ κ²½μš°μ—λŠ” μ½”μ–΄λ‘œ μ „νŒŒλ˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ³΄μΈλ‹€λŠ” 것을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€. λŒ€λ‹΅ν•΄μ•Ό ν•  μ§ˆλ¬Έμ€ "μš”μ²­μ΄ 이 μ˜΅μ…˜μ„ μ œλŒ€λ‘œ μ„€μ •ν•˜μ§€ μ•Šκ±°λ‚˜ 일뢀 κ²½μš°μ— μ½”μ–΄κ°€ μ˜΅μ…˜μ„ μ œλŒ€λ‘œ κ΄€μ°°ν•˜μ§€ μ•ŠλŠ” κ²½μš°κ°€ μžˆμŠ΅λ‹ˆκΉŒ?"μž…λ‹ˆλ‹€.

κ·Έ μ§ˆλ¬Έμ— λ‹΅ν•˜λ €λ©΄ μ™„μ „νžˆ μž¬ν˜„ κ°€λŠ₯ν•œ ν…ŒμŠ€νŠΈκ°€ ν•„μš”ν•©λ‹ˆλ‹€.

λΆˆν–‰νžˆλ„ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ μ—†μ§€λ§Œ 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

  • λ‚΄κ°€ λ§ν•˜λŠ” μ„œλ²„μ—λŠ” μ–΄λ–€ 이유둜 SSLv3이 ν•„μš”ν•©λ‹ˆλ‹€( 참고용 python μ½”λ“œ , Nodeμ—μ„œ λ™μΌν•œ 였λ₯˜κ°€ ν‘œμ‹œλ¨)
  • 이것이 λ‚΄κ°€ SSLv3을 κ°•μ œν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€(μš”μ²­μ—μ„œ μˆ˜ν–‰ν•  방법을 찾을 수 μ—†μŒ): https.globalAgent.options.secureProtocol = 'SSLv3_method';

μ–˜λ“€ μ•„,

λ„μ„œκ΄€μ—μ„œ μΌν•˜λŠ” λͺ¨λ“  λΆ„λ“€κ»˜ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. 일뢀 ν…ŒμŠ€νŠΈμ— 자체 μ„œλͺ…λœ μΈμ¦μ„œλ₯Ό μ‚¬μš©ν•˜λ €κ³  ν–ˆλŠ”λ° λ™μΌν•œ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. μ•„λž˜μ— 세뢀정보λ₯Ό ν¬ν•¨μ‹œμΌ°μŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ 것이 ν•„μš”ν•˜λ©΄ μ•Œλ €μ£Όμ‹­μ‹œμ˜€. strictSSLκ³Ό rejectUnauthorized의 λͺ¨λ“  쑰합을 μ‹œλ„ν–ˆμ§€λ§Œ μž‘λ™ν•˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λ…Έλ“œ 버전: 0.10.10
운영 체제: μœˆλ„μš° 7 x64
OpenSSL: Win32 1.0.1e
λ‹€μŒμ„ μ‚¬μš©ν•˜μ—¬ μƒμ„±λœ μΈμ¦μ„œ:
openssl genrsa –out priv.pem 1024
openssl req -x509 -new -key priv.pem -days 3650 -out cert.crt

μ„œλ²„ 생성 μ½”λ“œ

var https = require('https');
var express = require('express');
var app = express();
var credentials = {
    key: fs.readFileSync(__dirname + '/priv.pem', 'utf8'),
    cert: fs.readFileSync(__dirname + '/cert.crt', 'utf8')
};
var server = https.createServer(credentials, app);
server.listen(3000);

λ‹€μŒκ³Ό 같이 μš”μ²­μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

var request = require('request');
request.defaults({
    strictSSL: false, // allow us to use our self-signed cert for testing
    rejectUnauthorized: false
});
request('https://localhost:3000', function(err) {
    console.error(err); // outputs the zero_depth error
});

@dankohn 이 λ‚˜λ₯Ό μœ„ν•΄ μΌν–ˆμŠ΅λ‹ˆλ‹€.

[email protected] 및 nodejs v0.10.15 rejectUnauthorized: false μ—¬μ „νžˆ μž‘λ™ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 이 해킹을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

μœ νš¨μ„±μ„ ν™•μΈν•˜κ³  자체 μ„œλͺ… μΈμ¦μ„œλ₯Ό μˆ˜λ½ν•˜κ³  μ‹ΆκΈ° λ•Œλ¬Έμ— μΆ”μ•…ν•©λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λŠ” λ™μ•ˆ 문제λ₯Ό μ°Ύμ•˜μ§€λ§Œ λ³΅μ œν•  수 μ—†μŠ΅λ‹ˆλ‹€.

이 λ¬Έμ œκ°€ ν₯미둭게 λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. ν•œ μƒμžμ—μ„œλŠ” μž‘λ™ν•˜μ§€λ§Œ λ‹€λ₯Έ μƒμžμ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠλŠ” strictSSL: falseλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€(rejectUnauthorized=false도 μ‹€νŒ¨). @dankohn 의 μ œμ•ˆμ΄ νš¨κ³Όκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

restlerμ—μ„œλ„ μž‘λ™ν•©λ‹ˆλ‹€.

rejectUnauthorized: false (λ…Έλ“œ v0.10.26)을 μ‚¬μš©ν•˜μ—¬ μž‘λ™ν•˜κ²Œ ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

λ‹«ν˜€ 있고 λ³‘ν•©λœ κ²ƒμœΌλ‘œ μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€.
ν•˜μ§€λ§Œ λ‹€μŒμ„ μ–ΈκΈ‰ν•  κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.
일뢀 타사 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” μ—¬μ „νžˆ μš”μ²­μ— 따라 rejectUnauthorized: false 없이 μ‚¬μš©λ©λ‹ˆλ‹€.

이것이 μ—¬μ „νžˆ λ¬Έμ œμž…λ‹ˆκΉŒ?

이것은 λ„ˆλ¬΄ μ˜€λž˜λ˜μ–΄μ„œ λ‹«κ³  μžˆμŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ μ—¬μ „νžˆ λ¬Έμ œκ°€ μžˆλŠ” 경우 μ•Œλ €μ£Όμ‹œλ©΄ λ‹€μ‹œ μ—΄κ² μŠ΅λ‹ˆλ‹€.

이것은 μ—¬μ „νžˆ β€‹β€‹λ‚˜μ—κ²Œ λ¬Έμ œμž…λ‹ˆλ‹€

λ…Έλ“œ 0.10.31 / μš”μ²­: 2.42.0

μŠ€ν¬λ¦°μƒ·: http://screencast.com/t/hcmHPBlxOHc

request.defaults(
  strictSSL: false # allow us to use our self-signed cert for testing
  rejectUnauthorized: false)

request "https://localhost:8000/index.html", (err, res, body) ->
  return console.error err if err # DEPTH_ZERO_SELF_SIGNED_CERT

v0.10.20에도 μ—¬μ „νžˆ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" μ‚¬μš©; μ§€κΈˆμ€ μ†μž„μˆ˜

@frankfuu 이 '트릭'이 λ¬Έμ„œμ— μžˆμ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•˜μ‹­λ‹ˆκΉŒ?

예, 이와 같은 SSL λ¬Έμ œμ™€ #811에 λŒ€ν•œ λͺ‡ 가지 λ¬Έμ„œμ™€ ν…ŒμŠ€νŠΈλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“  μΈμ¦μ„œλ₯Ό μˆ˜λ½ν•˜κ³  μ›ν•˜λŠ” μΈμ¦μ„œλ§Œ μˆ˜λ½ν•˜λŠ” 것을 포함해야 ν•©λ‹ˆλ‹€.

@syzer κ°€λŠ₯ν• κΉŒμš”? κΈ€μŽ„, 적어도 λ‚˜λŠ” 그것이 μœ μš©ν•˜λ‹€λŠ” 것을 μ•Œμ•˜λ‹€.

μ—¬μ „νžˆ λ‚˜μ—κ²Œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. v0.10.22.

@dankohn , @cliffano "NODE_TLS_REJECT_UNAUTHORIZED" : "0"을 어디에 λ„£μ—ˆμŠ΅λ‹ˆκΉŒ?

이것은 λ‚΄ μ½”λ“œμž…λ‹ˆλ‹€(μž‘λ™ν•˜μ§€ μ•ŠμŒ).
var λΉ„λˆ„ = ν•„μš”('λΉ„λˆ„');
var url = ' https://link.to/my/url/file.wsdl ';
var args = {이메일: ' [email protected] ',
soap.createClient(url, {"NODE_TLS_REJECT_UNAUTHORIZED" : "0"}, ν•¨μˆ˜(였λ₯˜, ν΄λΌμ΄μ–ΈνŠΈ) {
client.myOperation(인수, ν•¨μˆ˜(였λ₯˜, κ²°κ³Ό) {
console.log(였λ₯˜, κ²°κ³Ό);
});
});

파일의 맨 μœ„μ— λ†“μœΌμ‹­μ‹œμ˜€.

// Avoids DEPTH_ZERO_SELF_SIGNED_CERT error for self-signed certs.
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

단 콘 mailto:[email protected]
μ „ν™”:+1-415-233-1000

2014λ…„ 10μ›” 9일 λͺ©μš”일 μ˜€μ „ 11μ‹œ 41뢄에 Thanh [email protected]이 λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

@dankohn https://github.com/dankohn , @cliffano
https://github.com/cliffano 어디에 λ„£μ—ˆμŠ΅λ‹ˆκΉŒ?
"NODE_TLS_REJECT_UNAUTHORIZED": "0"μ—μ„œ?

이것은 λ‚΄ μ½”λ“œμž…λ‹ˆλ‹€(μž‘λ™ν•˜μ§€ μ•ŠμŒ).
var λΉ„λˆ„ = ν•„μš”('λΉ„λˆ„');
var url = ' https://link.to/my/url/file.wsdl ';
var args = {이메일: ' [email protected] ',
'00-14-22-01-23-45'};
soap.createClient(url, {"NODE_TLS_REJECT_UNAUTHORIZED" : "0"},
ν•¨μˆ˜(였λ₯˜, ν΄λΌμ΄μ–ΈνŠΈ) {
client.myOperation(인수, ν•¨μˆ˜(였λ₯˜, κ²°κ³Ό) {
console.log(였λ₯˜, κ²°κ³Ό);
});
});

β€”
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/mikeal/request/issues/418#issuecomment -58528954.

@dankohn : μ—¬μ „νžˆ 같은 였λ₯˜ λ©”μ‹œμ§€κ°€ λ‚˜νƒ€λ‚©λ‹ˆλ‹€. λ‚΄ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
var λΉ„λˆ„ = ν•„μš”('λΉ„λˆ„');
var url = ' https://link.to/my/url/file.wsdl ';
var args = {이메일: ' [email protected] ',
soap.createClient(url, {rejectUna Authorized:false }, function(err, client) {
client.myOperation(인수, ν•¨μˆ˜(였λ₯˜, κ²°κ³Ό) {
console.log(였λ₯˜, κ²°κ³Ό);
});
});

@apiton : 이미 ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? μ—¬μ „νžˆ 같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

λ‚΄ URL이 " https://www. "둜 μ‹œμž‘ν•˜μ§€ μ•Šμ§€λ§Œ " https://link. "κ°€ 문제일 수 μžˆμŠ΅λ‹ˆκΉŒ?

@jksdua μ˜ˆμ‹œκ°€ ν‰λ²”ν–ˆκ³  였λ₯˜λ₯Ό μž¬ν˜„ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

@fourq 및 @jksdua 문제λ₯Ό λͺ¨λ‘ ν•΄κ²°ν•˜λ €λ©΄ λ‹€μŒμ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

var request = require('request');
var request = request.defaults({
  strictSSL: false,
  rejectUnauthorized: false
});

λ˜λŠ”

var request = require('request').defaults({
  strictSSL: false,
  rejectUnauthorized: false
});

defaults λ©”μ„œλ“œλŠ” ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
λ”°λΌμ„œ κΈ°λ³Έ μ˜΅μ…˜μ΄ μž‘λ™ν•˜λ €λ©΄ request λ³€μˆ˜λ₯Ό ν•¨μˆ˜μ— ν• λ‹Ήν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ˜ν•œ @frankfuu rejectUnauthorized μ˜΅μ…˜μœΌλ‘œ μš”μ²­μ„ μ‚¬μš©ν•˜λŠ” λ°©λ²•μ˜ 예λ₯Ό μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

μ—¬μ „νžˆ λ¬Έμ œκ°€ μžˆλŠ” 경우 λ‹€λ₯Έ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό λ°›κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

@thadeuszlay 방금 λ‹€μŒμ„ μ‚¬μš©ν•˜λŠ” 데 도움을 μš”μ²­
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

μ—¬μ „νžˆ 도움이 ν•„μš”ν•˜μ‹­λ‹ˆκΉŒ?

μ°Έκ³  버전 2.45.0 μš”μ²­μ„ μ‚¬μš©ν•˜λ©΄ strictSSL λ₯Ό false둜 μ„€μ •ν•˜λ©΄ rejectUnauthorized falseκ°€ λ©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ strictSSL λ₯Ό false 둜 μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ rejectUnauthorized 기본값은 undefined μž…λ‹ˆλ‹€.
λ‚˜λŠ” 그것이 μ›ν•˜λŠ” 행동이라고 κ°€μ •ν•©λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” @seanstrom

λ‚΄κ°€ λ§Œλ“  μ˜ˆμ œλŠ” κΈ°μ–΅λ‚˜μ§€ μ•Šμ§€λ§Œ @fourq κ°€ 가지고 있던 것과 λΉ„μŠ·ν–ˆμŠ΅λ‹ˆλ‹€.

request.defaults(
μ—„κ²©ν•œ SSL: 거짓
RejectUnauthorized: 거짓)

"트릭"을 μ‚¬μš©ν•œ μ΄ν›„λ‘œ λ¬Έμ œκ°€ μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

@frankfuu
@fourq 의 예λ₯Ό 기반으둜 μœ„μ˜ μ†”λ£¨μ…˜μ„ 생각해 λƒˆμŠ΅λ‹ˆλ‹€.
https://github.com/mikeal/request/issues/418#issuecomment -58959393

그것이 λ‹Ήμ‹ μ—κ²Œ νš¨κ³Όκ°€ μžˆλŠ”μ§€ μ‚΄νŽ΄λ³΄κ³  μ•Œ 수 μžˆμŠ΅λ‹ˆκΉŒ?

μ°Έκ³  버전 2.45.0의 Requestμ—μ„œλŠ” strictSSL을 false둜 μ„€μ •ν•  수 있으며, 그러면 rejectUnauthorized도 falseκ°€ λ©λ‹ˆλ‹€.

RejectUnauthorized 없이 이전에 μ‹€νŒ¨ν•œ wfmμž…λ‹ˆλ‹€.

@andig λ‚΄ μ±„νŒ… μš©μ–΄κ°€ μ•½κ°„ λͺ¨ν˜Έν•˜μ—¬ λ‹€μŒκ³Ό 같이 λ§ν•˜κ³  μžˆμŒμ„ ν™•μΈν•©λ‹ˆλ‹€.
strictSSL: false λ₯Ό μ‚¬μš©ν•˜λ©΄ νš¨κ³Όμ μž…λ‹ˆλ‹€.
μ˜³μ€?

@andig λ‚΄ μ±„νŒ… μš©μ–΄κ°€ μ•½κ°„ λͺ¨ν˜Έν•˜μ—¬ λ‹€μŒκ³Ό 같이 λ§ν•˜κ³  μžˆμŒμ„ ν™•μΈν•©λ‹ˆλ‹€.

@seanstrom μœ μΉ˜ν•œ μ–Έμ–΄λ₯Ό μš©μ„œν•˜μ‹­μ‹œμ˜€.

strictSSL μ‚¬μš©: falseκ°€ νš¨κ³Όμ μž…λ‹ˆλ‹€. μ˜³μ€?

μ˜³μ€. RejectUnauthorized: falseκ°€ ν•„μš”ν•œ 이전에 μ‹€νŒ¨ν•œ SSL 연결이 이제 strictSSL: falseμ—μ„œλ§Œ μž‘λ™ν•©λ‹ˆλ‹€.

이 문제λ₯Ό μ’…λ£Œν•˜κ² μŠ΅λ‹ˆλ‹€.
이것이 μ—¬μ „νžˆ λˆ„κ΅°κ°€μ—κ²Œ 문제라면 λ‹€μ‹œ μ—΄κ² μŠ΅λ‹ˆλ‹€.
μ•Œλ € μ€˜μš”

여기에 μ—¬μ „νžˆ 문제 v10.0.32
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"을 μ‹œλ„ν•  λ•Œ;
λ‚˜λŠ” μ–»λ‹€:
_stream_readable.js:748
throw new Error('μ§€κΈˆμ€ 이전 λͺ¨λ“œλ‘œ μ „ν™˜ν•  수 μ—†μŠ΅λ‹ˆλ‹€.');

@webduvet μ½”λ“œ μƒ˜ν”Œμ„ μ œκ³΅ν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?
이 문제λ₯Ό λ””λ²„κΉ…ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€.

@seanstrom ν™•μ‹€νžˆ, nodejs λ¬Έμ„œμ˜ 맀우 κ°„λ‹¨ν•œ μƒ˜ν”Œμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

 process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
 var tls = μš”κ΅¬('tls');
 var fs = μš”κ΅¬('fs');
 λ³€μˆ˜ μ˜΅μ…˜ = {
 μΈμ¦μ„œ: fs.readFileSync('test-cert.pem'),
 μ—„κ²©ν•œ SSL: 거짓
 };
 var cleartextStream = tls.connect(8000, μ˜΅μ…˜, ν•¨μˆ˜() {
 console.log('ν΄λΌμ΄μ–ΈνŠΈ μ—°κ²°',
 cleartextStream.authorized? '승인된' : 'μŠΉμΈλ˜μ§€ μ•Šμ€');
 process.stdin.pipe(cleartextStream);
 ν”„λ‘œμ„ΈμŠ€.stdin.resume();
 });

@seanstrom 자체 μ„œλͺ… μΈμ¦μ„œλ₯Ό μ‚¬μš©ν•˜λ €κ³  ν•  λ•Œ μ—¬μ „νžˆ 이 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

λ¬Έμ œλŠ” rejectUnauthorized: falseκ°€ λͺ¨λ“  확인을 λ•λ‹ˆλ‹€. PEMμ΄λ‚˜ ν‚€ λ˜λŠ” ν—ˆμš© κ°€λŠ₯ν•œ μΈμ¦μ„œ λͺ©λ‘μ„ μ œκ³΅ν•˜μ§€ μ•Šμ•„λ„ μž‘λ™ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μΈμ¦μ„œ(λ˜λŠ” ν‚€)λ₯Ό μ œκ³΅ν•˜κ³  μš”μ²­ 엔진 지원이 μ‹€μ œλ‘œ μΈμ¦μ„œ λͺ©λ‘μ„ ν™•μΈν•˜λ„λ‘ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

예, rejectUnauthorized: false λ˜λŠ” strictSSL: false λŠ” λͺ¨λ“  μΈμ¦μ„œ 확인을 ν•΄μ œν•˜κΈ° λ•Œλ¬Έμ— 이상적인 μ†”λ£¨μ…˜μ΄ μ•„λ‹™λ‹ˆλ‹€. 자체 μ„œλͺ…λ˜κ±°λ‚˜ μΈμ‹λ˜μ§€ μ•ŠλŠ” μΈμ¦μ„œμ— λŒ€ν•΄ 자체 CAλ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μˆ˜ν–‰ν•˜λŠ” 방법에 λŒ€ν•œ μ˜ˆλŠ” HTTPS ν…ŒμŠ€νŠΈλ₯Ό μ‚΄νŽ΄λ³΄μ‹­μ‹œμ˜€. https://github.com/request/request/blob/master/tests/test-https.js

κ³ λ§ˆμ›Œ, λ‚˜μΌλ Œ. κ·Έ ν…ŒμŠ€νŠΈλŠ” μš°λ¦¬κ°€ 무엇을 잘λͺ»ν•˜κ³  μžˆλŠ”μ§€ λͺ…ν™•νžˆ ν•˜λŠ” 데 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ¨Όμ € 자체 μ„œλͺ…λœ CAλ₯Ό λ§Œλ“  λ‹€μŒ ν•΄λ‹Ή CAλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλ²„ μΈμ¦μ„œμ— μ„œλͺ…ν•˜λŠ” λŒ€μ‹  자체 μ„œλͺ…λœ μΈμ¦μ„œλ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. 그게 μš°λ¦¬κ°€ ν•˜λŠ” 것이라고 μƒκ°ν–ˆμ§€λ§Œ μš°λ¦¬λŠ” 그렇지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

원리λ₯Ό μ΄ν•΄ν•˜κ³  싢은 뢄듀을 μœ„ν•΄.

https://nodejs.org/dist/v0.12.9/docs/api/tls.html#tls_tls_connect_options_callback

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "1";
var tls = require('tls');
var fs = require('fs');
var constants = require('constants');
var util = require('util');

var options = {
    host: 'localhost',
    strictSSL: true,
    ca: [fs.readFileSync('trusted1.pem'), fs.readFileSync('trusted2.pem') ],
    rejectUnauthorized: true, // Trust to listed certificates only. Don't trust even google's certificates.
    secureOptions: constants.SSL_OP_NO_SSLv3 | constants.SSL_OP_NO_SSLv2 | constants.SSL_OP_NO_TLSv1 | constants.SSL_OP_NO_TLSv1_1,
    secureProtocol: 'SSLv23_method',
    ciphers: 'ECDHE-RSA-AES128-SHA256'
};

var socket = tls.connect(3001, options, function() {
    console.log('client connected',
        socket.authorized ? 'authorized' : 'unauthorized',
        socket.encrypted ? 'encrypted' : 'unencrypted',
        '\nCipher: ' + util.inspect(socket.getCipher()),
        '\nCert Info: \n' + util.inspect(socket.getPeerCertificate(true)));
    //process.stdin.pipe(socket);
    //process.stdin.resume();
});

μ‹€μ œλ‘œ λͺ¨λ“  λ¬Έμ œλŠ” ν΄λΌμ΄μ–ΈνŠΈ μ‹œμŠ€ν…œμ— SSL μΈμ¦μ„œ ꡬ성이 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.
λ¨Όμ € μ‹œμŠ€ν…œ openSsl을 κ΅¬μ„±ν•œ λ‹€μŒ process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"에 λŒ€ν•œ get λ˜λŠ” post μš”μ²­μ„ μΆ”κ°€ν•˜μ‹­μ‹œμ˜€. 그것은 inshaa μ•ŒλΌλ₯Ό μž‘λ™ ν•  κ²ƒμž…λ‹ˆλ‹€

μ•ˆλ…•ν•˜μ„Έμš”,

λΉ„μŠ·ν•œ λ¬Έμ œμ— μ§λ©΄ν•˜κ³  μžˆμ§€λ§Œ "GET"이 μ œλŒ€λ‘œ μž‘λ™ν•˜λŠ” λ™μ•ˆ "POST" λ°©λ²•μ—μ„œλ§Œ λ°œμƒν•©λ‹ˆλ‹€. μžμ„Έν•œ μ •λ³΄λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈ μ½”λ“œ:

`
var ν”„λ¦¬μŠ€λΉ„ = μš”κ΅¬('ν”„λ¦¬μŠ€λΉ„');
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

var CONF = process.env['CONF'];
var ꡬ성 = μš”κ΅¬('../config/' + CONF);
var 데이터 = require('../tests_data/batch_data.json');

frisby.globalSetup({
μš”κ΅¬: {
μ—„κ²©ν•œ SSL: 거짓,
κ±°λΆ€ κΆŒν•œ μ—†μŒ: 거짓,
헀더: {'승인': '토큰'},
inspectOnFailure: 사싀
}
});

frisby.create('ν…ŒμŠ€νŠΈ#1: ν™”μ°½ν•œ λ‚  μ‹œλ‚˜λ¦¬μ˜€')
.post(config.api_url + data.api_endpoint, data.test_strace, {rejectUnauthorized: false}, {json: true})
.inspectHeaders()
.inspectRequest()
.inspectJSON()
.expectJSON(data.batch_test_response_1)
.던져 올림();
`

μ‹€ν–‰ 였λ₯˜:
였λ₯˜-1
Message: Error: Error parsing JSON string: Unexpected token D Given: Destination URL may be down or URL is invalid, Error: ESOCKETTIMEDOUT Stacktrace: Error: Error parsing JSON string: Unexpected token D Given: Destination URL may be down or URL is invalid, Error: ESOCKETTIMEDOUT at _jsonParse (/usr/src/app/frisby_api/node_modules/frisby/lib/frisby.js:1219:11) at null.<anonymous> (/usr/src/app/frisby_api/node_modules/frisby/lib/frisby.js:650:20) at null.<anonymous> (/usr/src/app/frisby_api/node_modules/frisby/lib/frisby.js:1074:43) at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)

였λ₯˜-2

Message: TypeError: Cannot read property 'headers' of undefined Stacktrace: TypeError: Cannot read property 'headers' of undefined at Frisby.<anonymous> (/usr/src/app/frisby_api/node_modules/frisby/lib/frisby.js:894:20) at Frisby.<anonymous> (/usr/src/app/frisby_api/node_modules/frisby/lib/frisby.js:940:8) at null.<anonymous> (/usr/src/app/frisby_api/node_modules/frisby/lib/frisby.js:1112:18) at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)

μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ μ—¬κΈ°μ—μ„œ 무엇을 μ—…λ°μ΄νŠΈν•΄μ•Ό ν•©λ‹ˆκΉŒ?

감사 ν•΄μš”

이것을 μΆ”κ°€ν•˜λ©΄ ν•΄κ²°ν•΄μ•Ό ν•©λ‹ˆλ‹€.

https.globalAgent.options.rejectUnauthorized = 거짓;

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