ESP Certificate Bundle 分享


基本概念

数字签名:是一种将相当于现实世界中的盖章、签字的功能在计算机世界中进行实现的技术。使用数字签名可以识别篡改和伪装,还可以防止否认。

证书:要开车得先靠驾照,驾照上面记有本人的照片、姓名、出生日期等个人信息,以及有效期、准驾车辆的类型等信息,并由公安局在上面盖章。只要看到驾照,就可以知道公安局认定此人具有驾驶车辆的资格。

公钥证书其实和驾照很相似,里面记有姓名、组织、邮箱地址等个人信息,以及属于此人的公钥,并由认证机构(Certification Authority, CA)施加数字签名。只要看到公钥证书,就可以指导认证机构认定该公钥的确属于此人。

信任链:或称数字证书链,是一连串的数字证书,由根证书为起点,透过层层信任,使终端实体证书的持有者可以获得转授的信任,以证明身份。

证书捆绑包(Certificate Bundle):是一个包含根证书和中间证书的文件。 终端实体证书连同证书捆绑包构成了证书链。


ESP x509 Certificate Bundle

概述

ESP x509 证书捆绑 API 通过支持自定义 x509 根证书捆绑包提供了一种用于 TLS 服务器验证的简单的方法。

该捆绑包带有 Mozilla 的 NSS 根证书商店的完整根证书列表。可以通过 ESP32 x509 证书包生成实用程序 gen_crt_bundle.py,将 PEM 和 DER 证书转换为自定义捆绑格式,该格式仅存储主题名称和公钥以减少空间。

ESP x509 Certificate Bundle 里面包含大部分服务器的 CA 认证根证书,会编译进固件,用来校验服务器。只要启用这个功能,像 aws,微软等等大部分网址可以直接进行 TLS 连接。

浏览器上其实也存储了很多根证书,和 ESP x509 Certificate Bundle 是类似的。
以 Ubuntu 为例,mozilla 浏览器对应的 ca 证书路径为:/usr/share/ca-certificates/mozilla

╭─mali@ubuntu /usr/share/ca-certificates/mozilla 
╰─$ ll
total 508K
-rw-r--r-- 1 root root 2.8K 6月   2  2022  ACCVRAIZ1.crt
-rw-r--r-- 1 root root 2.0K 6月   2  2022  AC_RAIZ_FNMT-RCM.crt
-rw-r--r-- 1 root root  904 6月   2  2022  AC_RAIZ_FNMT-RCM_SERVIDORES_SEGUROS.crt
-rw-r--r-- 1 root root 2.1K 6月   2  2022  Actalis_Authentication_Root_CA.crt
-rw-r--r-- 1 root root 1.2K 6月   2  2022  AffirmTrust_Commercial.crt
-rw-r--r-- 1 root root 1.2K 6月   2  2022  AffirmTrust_Networking.crt
-rw-r--r-- 1 root root 1.9K 6月   2  2022  AffirmTrust_Premium.crt
-rw-r--r-- 1 root root  753 6月   2  2022  AffirmTrust_Premium_ECC.crt
-rw-r--r-- 1 root root 1.2K 6月   2  2022  Amazon_Root_CA_1.crt
-rw-r--r-- 1 root root 1.9K 6月   2  2022  Amazon_Root_CA_2.crt
-rw-r--r-- 1 root root  656 6月   2  2022  Amazon_Root_CA_3.crt
-rw-r--r-- 1 root root  737 6月   2  2022  Amazon_Root_CA_4.crt
-rw-r--r-- 1 root root 2.1K 6月   2  2022  ANF_Secure_Server_Root_CA.crt
-rw-r--r-- 1 root root 1.3K 6月   2  2022  Atos_TrustedRoot_2011.crt
-rw-r--r-- 1 root root 2.2K 6月   2  2022  Autoridad_de_Certificacion_Firmaprofesional_CIF_A62634068.crt
-rw-r--r-- 1 root root 1.3K 6月   2  2022  Baltimore_CyberTrust_Root.crt
-rw-r--r-- 1 root root 1.9K 6月   2  2022  Buypass_Class_2_Root_CA.crt
-rw-r--r-- 1 root root 1.9K 6月   2  2022  Buypass_Class_3_Root_CA.crt
-rw-r--r-- 1 root root 1.9K 6月   2  2022  CA_Disig_Root_R2.crt
......

