首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检索旧TLS证书的节点

检索旧TLS证书的节点
EN

Stack Overflow用户
提问于 2022-04-04 03:06:06
回答 1查看 76关注 0票数 1

我使用了以下代码来获得stackoverflow.com的服务器TLS证书

代码语言:javascript
复制
const tls = require('tls');

const conn = tls.connect({
  host: 'stackoverflow.com',
  port: 443,
  rejectUnauthorized: false
}, () => {
  const cert = conn.getPeerCertificate(false);
  console.log(cert);
  conn.destroy();
});

结果如下:

  • 主题:{ CN: '*.stackexchange.com' }
  • 发行人:{ C: 'US', O: "Let's Encrypt", CN: 'R3' }
  • valid_from:Dec 3 14:00:52 2020 GMT
  • valid_to:Mar 3 14:00:52 2021 GMT
  • fingerprint256:C6:D3:6E:68:38:EC...

注意,这是一个过期的证书。

相比之下,当我在火狐中访问stackoverflow.com时,它会加载一个包含以下细节的证书:

  • 以前没有:Sun, 06 Mar 2022 14:17:27 GMT
  • 不是之后:Sat, 04 Jun 2022 14:17:26 GMT
  • 沙-256:04:F7:14:2A:28:EF:1F...

看来Node正在获得一个旧的证书。也许它被缓存在某个地方?

我的平台是:

  • 节点v17.8.0
  • Linux,x64,Manjaro
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-04 03:17:00

我获得了与原始代码相同的无效证书,因此我查看了文档,它有以下有趣的提示:

https API不同,tls.connect()默认不启用SNI (服务器名称指示)扩展,这可能导致某些服务器返回不正确的证书或完全拒绝连接。若要启用SNI,请在主机之外设置servername选项。

添加servername选项:

代码语言:javascript
复制
const tls = require('tls');

const conn = tls.connect({
  host: 'stackoverflow.com',
  servername: 'stackoverflow.com',
  port: 443,
  rejectUnauthorized: false
}, () => {
  const cert = conn.getPeerCertificate(false);
  console.log(cert);
  conn.destroy();
});

本人获发有效证书:

代码语言:javascript
复制
subject: [Object: null prototype] { CN: '*.stackexchange.com' },
[...]
valid_from: 'Mar  6 14:17:27 2022 GMT',
valid_to: 'Jun  4 14:17:26 2022 GMT',
[...]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71731614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档