This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] BOOSTXL-CC3135:TLS 客户端身份验证解密错误

Guru**** 683450 points
Other Parts Discussed in Thread: UNIFLASH, CC31XXEMUBOOST, CC3135
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1046907/boostxl-cc3135-tls-client-auth-decrypt_error

器件型号:BOOSTXL-CC3135
主题中讨论的其他器件:UNIFLASHCC31XXEMUBOOSTCC3135

我使用 BOOSTXL 板作为主(ST)开发套件的外部网络处理器。 我的嵌入式系统是 WebSocket 客户端、通过升压 WiFi 连接连接到 WebSocket 服务器(Python)。 我遇到的问题是、当我在服务器上实施双向身份验证时、TLS 握手在证书验证阶段失败。 在未启用双向身份验证的情况下、所有功能均按预期工作。 实际上、我有一个第二个嵌入式系统、它使用相同的固件、相同的过程来生成证书等、可以与双向验证配合使用 我已经指出了系统之间的差异、没有什么突出的。

为了排除 Python 服务器、我使用了 openssl s_server、这确认了相同的故障。 我的固件从 sl_connect 获取 sl_error_bSD_ESEC_decrype_err1 (-351)返回代码、正如预期的那样、出现此错误。

相关详细信息:

  1. 我创建了自己的自签名 CA
  2. 我的固件使用 simplelink API 生成 CSR on 命令
  3. 对于速度(这是原型系统设计 ATM)、这是我在生成 CSR 后提供升压的方法:
    1. 使用 CC31XXEMUBOOST 板和 UniFlash、我读出 CSR 文件
    2. 使用我的 CA 签署 CSR
    3. 抓住机会将最新的 Service Pack 添加到要写入的新映像中
    4. 将已签名证书添加到新映像(\custom\mycert.pem)
    5. 添加 CA (\custom\MyCa.pem)
    6. 刷写升压
    7. 命令固件生成 CSR (再次)-这会导致在新刷写的升压文件系统上创建器件唯一密钥对文件
  4. 在固件中、在连接之前、请使用 setsockopt
    1. 指定自定义 CA 文件
    2. 指定自定义证书
    3. 指定默认系统私钥文件(/sys/cert/iot/key.der)
    4. 禁用受信任根证书存储(sl_SO_SECURE_DISABLE_CERTIFICATE_STORE)
  5. 在固件引导时、我打印(ls)升压文件系统、并可以确认是否存在 key.der、自定义 CA 和 cert
  6. 查看 openssl 服务器在尝试建立连接时的调试输出,升压器发送的证书与系统上最初创建的证书相匹配。  
  7. 我可以使用 openssl 根据 CA 验证证书
  8. 服务器似乎正在选择密码套件 ECDHE-ECDSA-AES128-SHA256
  9. 嵌入式认证(在升压模式下)具有 EC P256公钥和使用 SHA256及 RSA 的签名
  10. 我的 CA 证书公钥是2048位 RSA、它的签名是带有 RSA 的 SHA256
  11. 我传递给 openssl 的服务器证书具有 EC P256公钥和 SHA256 RSA 签名(也由我的 CA 签名)
  12. 执行客户端和服务器 hello、交换证书、协商密码、当 BOOST 发送签名验证签名时、服务器发回 decrype_error 警报。
  13. CC3135硬件/固件详细信息:
    1. 芯片 ID 823132160
    2. MAC 3.7.0.1
    3. PHY 3.1.0.26
    4. NWP 4.10.0.1
    5. ROM 8738
    6. 主机3.0.1.71 (来自 simplelink_cc32xx_sdk_5_10_00_02)

我在这里遗漏了什么?  

我唯一能看到的是、simplelink CSR 示例中的注释表明仅支持证书 v3、我的证书是 v1 -我需要在将 CSR 签名为 make is v3时提供一些扩展信息。 我怀疑在这种情况下会出现证书错误、我始终假设仅 v3支持与 Boost 上的自签名证书生成相关。

以下是 openssl 提供的有关所使用的各种认证的一些(编辑的)详细信息:

大约

