V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
weimo383
V2EX  ›  SSL

关于自签名的疑惑

  •  
  •   weimo383 · 272 天前 · 1123 次点击
    这是一个创建于 272 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在配置 SSL ,连接公司测试内网一直 TLS 握手失败,显示 bad certificate ,证书无法验证通过。查了一下 SSL 验证过程,大致是服务器发送一个证书,包含 CA 私钥加密后的数字签名,客户端用对应的 CA 公钥解密。

    然后还是有一些问题请教 v 站大?

    1. 自签名的话是至少生成两张证书吗?我以为是一张 root certificate 交给客户端并添加信任列表,另外一张 server certificate 由服务器发送 server hello 。(假设不需要验证客户端身份)

    2. 客户端如果要信任测试的内网服务器,是否需要问 IT 管理员要 root certificate ?我的情况还比较复杂,是 arduino 单片机作为客户端,我猜需要要到 root certificate 并且添加到 firmware 里面才能连接。

    3. server certificate 包含了 CSR 信息以及数字签名?数字签名是由 CA 私钥加密的? CSR 信息里面有服务器公钥? root certificate 包含什么?我以为应该有 CA 公钥吧,不然客户端怎么检验数字签名?

    9 条回复    2023-08-24 18:33:46 +08:00
    weimo383
        1
    weimo383  
    OP
       272 天前
    不考虑中间证书哈?
    weimo383
        2
    weimo383  
    OP
       272 天前
    公司的服务器是 windows server , 访问的服务是 AD 认证, 请问有可能导出 root certificate 供客户端访问吗?
    cs010
        3
    cs010  
       272 天前 via Android   ❤️ 1
    1. 你认为的是对的。
    2.理论是的。Arduino 具体怎么添加不知道,反正要让他信任根证书
    3. server cert 包含了 root ca 对证书信息的签名,并且包含了 root ca 的 serial number ,客户端会根据 serial number 找到 root ca ,用 root ca 的公钥验签,确定 server cert 是由 root ca 签发。
    证书里面还包含了很多东西,打开浏览器绿色锁的证书信息,可以很方便看到。
    xiangyuecn
        4
    xiangyuecn  
       272 天前   ❤️ 1
    递归验证,需要完整证书链。

    根证书 A -签名-> 中间证书 B -签名-> 中间证书 C -签名-> 你的证书 D

    -------
    客户端拿到你的证书 D 后,根据指纹找到证书 C ,用 C 的公钥验证 D 里面的签名

    客户端拿到证书 C 后,根据指纹找到证书 B ,验证 C 的有效性
    ...
    以此类推,最终找到了根证书 A ,根证书一般内置在系统里面
    ------
    因为 A 可信,所以 B 可信,继续 C 可信,然后你的 D 也可信,最基本的验证完成

    如果中间证书 C 或 B 没有找到(证书链缺失),证书 D 直接无效,没法验证

    -----
    证书 D 中一般会包含 A 、B 、C (完整证书链),比如 pem 文件 直接简单粗暴的把证书文本 按 D C B A 的顺序放到一起 多加几个换行就 ok 了

    所以,系统内只需要有根证书就 ok 了,自签的证书 只需要把自己生成的根证书导入到系统根证书颁发机构里面( Android 不 root 导入不了,并且不信任用户证书),自签证书就能生效
    xiangyuecn
        5
    xiangyuecn  
       272 天前   ❤️ 1
    1. 一般生成两个证书,方便通用些,根证书必须给客户端添加上
    2. 其实就是问题 1
    3. 证书不包含 csr 信息,csr 是证书请求 用于签发证书,csr 里面包含了待申请证书的公钥(你持有的私钥不会发送给任何人,包含证书颁发机构)。数字签名都是用私钥签名的,私钥除了你自己不会暴露给任何人。

    根证书和普通证书没有多大区别,你有的他也有,所有证书都有公钥。

    -------------
    <硬广> HTML5 网页版 ACME 客户端:向 Let's Encrypt 、ZeroSSL 等支持 ACME 协议的证书颁发机构,免费申请获得用于 HTTPS 的 SSL/TLS 域名证书( RSA 、ECC/ECDSA ),支持多域名和通配符泛域名;只需在现代浏览器上操作即可获得 PEM 格式纯文本的域名证书,不依赖操作系统环境,无需下载和安装软件,纯手动操作,只专注于申请获得证书这一件事

    https://xiangyuecn.gitee.io/acme-html-web-browser-client/ACME-HTML-Web-Browser-Client.html
    billlee
        6
    billlee  
       272 天前   ❤️ 1
    1. 自签名是一张证书。一张 root 证书和另一张 server 证书的叫自建 CA.
    2. AD 域的根证书在入域的电脑上就有,你直接导出来就可以用。证书是不需要保密的。
    3. 证书包含公钥和一些附加的信息,包括名称、用途等字段,以上所有的信息都有 CA 的签名。签名是用 CA 的私钥对证书信息的摘要做加密。root 证书和服务器证书的区别基本上就只有用途字段不同。
    weimo383
        7
    weimo383  
    OP
       271 天前 via Android
    @billlee 谢谢
    julyclyde
        8
    julyclyde  
       271 天前
    @cs010 你确认有 serial 这个机制??请拿出证据
    hyomarchandocl85
        9
    hyomarchandocl85  
       246 天前
    @julyclyde
    What is the use of serial number in certificate?
    This is a unique identifier assigned by the CA which issued the certificate. The serial number is unique within the CA which issued the certificate: no two certificates signed by the same CA certificate have the same serial number.

    serial number 应该是 CA 本身的标识符,找父级证书应该是 issuer name
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2892 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 08:55 · PVG 16:55 · LAX 01:55 · JFK 04:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.