>  기사  >  웹 프론트엔드  >  Node.js의 https 사용 사례 분석

Node.js의 https 사용 사례 분석

php中世界最好的语言
php中世界最好的语言원래의
2018-05-24 09:53:122209검색

이번에는 Node.js의 https 사용 사례를 분석하고, Node.js에서 https를 사용할 때 주의사항은 무엇인지 살펴보겠습니다.

ModuleOverview

이 모듈의 중요성은 기본적으로 강조할 필요가 없습니다. 오늘날 네트워크보안 문제가 점점 심각해지면서 웹사이트에서 HTTPS를 채택하는 것은 피할 수 없는 추세입니다.

nodejs에서는 HTTPS 관련 기능을 완성하기 위해 https 모듈이 제공됩니다. 공식 문서에 따르면 http 모듈의 사용법과 매우 유사합니다.

이 글은 주로 두 부분으로 구성되어 있습니다:

  1. 클라이언트와 서버의 예를 통해 https 모듈을 소개합니다.

  2. 신뢰할 수 없는 보안 인증서를 사용하여 웹사이트에 액세스하는 방법. (예: 12306)

제한된 공간으로 인해 이 기사에서는 HTTPS 프로토콜 및 관련 기술 시스템에 대해 너무 많은 설명을 할 수 없습니다. 궁금한 사항이 있으면 메시지를 남겨주세요.

클라이언트 예시

요청한 주소가 https 프로토콜이라는 점을 제외하면 사용법은 http 모듈과 매우 유사합니다. 코드는 다음과 같습니다.

var https = require('https');
https.get('https://www.baidu.com', function(res){
  console.log('status code: ' + res.statusCode);
  console.log('headers: ' + res.headers);
  res.on('data', function(data){
    process.stdout.write(data);
  });
}).on('error', function(err){
  console.error(err);
});

서버 예시

다음에 HTTPS 서비스를 제공합니다. 외부 세계에서는 HTTPS 인증서가 필요합니다. 이미 HTTPS 인증서가 있는 경우 인증서 생성 단계를 건너뛸 수 있습니다. 그렇지 않은 경우 다음 단계를 참조하여 인증서를 생성할 수 있습니다

1. 인증서를 저장할 디렉터리를 만듭니다.

mkdir cert
cd cert
2. 개인 키를 생성합니다.

openssl genrsa -out chyingp-key.pem 2048
3. 인증서 서명 요청을 생성합니다(csr은 인증서 서명 요청을 의미합니다).

openssl req -new \
 -sha256
 -key chyingp-key.key.pem \
 -out chyingp-csr.pem \
 -subj "/C=CN/ST=Guandong/L=Shenzhen/O=YH Inc/CN=www.chyingp.com"
4. 인증서를 생성합니다.

openssl x509 \
 -req -in chyingp-csr.pem \
 -signkey chyingp-key.pem \
 -out chyingp-cert.pem

HTTPS 서버

코드는 다음과 같습니다.

var https = require('https');
var fs = require('fs');
var options = {
  key: fs.readFileSync('./cert/chyingp-key.pem'), // 私钥
  cert: fs.readFileSync('./cert/chyingp-cert.pem') // 证书
};
var server = https.createServer(options, function(req, res){
  res.end('这是来自HTTPS服务器的返回');
});
server.listen(3000);
저는 도메인 이름 www.chyingp.com이 없어서 먼저 로컬 호스트

127.0.0.1 www.chyingp.com을 구성했습니다.

서비스를 시작하고 브라우저에서 http://www.chyingp.com:3000을 방문하세요. 브라우저에서 인증서를 신뢰할 수 없다는 메시지가 표시됩니다. 신뢰를 클릭하고 계속 방문하세요.

고급 예: 신뢰할 수 없는 보안 인증서로 웹사이트에 액세스

다음은 우리가 가장 좋아하는 12306의 예입니다. 브라우저를 통해 12306 티켓 구매 페이지 https://kyfw.12306.cn/otn/regist/init에 접속하면 크롬에서 접속을 차단하게 되는데, 이는 12306의 인증서가 자체적으로 발급되어 크롬에서 확인할 수 없기 때문입니다. 그의 안전.

