基本概念
数字签名:是一种将相当于现实世界中的盖章、签字的功能在计算机世界中进行实现的技术。使用数字签名可以识别篡改和伪装,还可以防止否认。
证书:要开车得先靠驾照,驾照上面记有本人的照片、姓名、出生日期等个人信息,以及有效期、准驾车辆的类型等信息,并由公安局在上面盖章。只要看到驾照,就可以知道公安局认定此人具有驾驶车辆的资格。
公钥证书其实和驾照很相似,里面记有姓名、组织、邮箱地址等个人信息,以及属于此人的公钥,并由认证机构(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 中的任何其他证书的路径。
-
要在使用 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
:
-
获取服务器的 CA 证书,可以参考 如何获取服务器的 CA 证书;
-
在
esp_http_client/main
创建一个证书文件howsmyssl_com_root_cert.pem
,使用第一步获取到的证书内容; -
在代码中定义证书变量:
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_t
的cert_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, };
-
修改
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 证书?
-
使用 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
-
通过浏览器导出证书
浏览器访问目标网址,点击浏览器 🔒 的图标,导出根证书。注意证书格式,建议选择
*.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 的信任存储中。
补充内容
信任链
信任链,或称数字证书链,是一连串的数字证书,由根证书为起点,通过层层信任,使终端实体证书的持有者可以获得转授的信任,以证明身份。
在互联网中,任何机构都可以登记域名以设立服务器,供大众连接沟通并进行电子商务或使用政府服务。虽然公开密钥加密可以确保通信保密、数字签名可以确保内容无误、以及保证对方无法抵赖;但如果数字证书未获得可供信任的数字证书认证机构数字签名(即自签证书),对方的真实身份仍然可疑除非通信双方早已互相认识并预先透过安全渠道交换数字证书)。数字证书认证机构在公开密钥加密基建担任了非常重要的角色,电脑软件安装并信任了其根证书,根据其私钥签发的下层证书都可(基于数字签名)被自动信任,如果是中介证书,则再下层的终端实体证书也一样被自动信任,此即构成了一条信任链。
以维基百科为例,其信任链包含了三张数字证书:
-
维基百科网站因为使用 HTTPS,故服务器已安装了数字证书。此证书的主体一栏列明系发给
*.wikipedia.org
所使用,故如果用户是连接任何*.wikipedia.org
旗下的网站,此证书都适用。此即终端实体证书,亦是 TLS 服务器证书(由于使用了通配符,所以也是通配符证书)。 -
浏览器验证
*.wikipedia.org
的数字证书时,除检查其有效期外,还会再检查其上级签发证书,亦即R3
,这是中介证书,持有机构已根据组织验证确认*.wikipedia.org
的拥有者——维基媒体基金会在现实世界中的身份。 -
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)。
数字签名
参考资料
ESP x509 Certificate Bundle
信任链
Let’s encrypt Chain of Trust
图解密码技术