URLDownloadToFile()
是一个用于从指定 URL 下载文件到本地的 API 函数,通常在 Windows 平台上使用。当使用这个函数时,如果遇到需要验证 SSL/TLS 证书的情况(例如,访问 HTTPS 网站),而该证书不是由受信任的证书颁发机构(CA)签发的,就会出现证书验证失败的问题。
SSL/TLS 证书用于在客户端和服务器之间建立加密连接,并验证服务器的身份。自签名证书是由个人或组织自行签发的,而不是由公认的证书颁发机构签发。因此,大多数浏览器和应用程序默认情况下不会信任自签名证书。
使用自签名证书的优势在于:
自签名证书常用于:
当使用 URLDownloadToFile()
访问使用自签名证书的 HTTPS 网站时,可能会遇到以下错误:
The server certificate does not fit the validation policy.
这是因为默认情况下,Windows 不信任自签名证书。
要解决这个问题,可以采取以下几种方法:
可以通过设置 URLDownloadToFile()
的参数来忽略证书验证。这种方法不推荐用于生产环境,因为会降低安全性。
#include <urlmon.h>
HRESULT DownloadFile(LPCTSTR pszURL, LPCTSTR pszFilePath) {
HRESULT hr = URLDownloadToFile(NULL, pszURL, pszFilePath, 0, NULL);
if (FAILED(hr)) {
// 忽略证书验证
DWORD dwFlags = 0x100; // URLDOWNLOADTOFILE_FLAG_IGNORE_SSLERRORS
hr = URLDownloadToFile(NULL, pszURL, pszFilePath, dwFlags, NULL);
}
return hr;
}
可以将自签名证书安装到系统的受信任根证书存储中,这样系统就会信任该证书。
.cer
文件)。certmgr.msc
打开证书管理器。可以编写一个自定义的证书验证回调函数,并在调用 URLDownloadToFile()
时使用该回调函数。
#include <urlmon.h>
BOOL CALLBACK CertCallback(void* pCert, DWORD dwFlags, void* pvReserved) {
// 自定义证书验证逻辑
return TRUE; // 忽略证书验证错误
}
HRESULT DownloadFileWithCertCallback(LPCTSTR pszURL, LPCTSTR pszFilePath) {
HRESULT hr = URLDownloadToFile(NULL, pszURL, pszFilePath, 0, &CertCallback);
return hr;
}
通过以上方法,可以解决 URLDownloadToFile()
不使用自签名证书的问题。选择哪种方法取决于具体的应用场景和安全需求。
领取专属 10元无门槛券
手把手带您无忧上云