我在用C ++编写的客户端应用程序中使用libcurl,以使用HTTPS连接到远程系统。通过客户端证书进一步保护连接。连接后,我会收到以下消息:
Cert file: 'C:\my-certs\client.crt'.
Key file: 'C:\my-certs\client.key'.
CURL (0): Trying <ipaddress>...
CURL (0): TCP_NODELAY set
CURL (0): Connected to <hostname> (<ipaddress>) port 443 (#0)
CURL (0): schannel: SSL/TLS connection with <hostname> port 443 (step 1/3)
CURL (0): schannel: disabled server certificate revocation checks
CURL (0): schannel: verifyhost setting prevents Schannel from comparing the supplied target name with the subject names in server certificates.
CURL (0): schannel: Failed to get certificate location for C:\my-certs\client.crt
The connection to <hostname> was closed.
我确定.crt和.key文件位于指定位置,并且可读。我正在CURL中设置以下与SSL相关的选项:
CURLOPT_SSLCERT: C:\my-certs\client.crt
CURLOPT_SSLKEY: C:\my-certs\client.key
CURLOPT_SSL_VERIFYHOST: 0
CURLOPT_SSL_VERIFYPEER: 0
“无法获取证书位置”消息是什么意思,我该怎么办?
我正在使用从vcpkg提取的libcurl / 7.61.1-DEV WinSSL zlib / 1.2.11,并在Windows 7上运行。只有当我添加SSLCERT和SSLKEY选项时,它才会失败。
答案 0 :(得分:1)
如果libcurl是在Windows(本地TLS API)上使用schannel构建的,则似乎无法指定证书文件的路径。您需要按照docs中的说明,指定系统存储中证书的路径:
(仅Schannel)客户端证书必须由证书存储的路径表达式指定。 (不支持加载PFX;您可以先将其导入商店。)您可以使用<store location><store name><thumbprint>
来引用系统证书存储中的证书,例如"CurrentUser\MY\934a7ac6f8a5d579285a74fa61e19f23ddfe8d7a"
。指纹通常是SHA-1十六进制字符串,您可以在证书详细信息中看到。支持以下商店位置:CurrentUser,LocalMachine,CurrentService,服务,CurrentUserGroupPolicy,LocalMachineGroupPolicy,LocalMachineEnterprise。
您也可以在libcurl源代码中检查它,查看文件schannel_connect_step1
中的函数get_cert_location
和lib/vtls/schannel.c