Node.js 10 HTTPS服务器拒绝连接

时间:2018-08-29 10:22:44

标签: node.js ssl curl https openssl

我有简单的Node.js HTTPS服务器

{% load static i18n humanize accounts cache %}
{% get_current_language as LANGUAGE_CODE %}

{% cache 3600 user_info user.pk LANGUAGE_CODE size %}
<a class="user-info" href="{{ user.get_absolute_url }}">
    <div class="user-avatar-wrapper">
        <span class="online-status {{ user.online_status }}"></span>
        {% if size %}
            {% avatar user size class="avatar" id="user_avatar" %}
        {% else %}
            {% avatar user 40 class="avatar" id="user_avatar" %}
        {% endif %}
    </div>
    <span>
        {{ user }}
        <small>{{ user.groups.all|join:", " }}</small>
    </span>
</a>
{% endcache %}

我在嵌入式系统上使用const https = require('https'); const fs = require('fs'); const config = { key: fs.readFileSync('cert/server-key.pem'), cert: fs.readFileSync('cert/server-crt.pem'), ca: fs.readFileSync('cert/ca-crt.pem'), }; const server = https.createServer(config, ((req, res) => { console.log('Got request'); res.end(); })); server.listen(3333);

curl

当我使用Node.js而不是版本10时-一切正常。

Node.js v8.2.1

上运行的HTTPS服务器
# curl -V
curl 7.52.1 (arm-unknown-linux-gnu) libcurl/7.52.1 wolfSSL/3.9.8
Protocols: file ftp ftps http https smtp smtps telnet tftp 
Features: IPv6 Largefile SSL UnixSockets  

Node.js v10.1.0

上运行的HTTPS服务器
# curl -k -v "https://10.43.11.128:3333/"
*   Trying 10.43.11.128...
* TCP_NODELAY set
* Connected to 10.43.11.128 (10.43.11.128) port 3333 (#0)
* SSL connected
> GET / HTTP/1.1
> Host: 10.43.11.128:3333
> User-Agent: curl/7.52.1
> Accept: */*

Node.js 10在HTTPS方面发生了哪些变化?我怀疑我必须更改SSL设置,但是我确定如何更改。


更新:

尝试访问HTTP(Node.js v10.1.0)

# curl -k -v "https://10.43.11.128:3333/"
*   Trying 10.43.11.128...
* TCP_NODELAY set
* Connected to 10.43.11.128 (10.43.11.128) port 3333 (#0)
* SSL_connect failed with error -313: revcd alert fatal error
* Curl_http_done: called premature == 1
* Closing connection 0
curl: (35) SSL_connect failed with error -313: revcd alert fatal error

Wireshark捕获了pcap file

2 个答案:

答案 0 :(得分:2)

问题是客户端没有广播对服务器所需的密码套件或扩展的支持。

一些常见的解决方案可能是: -如果使用ECC,则服务器需要启用“支持的曲线扩展”。使用“ --enable-supported curves”编译wolfSSL进行解析。 -wolfSSL为安全起见默认禁用了静态密钥密码套件。如果您的服务器需要静态密钥密码套件,请参阅自述文件顶部的注释,以获取有关重新启用静态密钥密码套件的说明。

Here is the Thread which discuses the error which you have received。希望这能解决您的问题

答案 1 :(得分:0)

验证curl发送的标头,可以使用-v参数。

  

curl -vIX“ https://10.43.11.128:3333/

也  在节点中

只需在req.end()之后添加console.log(req._headers)并比较您的标头以进一步解决问题。我还请求尝试使用Wireshark(http://www.wireshark.org/)进行ssl连接测试。

由于--insecure的原因,但是您需要知道原因。

-不安全

  • (SSL)此选项明确允许curl执行“不安全”              SSL连接和传输。尝试所有SSL连接              使用已安装的CA证书捆绑包确保安全              默认情况下。这使得所有连接都被视为“不安全”              除非使用-k,--insecure,否则将失败。

您也可以尝试一下

const https = require("https"),
  fs = require("fs");

const options = {
  key: fs.readFileSync("/cert/server-key.pem"),
  cert: fs.readFileSync("/cert/server-cert.pem")
};

const app = express();

app.use((req, res) => {
  res.writeHead(200);
  res.end("hello world\n");
});

app.listen(8000);

https.createServer(options, app).listen(8080);