证书: 
数据:
版本:3 (0x2)
序列号:
35:75:...
签名算法:sha256WithRSAEncryption
颁发者:C = GB、ST =..、L =..、O =..、CN = MyCa、 电子邮件地址=..
有效性
不是以前:2021年5月19日15:38:13 GMT
不在5月17日15:38:132031格林尼治标准时间之后
主题:C = GB、ST =..、L =..、O =..、CN = MyCa、 电子邮件地址=..
主题公共密钥信息:
公钥算法:rsaEncryption
RSA 公钥:(2048位)
模量:
00:B1:df:14:87:24:1b:1a:ed:E5:7b:B7:2f:68:C2:
(笑声)
D9:C9:aa:af:C1:69:21:76:AC:29:95:23:df:bc:62:
97:CB
指数:65537 (0x10001)
X509v3扩展:
X509v3使用者密钥标识符:
3c:...
X509v3授权密钥标识符:
密钥 ID:3C:7...

X509v3基本约束:关键
CA:true
签名算法:sha256WithRSAEncryption
89:35:80:2a:98:AC:8a:2e:0c:00:67:16:3a:41:1c:A6:66:A3:
(笑声)
9C:CA:E7:A3

提升 CSR

证书请求: 
数据:
版本:3 (0x2)
主题:C = GB、ST =..、L =..、SN =..、O =..、 OU =..、CN =.. ..、emailAddress =..
主题公共密钥信息:
公钥算法:ID-ecPublicKey
公钥:(256位)
出版:
04:90:31:60:B8:1a:05:A7:91:99:C1:B7:af:A6:44:
(笑声)
Ae:31:4b:66:41
ASN1 OID:prime256v1
NIST 曲线:P-256
属性:
A0:00
签名算法:ECDSA-带 SHA1
30:45:02:21:00:C8:73:B8:84:bb:3a:10:36:76:CD:b0:21:7f:
(笑声)
79:C3:28:A6:90:C7:45:1D:a0:E5:60:b9:04:9c:A1:8d:B3

升压陶瓷

证书: 
数据:
版本:1 (0x0)
序列号:
30:1f...
签名算法:sha256WithRSAEncryption
颁发者:C = GB、ST =..、L =..、O =..、CN = MyCa、 电子邮件地址=..
有效性
不是以前:2021年6月16日13:26:59 GMT
不在5月23日13:26:592121 GMT 之后
主题:C = GB、ST =..、L =..、SN =..、O =..、 OU =..、CN =.. ..、emailAddress =..
主题公共密钥信息:
公钥算法:ID-ecPublicKey
公钥:(256位)
出版:
04:90:31:60:B8:1a:05:A7:91:99:C1:B7:af:A6:44:
(笑声)
Ae:31:4b:66:41
ASN1 OID:prime256v1
NIST 曲线:P-256
签名算法:sha256WithRSAEncryption
53:B5:3D:b4:5F:D4:73:44:64:31:ed:8b:ff:89:12:E1:69:97:
(笑声)
3D:C6:af:19

服务器认证

证书: 
数据:
版本:1 (0x0)
序列号:
30:1f:84:ce:61:CB:18:5F:E7:6B:9c:70:18:5a:23:dc:5e:58:ee:8d
签名算法:sha256WithRSAEncryption
颁发者:C = GB、ST =..、L =..、O =..、CN = MyCa、 电子邮件地址=..
有效性
不是以前:2021年6月4日13:06:02 GMT
不在:2022年6月4日13:06:02 GMT
主题:C = GB、ST =..、L =..、O =..、OU =..、 cn = 192.168.1.91、emailAddress =.
主题公共密钥信息:
公钥算法:ID-ecPublicKey
公钥:(256位)
出版:
04:bc:76:b4:6c:84:BA:db:4D:E3:b4:9d:83:2e:28:
(笑声)
E4:B3:1b:E5:75
ASN1 OID:prime256v1
NIST 曲线:P-256
签名算法:sha256WithRSAEncryption
48:12:F7:8f:39:9e:44:cc:37:23:48:92:A8:7a:70:71:A2:fa:
(笑声)
dB:90:20:7f

OpenSSL Server 调试输出:

openssl s_server -port 12345 -cert Server\192.168.1.91\192.168.1.91.crt -key Server\192.168.1.91\localDevelopmentServer.key -verifyCAfile "myca\myca.pem" -debug -msg -security_debug_verbose -Verify 2

验证深度为2、必须返回证书 
使用默认的 temp DH 参数
安全回调:证书链 EE key=EC、bits=256、安全位=128:是
安全回调:证书链 CA 摘要=RSA-SHA256、安全位=128:是
接受

安全回调:版本=TLS 1.3:是
安全回调:版本=TLS 1.3:是
安全回调:版本=TLS 1.2:是
安全回调:版本=TLS 1.1:是
安全回调:版本=TLS 1.0:是

