使用rustls_pki_types读取私钥文件触发NoItemsFound错误
问题原因与解决办法
核心问题
你用OpenSSL生成私钥时没加-nodes参数,生成的是加密的PKCS#8格式私钥,而rustls_pki_types的各类私钥读取方法(包括PrivateKeyDer/PrivatePkcs1Der/PrivatePkcs8Der的from_pem_file)默认不支持读取加密的PEM私钥,因此触发NoItemsFound错误。
Python代码能正常用是因为多数Python TLS库(比如标准库ssl)会自动处理加密私钥的密码输入逻辑,但rustls_pki_types没有这个默认处理流程。
两种解决路径
路径1:重新生成未加密私钥
修改OpenSSL命令,添加-nodes参数(表示不加密私钥),同时修正subjectAltName的格式错误(原命令里的IP.XX.XX.XX.XX是无效格式,需改成IP:XX.XX.XX.XX):
openssl req -newkey rsa:4096 -nodes -subj "/C=XX/ST=XX/L=XX/O=XX/CN=XX" -addext "subjectAltName = IP:XX.XX.XX.XX" -outform pem -keyout C:\filepath\serverPrivate.pem -out C:\filepath\serverRequest.pem
路径2:解密现有加密私钥
如果不想重新生成,用OpenSSL把现有加密私钥转成未加密版本:
openssl rsa -in C:\filepath\serverPrivate.pem -out C:\filepath\serverPrivate_unencrypted.pem
执行时输入你生成私钥时设置的密码,就能得到未加密的PEM私钥,替换原文件路径即可正常读取。
代码优化建议(可选)
不要用unwrap()直接忽略错误,改成显式错误处理,方便排查问题:
fn read_certs_from_file() -> Result<(Vec<CertificateDer<'static>>, PrivateKeyDer<'static>), Box<dyn Error>> { let certs = CertificateDer::pem_file_iter("./src/serverChain.pem")? .collect::<Result<_, _>>()?; let key = PrivateKeyDer::from_pem_file("./src/serverPrivate.pem")?; Ok((certs, key)) }
内容的提问来源于stack exchange,提问作者mwolfe 11
相关产品推荐
相关产品推荐

