关于python:Node.js服务于https

Node.js serving over https

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

证书创建,

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

在服务器中使用它,

1
2
3
4
5
6
7
8
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服务器,

1
2
3
4
5
$ node server.js

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

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

但如果我尝试使用pythons'requests'模块,如下所示请求失败,
$ python
导入请求

requests.get("https://localhost:9000/getcpuinfo")
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",)


所以我使用'verify'选项来发出请求,它仍然失败。

requests.get("https://localhost:9000/getcpuinfo", verify=False)
requests.exceptions.SSLError: ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)


我究竟做错了什么? 如何使用"请求"模块解决此问题? 不应该'验证'防止检查?


似乎有一个实用程序作为nghttp2的一部分,称为'h2load',它可以在两个协议(http / 1和http / 2)之外使用。感谢所有的答案/提示。

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


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

Requests allows you to send organic, grass-fed HTTP/1.1 requests, without the need for manual labor. There's no need to manually add query strings to your URLs, or to form-encode your POST data. Keep-alive and HTTP connection pooling are 100% automatic, thanks to urllib3.

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

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

如果确实需要从Python连接到HTTP / 2服务器,那么(也是不稳定的)hyper模块会连接到node.js HTTP / 2服务器。它目前不允许您禁用证书验证,因此它不会成为请求的替代品。


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