当我之前的服务器设置是 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-引擎