有两种方式来生成证书捆绑包:

  • 使用 Mozilla 的完整根证书捆绑包,包含 130 多个证书。 当前使用的捆绑包已于格林威治标准时间 2023 年 1 月 10 日星期二 04:12:06 更新。

    这是一组公共证书颁发机构 (CA) 的 X.509 证书捆绑包,是从 Mozilla 的根证书文件 (certdata.txt) 中自动提取的。

    https://github.com/espressif/esp-idf/blob/master/components/mbedtls/esp_crt_bundle/cacrt_all.pem

  • 最常用根证书名称的预选过滤器列表:根据 SSL 证书颁发机构的统计数据,最常用根证书名称的预选过滤器列表将证书数量减少到 41 个左右,同时仍具有约 90% 的绝对使用覆盖率和 99% 的市场份额覆盖率。

此外,可以指定证书文件的路径或包含证书的目录,然后将其添加到生成的证书捆绑包中。

可以直接从 curl 网站下载完整的 CA 列表:CA certificates extracted from Mozilla

配置

大多数配置是可以通过 menuconfig 完成。 CMake 会根据配置生成 bundle 并将其嵌入到 app bin 中。

CONFIG_MBEDTLS_CERTIFICATE_BUNDLE:自动构建和附加 bundle。

CONFIG_MBEDTLS_DEFAULT_CERTIFICATE_BUNDLE:决定从完整根列表中包含哪些证书。

CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE_PATH:指定要嵌入 bundle 中的任何其他证书的路径。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-78NE0ShV-1686035973202)(bcdc79f8c57b9e3ad6d21285bafa729c.png)]

  • 要在使用 ESP-TLS 时启用 bundle,只需将 bundle attach 函数传给函数指针即可:

    esp_tls_cfg_t cfg = {
       .crt_bundle_attach = esp_crt_bundle_attach,
    };
    
  • 如果直接使用 mbedTLS,则可以在设置过程中通过直接调用 attach 函数来激活捆绑包:

    mbedtls_ssl_config conf;
    mbedtls_ssl_config_init(&conf);
    
    esp_crt_bundle_attach(&conf);
    
  • 如果使用 esp_http_client 组件时启用 bundle,只需将 bundle attach 函数传给函数指针即可

     esp_http_client_config_t config = {
            .url = "https://www.howsmyssl.com",
            .event_handler = _http_event_handler,
            .crt_bundle_attach = esp_crt_bundle_attach,
        };
    
    

    esp_crt_bundle_attach() 是在 release/v4.2 上才有的。
    esp_http_client_config_t 中的 esp_err_t (*crt_bundle_attach)(void *conf) 是在 commit f66bdf1233203d6edb7b7208c6fb898321654931 上添加的。esp-idf tag v4.4 及以上版本的 esp_http_client_config_t 可以支持该功能。

  • 如果使用 esp-mqtt 组件时启用 bundle,只需将 bundle attach 函数传给函数指针即可.
    relase/v5.0 及以上,以 examples/protocols/mqtt/ssl 为例,如果想要使用 bundle 来认证 mqtts broker,可以参考如下代码段:

    #include “esp_crt_bundle.h” //添加 bundle 头文件

    const esp_mqtt_client_config_t mqtt_cfg = {
        .broker = {
            .address.uri = "mqtts://broker.emqx.io:8883",
            .verification.crt_bundle_attach = esp_crt_bundle_attach,
        },
    };
    

    release/v4.3 及 release/v4.4 可参考如下代码段:

    const esp_mqtt_client_config_t mqtt_cfg = {
        .uri = "mqtts://broker.emqx.io:8883",
        .crt_bundle_attach = esp_crt_bundle_attach,
    };
    

更新证书捆绑包

该捆绑包嵌入到应用程序中,可以通过 OTA 升级与应用程序一起更新。 如果您想包含比 ESP-IDF 当前包含的捆绑包更新的捆绑包,则可以按照生成根证书列表中的说明从 Mozilla 下载证书列表。

用户也可以使用 esp_crt_bundle_set API 并根据他们的需要存储证书包。 在这种情况下,用户可以独立于应用程序对其进行更新。

认证方式对比

我们最常使用的另一个校验服务器证书的方式为:需要自行获取证书,将其嵌入到 app bin 中。
该方式大致分为如下几个步骤:

