이번에는 Node.js의 https 사용 사례를 분석하고, Node.js에서 https를 사용할 때 주의사항은 무엇인지 살펴보겠습니다.
ModuleOverview
이 모듈의 중요성은 기본적으로 강조할 필요가 없습니다. 오늘날 네트워크보안 문제가 점점 심각해지면서 웹사이트에서 HTTPS를 채택하는 것은 피할 수 없는 추세입니다.
nodejs에서는 HTTPS 관련 기능을 완성하기 위해 https 모듈이 제공됩니다. 공식 문서에 따르면 http 모듈의 사용법과 매우 유사합니다.
이 글은 주로 두 부분으로 구성되어 있습니다:
클라이언트와 서버의 예를 통해 https 모듈을 소개합니다.
신뢰할 수 없는 보안 인증서를 사용하여 웹사이트에 액세스하는 방법. (예: 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 cert2. 개인 키를 생성합니다.
openssl genrsa -out chyingp-key.pem 20483. 인증서 서명 요청을 생성합니다(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의 인증서가 자체적으로 발급되어 크롬에서 확인할 수 없기 때문입니다. 그의 안전.
이 상황을 해결하려면 다음 방법을 사용할 수 있습니다. 방문 중지: 새해를 맞아 집에 갈 표를 구하기 위해 애쓰는 동료들은 용납할 수 없다고 말합니다.마찬가지로 노드 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签名的证书还是不一样的。
类似在浏览器里访问,我们可以采取如下处理:
不建议:忽略安全警告,继续访问;
建议:将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个步骤:
下载 12306 的CA证书
将der格式的CA证书,转成pem格式
修改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中文网其它相关文章!
推荐阅读:
위 내용은 Node.js의 https 사용 사례 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!