ESP Certificate Bundle 分享

news2024/11/26 4:38:55

基本概念

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

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

公钥证书其实和驾照很相似,里面记有姓名、组织、邮箱地址等个人信息,以及属于此人的公钥,并由认证机构(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

图解密码技术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/616178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大唐杯学习超快速入门】5G智能网络优化

这里写目录标题 学习--实验背景上下行速率VOLTE掉话率优化时延优化 接入保持特性提升无线接通率切换成功率 附录 数据分析其他几种选项差不多 学习–实验背景 观看视频进行学习&#xff0c;理解该仿真的内涵 使用人工智能代替人工分析&#xff0c;对5G网络进行优化 上下行速率…

Centos Linux 操作系统中配置Gitlab服务器

基本准备 安装常用的工具包 linux根据操作系统的不同&#xff0c;有不同的安装工具&#xff0c;如&#xff0c; 操作系统 格式 工具 Debian .deb apt, apt-cache, apt-get, dpkg Ubuntu .deb apt, apt-cache, apt-get, dpkg CentOS .rpm yum Fedora .rpm dnf …

企业数智底座白皮书:详解数智平台必备的六大能力

在以“升级企业数智化底座”为主题的2023用友BIP技术大会上&#xff0c;用友联合全球权威咨询机构IDC共同发布《建设数字中国 升级数智底座——企业数智化底座白皮书》&#xff0c;在这本数智平台白皮书里详细解读了企业数智平台应该具备的六大基础能力。 当前企业数智化能力进…

一文剖析mlock锁原理

一般用户空间关联的物理页面是按需通过缺页异常的方式分配和调页&#xff0c;当系统物理内存不足时页面回收算法会回收一些最近很少使用的页面&#xff0c;但是有时候我们需要锁住一些物理页面防止其被回收&#xff08;如时间有严格要求的应用&#xff09;&#xff0c;Linux中提…

市面上的智能电表都有多少安的?适用于那些场景?

随着智能化技术的快速发展&#xff0c;智能电表已经成为了家庭和公寓物业配电系统的必备设备之一。智能电表的功率等级通常为10A或15A&#xff0c;具体取决于电表型号和用途。那么&#xff0c;这些功率等级的智能电表适用于哪些场景呢&#xff1f; 首先&#xff0c;10A功率等级…

【实验练习】基于自注意力机制Vision Transformer模型实现人脸朝向识别 (Python实现) 内容原创

题目 人脸识别是一个复杂的模式识别问题&#xff0c;人脸识别是人脸应用研究中非常重要的一步。由于人脸形状不规则、光线和背景条件多样&#xff0c;导致人脸检测精度受限。实际应用中&#xff0c;大量图像和视频源中人脸的位置、朝向、朝向角度都不是固定的&#xff0c;极大…

内网渗透—隧道技术

内网渗透—隧道技术 1. 隧道技术介绍1.1. 内网—隧道技术1.2. 常见的隧道协议1.3. 前置条件1.4. 判断内网的连通性 2. 网络层隧道技术2.1. ICMP隧道技术2.1.1. 常见工具2.1.2. Pingtunnel基础演示2.1.2.1. 下载服务端2.1.2.2. 下载客户端2.1.2.3. 设置CS连接2.1.2.4. 连接测试 …

功能上新|对比分析、Batches数量、函数释义Tips

本篇是继功能上新&#xff5c;内存篇、GPU篇之后&#xff0c;为大家展示更多关于提升浏览UWA GOT Online Overview报告体验的优化项&#xff0c;包括Overview报告的对比分析、Batches数量、函数释义Tips等。这些功能可以让你更快上手对报告的理解&#xff0c;亦或者更好地融入在…

.Net Core 6 WebApi 项目搭建(一、简单搭建)

前言 对于后端开发者最耻辱的是什么&#xff0c;是只会增删改查&#xff0c;只会CV&#xff0c;只会业务代码。没错&#xff0c;我就是被钉在耻辱柱上的一员&#xff0c;3年开发经验&#xff0c;不会搭建框架&#xff0c;只会写业务代码&#xff0c;丢人丢人啊&#xff0c;所以…

【XR】One More Thing:Vision Pro ,7年磨一剑,2023WWDC苹果发布Vision MR

One More Thing&#xff1a;Vision Pro &#xff0c;7年磨一剑&#xff0c;2023WWDC苹果发布Vision MR 1. 苹果MR Vision Pro&#xff1a;1. 专利布局&#xff1a;苹果表示在开发过程中申请了5000多项专利。2. 专属感知计算芯片3. 显示屏系统方面4. 续航方面5. Vision MR 的新框…

MATLAB安装配置MinGW-w64 C++编译器

文章目录 前言一、Mingw安装1、安装教程2、验证 二、MATLAB安装配置MinGW总结 #pic_center 前言 只是为方便学习&#xff0c;不做其他用途 一、Mingw安装 在网上找到的安装一直报错&#xff1a;The file has been downloaded incorrectly 1、安装教程 建议参考博客Mingw快捷安…

C++内存序、屏障和原子操作

文章目录 一、原子类型二、原子操作函数三、内存序1&#xff09;happens-before和synchronizes-with语义2&#xff09;内存序模式 四、标准库函数五、栅栏&#xff08;Barrier&#xff09; 一、原子类型 标准原子类型的备选名和与其相关的 std::atomic<> 特化类&#xf…

探索低代码的新形态(D2C、ChatGPT)

前言 低代码平台的出现&#xff0c;是互联网快速发展的背景下&#xff0c;满足产品快速迭代的实际需求。现在国内外都已经拥有非常多优秀的开源项目&#xff08;如&#xff1a;lowcode-engine&#xff09;和成熟的商业产品&#xff08;如&#xff1a;Mendix 、PowerPlatform&a…

Orillusion次时代 WebGPU 引擎

Orillusion 次时代 WebGPU 引擎 官网: https://www.orillusion.com/ 教程: https://www.orillusion.com/guide/ Orillusion 引擎是一款完全支持 WebGPU 标准的轻量级渲染引擎。基于最新的 Web 图形API标准&#xff0c;我们做了大量的探索和尝试&#xff0c;实现了很多曾经在 We…

python接口自动化(三)--如何设计接口测试用例(详解)

在开始接口测试之前&#xff0c;我们来想一下&#xff0c;如何进行接口测试的准备工作。或者说&#xff0c;接口测试的流程是什么&#xff1f;有些人就很好奇&#xff0c;接口测试要流程干嘛&#xff1f;不就是拿着接口文档直接利用接口 测试工具测试嘛。其实&#xff0c;如果…

【正点原子STM32连载】 第二十八章 低功耗实验摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十…

计算机中数据的表示:定点数、浮点数

文章目录 1 概述2 定点数2.1 表示方法2.2 取值范围2.3 运算方法 3 浮点数3.1 表示方法3.2 运算方法 4 扩展4.1 等比数列前 n 项和公式 1 概述 #mermaid-svg-EXDrkn8G91FsDdps {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#merm…

给 a 标签设置 display:inline-block 之后 a 整体下沉

今天给一个a设置宽高&#xff0c;前提是添加了display:inline-block&#xff1b;然后发下a没有与父元素div顶部对齐&#xff0c;反而下沉了。试了好多办法都没成功&#xff0c;然后在网上找的教程。 原因 1、问题就是出在了display:inline-block;语句上&#xff0c;行内块元…

使用Python进行接口性能测试:从入门到高级

前言&#xff1a; 在今天的网络世界中&#xff0c;接口性能测试越来越重要。良好的接口性能可以确保我们的应用程序可以在各种网络条件下&#xff0c;保持流畅、稳定和高效。Python&#xff0c;作为一种广泛使用的编程语言&#xff0c;为进行接口性能测试提供了强大而灵活的工…

Redis:数据类型

一、Redis字符串(String) 1、String类型 String字符串&#xff1a;string类型是redis最基本、最简单的数据类型&#xff0c;一个key对应一个value。 String类型的二进制是安全的&#xff0c;可以包含任何数据&#xff0c;但是每一个value最大时512M 2、String命令 设置和获…