examples/protocols/esp_http_client 为例,设备需要连接到 https://www.howsmyssl.com:

  1. 获取服务器的 CA 证书,可以参考 如何获取服务器的 CA 证书

  2. esp_http_client/main 创建一个证书文件 howsmyssl_com_root_cert.pem,使用第一步获取到的证书内容;

  3. 在代码中定义证书变量:

    extern const char howsmyssl_com_root_cert_pem_start[] asm("_binary_howsmyssl_com_root_cert_pem_start");
    extern const char howsmyssl_com_root_cert_pem_end[]   asm("_binary_howsmyssl_com_root_cert_pem_end");
    

    将 start 变量赋值给 esp_http_client_config_tcert_pem:

        esp_http_client_config_t config = {
         .host = "www.howsmyssl.com",
         .path = "/",
         .transport_type = HTTP_TRANSPORT_OVER_SSL,
         .event_handler = _http_event_handler,
         .cert_pem = howsmyssl_com_root_cert_pem_start,
     };
    
  4. 修改 esp_http_client/main/CMakeLists.txt,将证书嵌入到 app bin 中:

    idf_component_register(SRCS "esp_http_client_example.c"
                     INCLUDE_DIRS "."
                     REQUIRES ${requires}
                     EMBED_TXTFILES howsmyssl_com_root_cert.pem
                     postman_root_cert.pem)
    

    相比这种方式,bundle 的优缺点如下:

  • 优点:不需要客户额外去下载证书,支持认证大多数 server,使用起来简单。
  • 缺点:要嵌入 cacrt_all.pem,生成的 bin size 会大一些。