이 상황을 해결하려면 다음 방법을 사용할 수 있습니다.

방문 중지: 새해를 맞아 집에 갈 표를 구하기 위해 애쓰는 동료들은 용납할 수 없다고 말합니다.
  1. 보안 경고를 무시하고 계속 액세스하세요. 대부분의 경우 브라우저에서 허용하지만 보안 프롬프트는 여전히 표시됩니다.
  2. 12306의 CA 루트 인증서 가져오기: 브라우저는 이를 준수하고 액세스가 안전하다고 생각합니다. (실제로 12306에서 사용하는 서명 알고리즘은 보안 수준이 충분하지 않기 때문에 아직 보안 팁이 있습니다.)
  3. 예: 보안 제한 트리거

마찬가지로 노드 https 클라이언트를 통해 요청을 시작하면 같은 문제가 발생합니다. 코드는 다음과 같습니다.

var https = require('https');
https.get('https://kyfw.12306.cn/otn/regist/init', function(res){  
  res.on('data', function(data){
    process.stdout.write(data);
  });
}).on('error', function(err){
  console.error(err);
});
위 코드를 실행하면 다음과 같은 오류 메시지가 나타납니다. 이는 보안 인증서가 신뢰할 수 없으며 지속적인 액세스가 거부된다는 의미입니다.

{ 오류: TLSSocket의 오류(네이티브)

에서 인증서 체인의 자체 서명된 인증서
TLSSocket._finishInit(_tls_wrap.js:580:8)

에서 TLSWrap .ssl.onhandshakedone(_tls_wrap.js:412:38) 코드: 'SELF_SIGNED_CERT_IN_CHAIN' }

ps:个人认为这里的错误提示有点误导人,12306网站的证书并不是自签名的,只是对证书签名的CA是12306自家的,不在可信列表里而已。自签名证书,跟自己CA签名的证书还是不一样的。

类似在浏览器里访问,我们可以采取如下处理:

  1. 不建议:忽略安全警告,继续访问;

  2. 建议:将12306的CA加入受信列表;

方法1:忽略安全警告,继续访问

非常简单,将 rejectUnauthorized 设置为 false 就行,再次运行代码,就可以愉快的返回页面了。

// 例子:忽略安全警告
var https = require('https');
var fs = require('fs');
var options = { 
  hostname: 'kyfw.12306.cn',
  path: '/otn/leftTicket/init',
  rejectUnauthorized: false // 忽略安全警告
};
var req = https.get(options, function(res){ 
  res.pipe(process.stdout);  
});
req.on('error', function(err){
  console.error(err.code);
});

方法2:将12306的CA加入受信列表

这里包含3个步骤:

  1. 下载 12306 的CA证书

  2. 将der格式的CA证书,转成pem格式

  3. 修改node https的配置

1、下载 12306 的CA证书

在12306的官网上,提供了CA证书的 下载地址 ,将它保存到本地,命名为 srca.cer。

2、将der格式的CA证书,转成pem格式

https初始化client时,提供了 ca 这个配置项,可以将 12306 的CA证书添加进去。当你访问 12306 的网站时,client就会用ca配置项里的 ca 证书,对当前的证书进行校验,于是就校验通过了。

需要注意的是,ca 配置项只支持 pem 格式,而从12306官网下载的是der格式的。需要转换下格式才能用。关于 pem、der的区别,可参考 这里 。

openssl x509 -in srca.cer -inform der -outform pem -out srca.cer.pem

3、修改node https的配置

修改后的代码如下,现在可以愉快的访问12306了。

// 例子:将12306的CA证书,加入我们的信任列表里
var https = require('https');
var fs = require('fs');
var ca = fs.readFileSync('./srca.cer.pem');
var options = { 
 hostname: 'kyfw.12306.cn',
 path: '/otn/leftTicket/init',
 ca: [ ca ]
};
var req = https.get(options, function(res){ 
 res.pipe(process.stdout); 
});
req.on('error', function(err){
 console.error(err.code);
});

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

设计模式的策略模式怎样在前端中使用

怎样使用JS+H5实现微信摇一摇

위 내용은 Node.js의 https 사용 사례 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.