从0x6000adf40读取[0x6001b3153](5字节=> 5 (0x5))
0000 - 16 03 03 00 83…
<<<??? [长度0005]
16 03 03 00 83

从0x6000adf40读取[0x6001b3158](131字节=> 131 (0x83))
0000 - 01 00 00 7f 03 03 99 00-4D 65 E3 19 b9 da 17 ea 我
(笑声)
0080 - 01 02 01...
<<< TLS 1.3、握手[length 0083]、ClientHello
01 00 00 7f 03 99 00 4D 65 E3 19 b9 da 17 ea
(笑声)
01 02 01

安全回调:版本=TLS 1.2:是
安全回调:版本=TLS 1.3:是
安全回调:是的
安全回调:共享签名算法方案=ecdsa_secp521r1_SHA512、安全位=256:是
安全回调:共享签名算法方案=ecdsa_secp384r1_sha384、安全位=192:是
安全回调:共享签名算法方案=ecdsa_secp256r1_SHA256、安全位=128:是
安全回调:共享签名算法方案=ecdsa_sha1、安全位=80:是
安全回调:共享签名算法方案=RSA_pkcs1_SHA512、安全位=256:是
安全回调:共享签名算法方案=rs_pkcs1_sha384、安全位=192:是
安全回调:共享签名算法方案=RSA_pkcs1_SHA256、安全位=128:是
安全回调:共享签名算法方案=RSA_pkcs1_SHA1、安全位=80:是
安全回调:共享签名算法方案=ecdsa_secp521r1_SHA512、安全位=256:是
安全回调:共享签名算法方案=ecdsa_secp384r1_sha384、安全位=192:是
安全回调:共享签名算法方案=ecdsa_secp256r1_SHA256、安全位=128:是
安全回调:共享签名算法方案=ecdsa_sha1、安全位=80:是
安全回调:共享签名算法方案=RSA_pkcs1_SHA512、安全位=256:是
安全回调:共享签名算法方案=rs_pkcs1_sha384、安全位=192:是
安全回调:共享签名算法方案=RSA_pkcs1_SHA256、安全位=128:是
安全回调:共享签名算法方案=RSA_pkcs1_SHA1、安全位=80:是
安全回调:检查 Curve = P-256、安全位= 128:是
安全回调:共享曲线=P-256、安全位=128:是
安全回调:共享密钥套件=ECDHE-ECDSA-AES128-SHA256、安全位=128:是

>>>??? [长度0005]
16 03 03 00 4a

>> TLS 1.2、握手[长度004A]、ServerHello
02 00 00 46 03 15 1a 87 08 5a 9d F9 44 4F 10.
(笑声)
D2 bc ea 91 95 3D CB c0 23 00
安全回调:证书链 EE key=EC、bits=256、安全位=128:是
安全回调:证书链 CA 摘要=RSA-SHA256、安全位=128:是
>>>??? [长度0005]
16 03 02 dd

>> TLS 1.2、握手[length 02dd]、证书
0b 00 02 D9 00 02 d6 00 02 D3 30 82 02 CF 30 82
(笑声)
00 1a 8c F7 78 Fe aa 80 AD db 90 20 7f
安全回调:共享曲线=P-256、安全位=128:是

>>>??? [长度0005]
16 03 03 00 93

>> TLS 1.2、握手[length 0093]、ServerKeyExchange
0C 00 00 8f 03 00 17 41 04 70 8f 93 B3 26 A2 71
(笑声)
EF 6F 64
安全回调:签名算法掩码方案=ecdsa_secp256r1_SHA256、安全位=128:是
安全回调:签名算法掩码方案=RSA_PSS_PSS_SHA256、安全位=128:是
安全回调:签名算法掩码摘要= SHA224、算法= DSA、安全位= 112:是
安全回调:支持的签名算法方案=ecdsa_secp256r1_SHA256、安全位=128:是
安全回调:支持的签名算法方案=ecdsa_secp384r1_sha384、安全位=192:是
安全回调:支持的签名算法方案=ecdsa_secp521r1_SHA512、安全位=256:是
安全回调:支持的签名算法方案=RSA_PSS_PSS_SHA256、安全位=128:是
安全回调:支持的签名算法方案=RSA_PSS_PSS_SHA384、安全位=192:是
安全回调:支持的签名算法方案=RSA_PSS_PSS_SHA512、安全位=256:是
安全回调:支持的签名算法方案=RSA_PSS_rsae_SHA256、安全位=128:是
安全回调:支持的签名算法方案=RSA_PSS_rsae_sha384、安全位=192:是
安全回调:支持的签名算法方案=RSA_PSS_rsae_SHA512、安全位=256:是
安全回调:支持的签名算法方案=RSA_pkcs1_SHA256、安全位=128:是
安全回调:支持的签名算法方案=rsa_pkcs1_sha384、安全位=192:是
安全回调:支持的签名算法方案=RSA_pkcs1_SHA512、安全位=256:是
安全回调:支持的签名算法摘要= SHA224、算法= ECDSA、安全位= 112:是
安全回调:支持的签名算法方案=ecdsa_sha1、安全位=80:是
安全回调:支持的签名算法摘要= SHA224、算法= RSA、安全位= 112:是
安全回调:支持的签名算法方案=RSA_pkcs1_SHA1、安全位=80:是
安全回调:支持的签名算法摘要= SHA224、算法= DSA、安全位= 112:是
安全回调:支持的签名算法摘要=SHA1、算法=DSA、安全位=80:是
安全回调:支持的签名算法摘要= SHA256、算法= DSA、安全位= 128:是
安全回调:支持的签名算法摘要= SHA384、算法= DSA、安全位= 192:是
安全回调:支持的签名算法摘要= SHA512、算法= DSA、安全位= 256:是