如何获取服务器的 CA 证书?

  1. 使用 openssl 命令获取当前服务器的 CA 证书,指令格式:

    openssl s_client -showcerts -connect url:port
    
    # CA 根证书是证书链中给出的最后一个证书。
    openssl s_client -showcerts -connect www.howsmyssl.com:443 </dev/null
    
    $ openssl s_client -showcerts -connect docs.espressif.com:443 </dev/null
    
       CONNECTED(00000003)
       depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
       verify return:1
       depth=1 C = US, O = Let's Encrypt, CN = R3
       verify return:1
       depth=0 CN = docs.espressif.com
       verify return:1
       ---
       Certificate chain
       0 s:CN = docs.espressif.com
          i:C = US, O = Let's Encrypt, CN = R3
       -----BEGIN CERTIFICATE-----
       MIIFLDCCBBSgAwIBAgISA8xX/iisJWnNe4AP+zz6Wc2ZMA0GCSqGSIb3DQEBCwUA
       MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
       EwJSMzAeFw0yMzAzMTIwOTM4MzhaFw0yMzA2MTAwOTM4MzdaMB0xGzAZBgNVBAMT
       EmRvY3MuZXNwcmVzc2lmLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
       ggEBANeuxyQeLn4a4VgNiKfDCEgXME97THJnpXWY9q8c44hgwxNUY1LH9NBlN63D
       X2eJB7oO52DdZ2pli8PQ0W6U4cCuJiSHKz9jHxuywnWIp/otPyGqw2JCIMb1lXKg
       9SsP03cuPcQTFQnzlwj0NA88Pk31tyJ87OlxHB9pi7qMI5YZN59llSIVFJc+sSH1
       k0lCA3uzbFgabxNHeorKvMMDyp8O7dpXFNcJkcdspx9CIGYG4tfKtL6y8Ofgx/Si
       i5zOFlgBJhWwR5vZX3Fjl/Ue6lBG8lQSTaJMB/bMLm8yX5+wQqJqWtlLc0yDmCth
       AN5fc7MR+u+MVmBqdS35RlfJye0CAwEAAaOCAk8wggJLMA4GA1UdDwEB/wQEAwIF
       oDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAd
       BgNVHQ4EFgQUzZNNoMm85+HZQDd4RXMWGMcbwWQwHwYDVR0jBBgwFoAUFC6zF7dY
       VsuuUAlA5h+vnYsUwsYwVQYIKwYBBQUHAQEESTBHMCEGCCsGAQUFBzABhhVodHRw
       Oi8vcjMuby5sZW5jci5vcmcwIgYIKwYBBQUHMAKGFmh0dHA6Ly9yMy5pLmxlbmNy
       Lm9yZy8wHQYDVR0RBBYwFIISZG9jcy5lc3ByZXNzaWYuY29tMEwGA1UdIARFMEMw
       CAYGZ4EMAQIBMDcGCysGAQQBgt8TAQEBMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly9j
       cHMubGV0c2VuY3J5cHQub3JnMIIBBgYKKwYBBAHWeQIEAgSB9wSB9ADyAHcAtz77
       JN+cTbp18jnFulj0bF38Qs96nzXEnh0JgSXttJkAAAGG1WahCQAABAMASDBGAiEA
       0wMHEzYcjcDSihW5kHwIPPXDLtLmBNYJzcplhMMKlvQCIQDZstuso3on+AQZnJSB
       znlQTuZG6vHldwSiUL80w2QXBQB3AOg+0No+9QY1MudXKLyJa8kD08vREWvs62nh
       d31tBr1uAAABhtVmoRwAAAQDAEgwRgIhAJjUK72v0L9r3pFs/jEdvxK+mMemHV0x
       /h/aTYDbdbV7AiEAuQKOPesK8YirMCbkt4ogK5Ti2cbDuOWp1vjdqQFoUPYwDQYJ
       KoZIhvcNAQELBQADggEBAEUwSzK061u7qrmgotlUxoOvYWNsoVZzCgBY/60AkWoL
       1J8BPMmiwMVfURtL7odCiwDDz9cFpEgNzbNPZW5IMl2EDKBB8DTTLrpywbAFhHNe
       D2hck35I349y8sTWTF7GZ+zk0FIBnAl1tPSg4y7p5RK1+k2HJAidJjZ7Jc2ekIcA
       a3Qz6eho+xl+DRA958Po2vtzK3pINvy2h7CeoG3zid6Dyn/g7zOonIuLNFxKYSdz
       mxe7eaCTHJ65qBNU4ZyLOUH1FyzLTi2EBI+RnP1w0djOcQWRw3R3IKXo/9X0UwRF
       MIZtTohvuqAGdNPwHUvSa5+pbD+KB4eXCrITrJSqDoo=
       -----END CERTIFICATE-----
       1 s:C = US, O = Let's Encrypt, CN = R3
          i:C = US, O = Internet Security Research Group, CN = ISRG Root X1
       -----BEGIN CERTIFICATE-----
       MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw
       TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
       cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw
       WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
       RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
       AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP
       R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx
       sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm
       NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg
       Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG
       /kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC
       AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB
       Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA
       FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw
       AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw
       Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB
       gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W
       PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl
       ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz
       CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm
       lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4
       avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2
       yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O
       yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids
       hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+
       HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv
       MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX
       nLRbwHOoq7hHwg==
       -----END CERTIFICATE-----
       2 s:C = US, O = Internet Security Research Group, CN = ISRG Root X1
          i:O = Digital Signature Trust Co., CN = DST Root CA X3
       -----BEGIN CERTIFICATE-----
       MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/
       MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
       DkRTVCBSb290IENBIFgzMB4XDTIxMDEyMDE5MTQwM1oXDTI0MDkzMDE4MTQwM1ow
       TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
       cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwggIiMA0GCSqGSIb3DQEB
       AQUAA4ICDwAwggIKAoICAQCt6CRz9BQ385ueK1coHIe+3LffOJCMbjzmV6B493XC
       ov71am72AE8o295ohmxEk7axY/0UEmu/H9LqMZshftEzPLpI9d1537O4/xLxIZpL
       wYqGcWlKZmZsj348cL+tKSIG8+TA5oCu4kuPt5l+lAOf00eXfJlII1PoOK5PCm+D
       LtFJV4yAdLbaL9A4jXsDcCEbdfIwPPqPrt3aY6vrFk/CjhFLfs8L6P+1dy70sntK
       4EwSJQxwjQMpoOFTJOwT2e4ZvxCzSow/iaNhUd6shweU9GNx7C7ib1uYgeGJXDR5
       bHbvO5BieebbpJovJsXQEOEO3tkQjhb7t/eo98flAgeYjzYIlefiN5YNNnWe+w5y
       sR2bvAP5SQXYgd0FtCrWQemsAXaVCg/Y39W9Eh81LygXbNKYwagJZHduRze6zqxZ
       Xmidf3LWicUGQSk+WT7dJvUkyRGnWqNMQB9GoZm1pzpRboY7nn1ypxIFeFntPlF4
       FQsDj43QLwWyPntKHEtzBRL8xurgUBN8Q5N0s8p0544fAQjQMNRbcTa0B7rBMDBc
       SLeCO5imfWCKoqMpgsy6vYMEG6KDA0Gh1gXxG8K28Kh8hjtGqEgqiNx2mna/H2ql
       PRmP6zjzZN7IKw0KKP/32+IVQtQi0Cdd4Xn+GOdwiK1O5tmLOsbdJ1Fu/7xk9TND
       TwIDAQABo4IBRjCCAUIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
       SwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5pZGVudHJ1
       c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTEp7Gkeyxx
       +tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEEAYLfEwEB
       ATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2VuY3J5cHQu
       b3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0LmNvbS9E
       U1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFHm0WeZ7tuXkAXOACIjIGlj26Ztu
       MA0GCSqGSIb3DQEBCwUAA4IBAQAKcwBslm7/DlLQrt2M51oGrS+o44+/yQoDFVDC
       5WxCu2+b9LRPwkSICHXM6webFGJueN7sJ7o5XPWioW5WlHAQU7G75K/QosMrAdSW
       9MUgNTP52GE24HGNtLi1qoJFlcDyqSMo59ahy2cI2qBDLKobkx/J3vWraV0T9VuG
       WCLKTVXkcGdtwlfFRjlBz4pYg1htmf5X6DYO8A4jqv2Il9DjXA6USbW1FzXSLr9O
       he8Y4IWS6wY7bCkjCWDcRQJMEhg76fsO3txE+FiYruq9RUWhiF1myv4Q6W+CyBFC
       Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5
       -----END CERTIFICATE-----
       ---
       Server certificate
       subject=CN = docs.espressif.com
    
       issuer=C = US, O = Let's Encrypt, CN = R3
    
       ---
       No client certificate CA names sent
       Peer signing digest: SHA256
       Peer signature type: RSA-PSS
       Server Temp Key: X25519, 253 bits
       ---
       SSL handshake has read 4661 bytes and written 413 bytes
       Verification: OK
       ---
       New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
       Server public key is 2048 bit
       Secure Renegotiation IS supported
       Compression: NONE
       Expansion: NONE
       No ALPN negotiated
       SSL-Session:
          Protocol  : TLSv1.2
          Cipher    : ECDHE-RSA-AES128-GCM-SHA256
          Session-ID: 4587625D73E98D509167637CA369038BAAB9064F7EDE305FDAF16A9CE83DD34E
          Session-ID-ctx: 
          Master-Key: D6D9E4EADFB76D0041EA4E5F2973449C3B1631C86A28083D6A78BA7633352A987DE1B6D47332AA4278A90021B43CF349
          PSK identity: None
          PSK identity hint: None
          SRP username: None
          TLS session ticket lifetime hint: 86400 (seconds)
          TLS session ticket:
          0000 - 8a 12 13 c4 be f0 fd 9b-aa 44 2e a8 d7 c0 43 c6   .........D....C.
          0010 - 5e f0 a7 e7 7d 2e ef 72-d2 54 33 cf 86 ca 6b 0c   ^...}..r.T3...k.
          0020 - 1c 52 bc 61 f5 fa 89 98-a1 ee 84 80 1c ac d0 52   .R.a...........R
          0030 - 73 82 07 76 11 bb b7 40-61 9c 92 61 80 df eb 02   s..v...@a..a....
          0040 - e3 d6 a5 95 7b fb c7 d5-9f 59 36 ea c0 5e f0 ee   ....{....Y6..^..
          0050 - b5 8f 09 b5 1f 89 71 3f-28 ea a8 3f 65 ac a5 f9   ......q?(..?e...
          0060 - c7 b8 2a f9 5c d1 12 d8-b5 a9 3f 52 be a7 12 3f   ..*.\.....?R...?
          0070 - 0c 46 98 3a d6 cf 46 8f-3b eb ea 11 38 58 c1 13   .F.:..F.;...8X..
          0080 - 85 8a 12 9b e8 43 cc 09-3d dc 97 56 1f b1 fd c4   .....C..=..V....
          0090 - 4c 5e 18 5f cc bb 89 eb-62 f2 f4 48 9c 8d 9f c7   L^._....b..H....
          00a0 - 85 1d 5c c5 0b 8d e5 8b-fc 4d b3 ed d2 86 ce c6   ..\......M......
    
          Start Time: 1680527425
          Timeout   : 7200 (sec)
          Verify return code: 0 (ok)
          Extended master secret: yes
       ---
       DONE
    

  2. 通过浏览器导出证书

    浏览器访问目标网址,点击浏览器 🔒 的图标,导出根证书。注意证书格式,建议选择 *.pem,*.crt 格式,可以使用记事本查看证书内容。证书以 -----BEGIN CERTIFICATE----- 开始,-----END CERTIFICATE----- 结束。

    选中“连接是安全的”,弹出如下界面:

    选中“证书有效”,即可查看证书内容,可从“详细信息”导出证书内容。可以选择导出单一证书或者证书链,证书链中的最后一个证书为Root CA。

测试发现,openssl s_client -showcerts -connect url:port 并不能获取到 Root CA,一般是从终端实体证书到第一个中介证书,而从浏览器获取的证书链里面会包含 Root CA。有的时候,使用 Root CA 才可以校验成功。

这个是 chatgpt 给出的答案:

您提到的情况是由于 OpenSSL 的行为不同于浏览器所致。当使用 OpenSSL 的 s_client 命令连接到 HTTPS 服务器时,它会返回所有中间证书,但不会返回根证书。这是因为根证书是预安装在操作系统和浏览器中的,并且已被信任为受信任的证书颁发机构(CA)。因此,OpenSSL 不需要获取根证书来验证服务器证书的有效性,因为它假设您已经信任了根证书。

相比之下,浏览器有一个称为“证书颁发机构缓存”(CA Cache)的功能,其中包括了所有受信任的根证书。浏览器可以使用该缓存来验证服务器证书,包括获取服务器证书的完整证书链,包括根证书。

因此,当您使用 OpenSSL 连接到 HTTPS 服务器时,您需要手动将根证书添加到 OpenSSL 的信任存储中,以便 OpenSSL 可以验证服务器证书的有效性。您可以使用 -CAfile 或 -CApath 参数指定要使用的证书文件或证书目录,或者将根证书添加到系统的信任存储中。

总之,如果您需要验证服务器证书的完整证书链,包括根证书,请确保将根证书添加到 OpenSSL 的信任存储中。

补充内容

信任链

信任链,或称数字证书链,是一连串的数字证书,由根证书为起点,通过层层信任,使终端实体证书的持有者可以获得转授的信任,以证明身份。

在互联网中,任何机构都可以登记域名以设立服务器,供大众连接沟通并进行电子商务或使用政府服务。虽然公开密钥加密可以确保通信保密、数字签名可以确保内容无误、以及保证对方无法抵赖;但如果数字证书未获得可供信任的数字证书认证机构数字签名(即自签证书),对方的真实身份仍然可疑除非通信双方早已互相认识并预先透过安全渠道交换数字证书)。数字证书认证机构在公开密钥加密基建担任了非常重要的角色,电脑软件安装并信任了其根证书,根据其私钥签发的下层证书都可(基于数字签名)被自动信任,如果是中介证书,则再下层的终端实体证书也一样被自动信任,此即构成了一条信任链。

以维基百科为例,其信任链包含了三张数字证书:

  1. 维基百科网站因为使用 HTTPS,故服务器已安装了数字证书。此证书的主体一栏列明系发给 *.wikipedia.org 所使用,故如果用户是连接任何 *.wikipedia.org 旗下的网站,此证书都适用。此即终端实体证书,亦是 TLS 服务器证书(由于使用了通配符,所以也是通配符证书)。

  2. 浏览器验证 *.wikipedia.org 的数字证书时,除检查其有效期外,还会再检查其上级签发证书,亦即 R3,这是中介证书,持有机构已根据组织验证确认 *.wikipedia.org 的拥有者——维基媒体基金会在现实世界中的身份。

  3. R3 是由 ISRG Root X1 所签发,由于 ISRG Root X1 没有上级签发机构,它是根证书,为自签证书。应用软件会检查此证书有否已预载于根证书清单上:如有,则 *.wikipedia.org 的终端实体证书确认为有效,维基百科网站被认为可信任;否则向用户警告网站未获信任。

    https://github.com/espressif/esp-idf/blob/master/components/mbedtls/esp_crt_bundle/cacrt_all.pem

假设小林是第一税务所的一名员工,第一税务所的员工的公钥都是由第一税务所认证机构颁发的,因为这样更容易认证本人身份。

对于第一税务所认证机构的公钥,则由浦东新区税务局认证机构颁发证书,而对于浦东新区税务局认证机构的公钥,则由上海市税务局认证机构颁发证书,以此类推……。不过这个链条不能无限延伸,总要有一个终点,如果这个终点就是国家税务总局认证机构(即不存在更高一层的认证机构),该认证机构一般就称为根 CA(Root CA)。而对于国家税务总局认证机构,则由国家税务总局认证机构自己来颁发证书,这种对自己的公钥进行数字签名的行为称为自签名(self-signarure)。

数字签名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FoXvw1iw-1686035893922)(65a4c57ecdb54e7d97930416fdf717e7.png)]

参考资料

ESP x509 Certificate Bundle

信任链

Let’s encrypt Chain of Trust

图解密码技术

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值