【问题标题】:Detect connection is encrypted (or not)检测连接是否加密
【发布时间】:2017-03-21 20:43:33
【问题描述】:

我刚刚测试了我在 node.js 官方网站上找到的这个 HTTPS 服务器:

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

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

server = https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.write("Hello!");
  res.end();
});

server.listen(8000);

我用 openssl 创建了两个自签名证书文件:

openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out cert.pem

它运行良好,我可以连接浏览器并收到证书警告(因为它是自签名的),但仍然可以点击接受页面。

我需要的不是客户端或服务器身份验证,只是加密

我不会用浏览器连接服务器,这只是一个较长项目的开始,会有一个自定义客户端知道服务器没有经过身份验证并忽略这个缺点。

我的疑虑是关于加密。有没有办法告诉服务器端,如果连接实际上已成功加密?或者,检测连接是否未加密承诺

【问题讨论】:

    标签: node.js encryption https pem


    【解决方案1】:

    default cipher suites configuration 仅支持提供强加密的密码套件。这意味着如果已建立连接,将应用所选密码套件的加密。

    但是,您应该强制使用 TLS 1.2 以防止通过options 进行的协议降级攻击:

    const options = {
      "key": fs.readFileSync("key.pem"),
      "cert": fs.readFileSync("cert.pem"),
      "secureProtocol": "TLSv1_2_method"
    };
    

    【讨论】:

    • 遗憾的是,我也在 linux 上使用 mono。不允许使用 "secureProtocol": "TLSv1_2_method" 降级到 TLSv1/SSLv3。我知道这有助于防止漏洞。但它们大多绑定到服务器身份验证,我反正不使用。单声道客户端不会开箱即用,因为它不支持TLSv1.2。降级到AES256-SHA version TLSv1/SSLv3 甚至与加密有关吗?我只对避免通过拦截凭据进行数据包欺骗感兴趣。如果我省略该行并允许降级,那会很糟糕吗?
    • protocol downgrade attack 不会影响服务器。唯一关键的有效负载是发送到服务器的 SHA256 密码预哈希。攻击者只能读取 他自己的 (!) 数据包中的响应(CRED,表示凭据错误),而无法从服务器读取更多内容。 A 可能完全错误,但我的印象是这些漏洞与网络有关,用户可能会点击链接到显示伪造证书的冒名顶替网站。但是如果没有链接呢?没有证书可以展示?只是用来屏蔽窃听的数据包? ...请赐教:)
    • 如果您假设攻击者是被动的(只能观察数据包),那么您是安全的。如果攻击者处于活动状态(可以丢弃和操纵数据包),那么他们可能会将 TLS 1.0 连接降级为 SSLv3 连接,并通过基于填充的攻击(对于 CBC 模式)或多次填充(RC4)使用进一步的攻击来解密观察到的密文)。
    猜你喜欢
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    相关资源
    最近更新 更多