>>>??? [长度0005]
16 03 03 00 3a

>> TLS 1.2、握手[length 003A]、证书请求
0D 00 00 36 03 01 02 40 00 2e 04 03 05 03 06 03
(笑声)
02 02 04 02 02 05 02 06 02 00 00

>>>??? [长度0005]
16 03 03 00 04

>> TLS 1.2、握手[length 0004]、ServerHelloDone
0E 00 00 00
写入0x6000adf40 [0x6001bc370](1041字节=> 1041 (0x411))
0000 - 16 03 00 4a 02 00 00-46 03 03 15 1a 87 08 5a... J.... F. Z
(笑声)
0400 - 04 02 05 02 06 02 00 00-16 03 00 04 0e 00 ........
0410-00。

从0x6000adf40读取[0x6001b3153](5字节=> 5 (0x5))
0000 - 16 03 03 03 03 08…
<<<??? [长度0005]
16 03 03 03 03 08

从0x6000adf40 [0x6001b3158](776字节=> 776 (0x308))读取
0000 - 0b 00 03 04 00 03 01 00-02 Fe 30 82 02 fa 30 82…………………………………………………………… 0...0。
(笑声)
0300 - 66 10 16 7a 3D C6 af 19 - f.z=……
<<< TLS 1.2、握手[length 0308]、证书
0b 00 03 04 00 03 01 00 02 Fe 30 82 02 fa 30 82
(笑声)
66 10 16 7a 3D C6 af 19
dept=1 C = GB、ST =..、L =..、O =..、CN = MyCa、 电子邮件地址=..
验证返回:1
dept=0 C = GB、ST =..、L =..、SN =..、O =..、 OU =..、CN =.. ..、emailAddress =..
验证返回:1

从0x6000adf40读取[0x6001b3153](5字节=> 5 (0x5))
0000 - 16 03 03 00 46... F
<<<??? [长度0005]
16 03 03 00 46

从0x6000adf40 [0x6001b3158](70字节=> 70 (0x46))读取
0000 - 10 00 00 42 41 04 AD 9d-F5 63 2c 98 A5 50 83 c0……ba... c、..
(笑声)
0040 - E2 35 75 24 A8 57 .5u$.W
<<< TLS 1.2、握手[length 0046]、ClientKeyExchange
10 00 00 42 41 04 AD 9d F5 63 2c 98 A5 50 83 c0
(笑声)
E2 35 75 24 A8 57

从0x6000adf40读取[0x6001b3153](5字节=> 5 (0x5))
0000 - 16 03 03 00 4F……O
<<<??? [长度0005]
16 03 03 00 4F

从0x6000adf40读取[0x6001b3158](79字节=> 79 (0x4F))
0000 - 0f 00 00 4b 04 03 00 47-30 45 02 21 00 8c D2 39……K... G0E...9.
(笑声)
0040 - F4 03 35 64 B6 91 98 34-98 d6 55 96 54 15 F8 ..5d...4.U.T..
<<< TLS 1.2、握手[length 004f]、证书验证
0f 00 00 4b 04 03 00 47 30 45 02 21 00 8c D2 39
(笑声)
F4 03 35 64 B6 91 98 34 98 d6 55 96 54 15 F8
安全回调:检查 Curve = P-256、安全位= 128:是
安全回调:检查签名算法方案=ecdsa_secp256r1_SHA256、安全位=128:是

