OpenSSL 错误:lib(128):capi_rsa_priv_enc:客户端身份验证不支持该函数

OpenSSL 错误:lib(128):capi_rsa_priv_enc:客户端身份验证不支持该函数

当我之前的服务器设置是 Ubuntu 20.04 并且 openssl 版本是 1.1.1b 时,通过 API 签署文件的脚本运行正常。

但升级后,我遇到了这个问题。服务器升级前后的客户端环境相同。

现在
当前服务器环境:

    Ubuntu 22..04  
    Openssl 3.0.2  
    Apache 2.4.52  
    SSL x509 certificate is installed on the Apache Server 

客户端环境:

    Windows 2016  
    Curl 7.78.0
    openssl 1.1.1f

以下命令已执行,通过 https 在服务器上运行的 Web API 对文件进行签名。

curl.exe --request POST --cacert "ca.crt" --cert "user.crt" --engine capi --key-type ENG --key "user.key" --verbose -L "https://webapi:port" --header "content-type: multipart/form-data" --form "[电子邮件保护]“--输出“输出文件.txt””

尾部输出:

....

[5字节数据]

  • TLSv1.2 (IN),TLS 握手,Hello 请求 (0):{[4 字节数据]
  • TLSv1.2 (OUT)、TLS 握手、客户端 hello (1): } [232 字节数据]
  • TLSv1.2 (IN),TLS 握手,服务器 hello (2):{[117 字节数据]
  • TLSv1.2 (IN),TLS 握手,证书 (11):{[1319 字节数据]
  • TLSv1.2 (IN),TLS 握手,服务器密钥交换 (12):{[556 字节数据]
  • TLSv1.2 (IN),TLS 握手,请求 CERT (13):{[1979 字节数据]
  • TLSv1.2 (IN),TLS 握手,服务器完成 (14):{[4 字节数据]
  • TLSv1.2 (OUT),TLS 握手,证书 (11):} [4292 字节数据]
  • TLSv1.2(OUT),TLS 握手,客户端密钥交换(16):} [37 字节数据]
  • TLSv1.2 (OUT),TLS 警报,内部错误 (592):} [2 字节数据]
  • OpenSSL SSL_read:错误:8006F074:lib(128):capi_rsa_priv_enc:函数不受支持,errno 0 0 82.4M 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
  • 关闭连接 0 curl:(56)OpenSSL SSL_read:错误:8006F074:lib(128):capi_rsa_priv_enc:函数不受支持,errno 0

我尝试在服务器 ssl.conf 上禁用 tlsv1.2 和 tlsv1.3,但问题仍然存在。

我对 openssl 和 x509 证书故障排除的理解有限。

答案1

该问题似乎与 CAPI 引擎的使用有关。我怀疑所使用的 OpenSSL 版本不支持“capi_rsa_priv_enc”函数Openssl 1.1.1f capi_rsa_priv_enc 链接

并且看起来 curl 是使用旧版本的 OpenSSL 编译的,该版本确实支持该功能。

检查 curl 使用的是什么版本:

curl --version

尝试在 Windows 客户端上使用 OpenSSL 1.1.1f 重新编译 curl 并检查错误是否已修复。

编辑:

如果 OpenSSL 服务器版本 >=1.1.1,则客户端的带有 CAPI 和 Mutual Auth 的 OpenSSL 将无法工作。TLS 1.2 不适用于 Windows

较旧的 CAPI 引擎不支持 TLS 1.2 和 1.3 的 RSA-PSS。并且根据您的服务器配置,它使用 OpenSSL-3,这将导致协商失败。

此外,OpenSSL-3 版本无论如何都不会支持 CAPI 引擎,因此我建议升级客户端系统以使用下一代 Windows Crypto API 来访问 WebAPI。

您还可以查看openssl-cng-引擎

相关内容