Node.js服务于https

时间:2017-11-14 21:32:09

标签: python node.js https python-requests

我通过https连接测试Node.js应用程序,我为localhost创建了证书,

证书创建

$ openssl genrsa -out localhost.key 2048
$ openssl req -new -x509 -key localhost.key -out localhost.cert -days 3650 -subj /CN=localhost

在服务器中使用它,

var options = { 
  key: fs.readFileSync('./localhost.key'),
  cert: fs.readFileSync('./localhost.cert'),
};    
var http2 = require('http2');
var app = express();
const server = http2.createSecureServer( options, app);
server.listen({ host: app_host, port: port});

将node.js服务器作为

启动
$ node server.js

Tested using simple curl command as,
$ curl -k https://localhost:9000/getcpuinfo
 {"hw": ...}

" -k"选项是忽略证书验证步骤。

但如果我尝试使用蟒蛇的请求'模块如下图所示请求失败,     $ python     导入请求

  
    
      

requests.get(" https://localhost:9000/getcpuinfo&#34)             requests.exceptions.SSLError :("握手不好:错误([(' SSL例程',' tls_process_server_certificate','证书验证失败')], )",)

    
  

所以我用'验证'发出请求的选项,它仍然失败。

  
    
      

requests.get(" https://localhost:9000/getcpuinfo",verify = False)           requests.exceptions.SSLError :("糟糕的握手:SysCallError(-1,'意外的EOF')",)

    
  

我做错了什么?如何使用'请求'解决此问题?模块&#39 ;?不应该验证'阻止检查?

3 个答案:

答案 0 :(得分:0)

您无法通过localhost生成https证书。

答案 1 :(得分:0)

Python请求模块不连接到HTTP / 2服务器,它只支持HTTP / 1.1:

  

请求允许您发送有机,草地 HTTP / 1.1请求,而无需手工操作。无需手动向网址添加查询字符串,也无需对POST数据进行表单编码。由于urllib3,保持活动和HTTP连接池是100%自动的。

如果您使用HTTP / 2支持编译curl,那么它将起作用。在大多数Linux发行版和MacOS上预装的curl软件包都没有,并且可能无法正常工作。

由于HTTP/2 support in Node是实验性的,并且客户支持在现代网络浏览器之外非常糟糕,我建议您不要在此时使用它,除非您专门针对网络浏览器或想要使用HTTP /支持2的Web服务器,可以同时支持HTTP / 2和HTTPS。

如果确实需要从Python连接到HTTP / 2服务器,那么连接到node.js HTTP / 2服务器的(也是不稳定的)hyper module。它目前为doesn't allow you to disable certificate verification,因此它不会成为请求的替代品。

答案 2 :(得分:0)

似乎有一个实用程序作为nghttp2的一部分称为' h2load'这两个协议的开箱即用(http / 1和http / 2)。感谢所有答案/提示。

https://nghttp2.org/documentation/h2load-howto.html#basic-usage