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')],)",)BLOCKQUOTE>
BLOCKQUOTE>所以我使用'verify'选项来发出请求,它仍然失败。
requests.get("https://localhost:9000/getcpuinfo", verify=False)
requests.exceptions.SSLError: ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)BLOCKQUOTE>
BLOCKQUOTE>我究竟做错了什么? 如何使用"请求"模块解决此问题? 不应该'验证'防止检查?
似乎有一个实用程序作为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证书。