>>>??? [长度0005]
15 03 03 00 02
写入0x6000adf40 [0x6001bc370](7字节=> 7 (0x7))
0000 - 1503 03 00 02 02 33 ...... 3.

>> TLS 1.2、警报[length 0002]、fatal decring_error
02 33.
误差
25769902144:错误:1417B07B:SSL 例程:TLS_PROCESS_CERT_VERIFY:错误签名:SSL/STATEM/STATEM_lib.c:505:
正在关闭 SSL
连接已关闭

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    请尝试捕获 NWP 日志(请参阅编程人员指南(https://www.ti.com/lit/swru455)第20章中的详细信息)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将 CC3135BOOST 用作网络协处理器、是否有另一种方式在不启用片上应用程序的情况下启用 NWP 日志? 这是否已在升压板上启用? 如果我插入 EMUBOOST (尝试连接到第4个 COM 端口)、这是否会干扰我的固件对 CC3135升压板的操作(使用 SPI、NHIB、Rst 线路)?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    现在看一下升压接头上的 P4.7。 希望我只需要将其馈入或手动将其连接到 EMU 板(以使用其串行转换器)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    借助 CC31xx 系列器件、您无需多路复用软件上的任何内容(仅在 CC32xx 上)。

    它不会干扰固件的任何实时操作、因为它总是会输出。

    此致、

    Shlomi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、通过 EMU 板上的一个引脚关闭-通过枚举的第4个 COM 端口/EMU 板读出 NWP 日志。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    /cfs-file/__key/communityserver-discussions-components-files/968/CC3135BOOST_5F00_NWP.log

    已启动服务器、重置我的固件、已附加 NWP 捕获。 在我点击"Reset"之前、可能会在开始时捕获一些垃圾。

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    是否可以附加创建的证书(根 CA 和客户端证书)?

    Shlomi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不能不牺牲现有的演示系统并公开客户详细信息。

    • NWP 日志是否公开私钥? 如果是,有没有任何方法可以将其发送给我,我可以使用 openssl s_client 测试 openssl 服务器的客户端证书?  (想一想-我是否能够使用 EMU 板和 UniFlash 读取私钥? 我想这种情况是出于安全考虑而被阻止的)
    • 设备私钥是否已硬编码? 即、每次生成 CSR 时、它是复制到文件系统中.key 文件的相同硬编码密钥、还是每次生成新的随机密钥?
    • 我已经验证了升压发送到服务器的证书的字节字节与我系统上的原始证书相同、它使用 openssl 验证传递 CA 验证

    我的直觉告诉我、客户端证书是 x509v1、或者客户端和服务器同意的密码套件不正确。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    证书不是私有的、因此我不会看到它被泄露的原因。

    NWP 不会公开私钥。

    根据 CSR 创建的器件密钥保留在器件中、出于安全原因无法获取。 有一个唯一的密钥和其他可以更改的密钥(临时)。 我想您使用的是唯一的密钥。

    您是否已刷写并安装了根 CA,该根 CA 应在服务器端验证客户端证书?

    此外、在这种情况下、监听器可能会有所帮助。

    Shlomi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    折衷可能不是最好的词-我会坚持暴露。 当然,如果没有 CA 私钥,则没有人可以使用 CA,但 CA 和设备证书都有公司和设备信息。 在 这种情况下,客户端证书在技术上是私有的-仅在建立呼叫主目录时暴露在所选服务器上。 基本上只是保持客户机的私密性。

    我正在使用唯一密钥。  

    我使用创建了一个新的本地密钥  

    OpenSSL ecparam -out .key -name prime256v1 -genkey 

    然后是使用该密钥的本地 CSR、并使用我在整个过程中使用的相同 CA 对其进行签名。 然后使用 openssl 使用新的(x509v1)证书对 openssl 服务器运行客户端演示:

    OpenSSL s_client -connect : cert v1test.crt -key p256v1.key -cfile tls1_2 - cipher ECDHE-ECDSA-AES128-SHA256 - curves prime256v1

    我指定了 TLS 1.2以及密码和曲线、以便与升压器尝试连接时使用的内容完全匹配。 连接成功。 因此、我要证明、x509是 v1是问题所在。

    我可以想象、关键故障或 CA 特定故障会产生表明这一点的错误消息。 我想我必须使用交换的随机值手动计算客户端正在发送的验证哈希、以查看这是否提供任何线索。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我知道。 请告诉我您的测试是如何进行的。