NSS: client certificate not found (nickname not specified)

博客记录了在使用curl进行接口联调时遇到的NSS错误:clientcertificatenotfound(nicknamenotspecified)。最初问题表现为证书未被信任,解决方法是将自签名证书的CA加入信任。但之后问题转变为找不到客户端证书,最终解决方案是获取并使用客户端证书(p12),通过openssl转换为.pem格式,并在curl命令中指定--cert和--key参数,或者合并为all.pem后使用。问题成功解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NSS: client certificate not found (nickname not specified)报错排查及解决

curl: (35) NSS: client certificate not found (nickname not specified)

排查好久,这里记录下这个坑。

初始

这是第三方的一个接口,测试联调时,curl https://xxx.com.cn发现提示证书未信任,

curl: (60) Peer's certificate issuer has been marked as not trusted by the user.
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

看到熟悉的报错,我知道将对方自签名证书的CA加入信任即可。一通操作之后却还是不行,但是报错变成了新的.

curl: (35) NSS: client certificate not found (nickname not specified)

-vvv也还是没发现什么新的有用信息。
curl -vvv https://xxxxx 时总是报错

* About to connect() to xxx.com.cn port 8912 (#0)
*   Trying 111.122.224.223...
* Connected to gwtest.ccic-net.com.cn (111.122.224.223) port 8912 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* NSS: client certificate not found (nickname not specified)
* NSS error -12227 (SSL_ERROR_HANDSHAKE_FAILURE_ALERT)
* SSL peer was unable to negotiate an acceptable set of security parameters.
* Closing connection 0
curl: (35) NSS: client certificate not found (nickname not specified)

原因

其实报错提示很明显,client certificate not found,开始没想到是双向认证,一直以为是CA根证书信任没弄好,结果一直无法解决。

解决

找第三方拿到客户端证书jks证书(p12)。

openssl pkcs12 -in xxx.p12 -out client.pem -nokeys       #客户端个人证书的公钥
openssl pkcs12 -in xxx.p12 -out key.pem -nocerts -nodes     #客户端个人证书的私钥
也可以转换为公钥与私钥合二为一的文件;
openssl pkcs12 -in xxx.p12 -out all.pem -nodes                                   #客户端公钥与私钥,一起存在all.pem中

使用client.pem+key.pem

curl --cert client.pem --key key.pem https://www.xxxx.com

或使用all.pem

curl --cert all.pem  https://www.xxxx.com

问题解决~

<think>好的,用户现在询问的是关于STM32CubeMX中如何配置SPI的Hardware NSS为Disable的问题。之前我给出的配置步骤里提到过这个设置,但用户可能需要更详细的指导。首先,我需要回忆STM32的SPI配置,特别是NSS引脚的作用和配置选项。 用户可能是在实际配置时遇到了问题,或者在按照之前的教程操作时对这一步不太确定。他们可能不太清楚NSS引脚的作用,或者为什么需要禁用硬件NSS。因此,我需要解释清楚NSS的作用,以及禁用后的影响。 首先,NSS(Slave Select)是SPI协议中用于选择从设备的信号。在硬件模式下,NSS由硬件自动管理,主模式下通常不需要使用,但某些情况下可能需要软件控制。禁用硬件NSS意味着用户需要手动控制片选信号,比如通过GPIO引脚来拉高或拉低CS引脚。 接下来,我需要详细说明在STM32CubeMX中的配置步骤。用户可能想知道在图形界面中如何找到这个选项,具体的位置在哪里,以及相关的参数设置。需要分步骤说明,从选择SPI1开始,到参数设置中的Hardware NSS选项,选择Disable,并确保正确分配GPIO作为软件控制的CS引脚。 同时,用户可能还关心为什么需要这样配置,比如使用软件控制CS的好处,或者硬件NSS可能带来的问题。例如,当使用多个从设备时,硬件NSS可能不够灵活,需要软件控制每个设备的片选。 另外,用户可能在代码中看到CS引脚的定义,比如PA4作为GPIO输出,需要解释这部分代码是如何与SPI配置配合的。可能需要提到在初始化代码中如何设置GPIO,以及在数据传输时如何手动控制CS引脚的电平。 还要注意可能的常见错误,比如忘记配置GPIO引脚为输出模式,或者在代码中没有正确控制CS信号,导致SPI通信失败。这时候需要提醒用户在配置后检查GPIO的设置,并确保在传输数据前拉低CS,传输完成后拉高。 最后,用户可能需要一个完整的配置流程示例,结合之前的教程,确保每一步都正确无误。需要确认所有相关配置步骤,包括SPI模式、时钟极性、相位、数据大小等,都正确设置,并且和OLED屏幕的规格相符。 总结来说,用户需要明确的步骤来禁用硬件NSS,理解其背后的原因,以及如何在代码中正确使用软件控制的CS引脚。确保回答清晰,覆盖配置步骤、原理和常见问题,帮助用户顺利完成配置。</think>在STM32CubeMX中配置SPI的**Hardware NSS为Disable**是开发中常见的关键操作,以下是详细配置流程及原理说明: --- ### **一、NSS信号的作用** NSS(Slave Select)是SPI协议中用于**选择从设备**的信号: - **硬件模式**:由SPI控制器自动管理片选信号 - **软件模式**:需手动控制GPIO电平实现片选 - **禁用场景**:当使用**多个从设备**或需要**灵活控制片选时序**时 --- ### **二、STM32CubeMX配置步骤** 1. **打开SPI1配置界面** - 左侧外设树找到 `Connectivity` → `SPI1` - 工作模式选择 `Full-Duplex Master` 2. **参数设置** ```plaintext Parameter Settings → Hardware NSS Signal → 选择 Disable ``` 3. **引脚验证** - 确认NSS引脚(默认PA4)已自动变为普通GPIO - 若需使用其他GPIO作为CS: - 在`Pinout View`中手动分配一个GPIO(如PA4) - 设置该GPIO为`GPIO_Output`模式 4. **配置示例(以PA4作为软件CS)** | 引脚 | 功能 | 模式 | |------|---------------|--------------------| | PA4 | GPIO_Output | 推挽输出/高速模式 | | PA5 | SPI1_SCK | Alternate Function | | PA7 | SPI1_MOSI | Alternate Function | --- ### **三、Keil代码实现** 在生成的代码中需手动控制CS信号: ```c // 宏定义简化操作(需根据实际引脚修改) #define OLED_CS_PIN GPIO_PIN_4 #define OLED_CS_PORT GPIOA // 传输数据时的典型操作流程 void SPI_SendData(uint8_t *data, uint16_t size) { HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_RESET); // 拉低CS HAL_SPI_Transmit(&hspi1, data, size, 100); // 传输数据 HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_SET); // 拉高CS } ``` --- ### **四、常见问题排查** 1. **SPI无响应** - 检查GPIO时钟是否使能 - 验证CS引脚电平是否在传输期间保持低电平 - 用逻辑分析仪捕捉SCK/MOSI信号波形 2. **通信错位** - 确认SPI的CPOL/CPHA设置与从设备一致 - 检查数据大小设置(通常OLED使用8bit模式) 3. **性能优化** ```c // 使用寄存器直接操作可提高速度(示例代码) void Fast_CS_Control(uint8_t state) { if(state) OLED_CS_PORT->BSRR = OLED_CS_PIN; // 置高 else OLED_CS_PORT->BSRR = (uint32_t)OLED_CS_PIN << 16; // 置低 } ``` --- ### **五、硬件NSS与软件NSS对比** | 特性 | 硬件NSS | 软件NSS | |--------------------|--------------------------|--------------------------| | 控制方式 | 自动触发 | 手动GPIO操作 | | 多从机支持 | 需硬件支持多CS | 灵活扩展 | | 时序精度 | 精确到时钟周期 | 依赖代码执行速度 | | 典型应用场景 | 单一从设备 | OLED/多外设/自定义时序 | --- 通过以上配置,可确保SPI通信在**禁用硬件NSS**时仍能稳定工作。建议在首次配置时使用STM32CubeMX的`Clock Configuration`界面验证SPI时钟频率是否符合从设备要求(一般OLED屏支持0-10MHz范围)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MicePro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值