检测连接是否加密(或未加密)

Detect connection is encrypted (or not)

我刚刚测试了我在官方 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

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

What I need is not client or server authentication, just encryption!

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

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

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

但是,您应该强制使用 TLS 1.2 以防止通过 options:

进行协议降级攻击
const options = {
  "key": fs.readFileSync("key.pem"),
  "cert": fs.readFileSync("cert.pem"),
  "secureProtocol": "TLSv1_2_method"
};