成功的 HTTPS 請求涉及 HTTP 用戶端驗證 伺服器根據已知且受信任的根列表提供的 TLS 證書 證書。 PHP Curl 擴充功能沒有什麼不同;捲曲 擴充功能使用 libcurl 發出 HTTPS 請求,而 libcurl 又使用 OpenSSL 等 TLS 函式庫來驗證請求。
Curl 擴充功能需要一個包含以下內容的有效檔案:所有的 受信任的根證書來完成HTTPS驗證,以及PHP 將其公開為 php.ini 檔案中的指令。
在 Linux、BSD 和 macOS 上,libcurl 可以預設為系統根目錄 證書,但這在 Windows 上是不可能的,因為 Windows 確實 不附帶包含所有系統根目錄的單一文件 證書。
本文討論了使用 Curl 擴充功能成功發出 HTTPS 請求的兩種可能方法,以及不採取哪些措施可能導致 HTTPS 請求不安全。
失敗原因
$ch = curl_init('https://php.watch'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_exec($ch); // false curl_error($ch); // SSL certificate problem: unable to get local issuer certificate
如果curl_exec呼叫失敗並回傳錯誤回應,並且如果curl_error指示SSL憑證問題:無法取得本地頒發者憑證錯誤,這表示Curl未提供包含根證書的文件,或無法發現它。
此錯誤在 Linux、BSD 和 macOS 系統上並不常見,但相當多 Windows上常見,因為沒有指定檔案取得root 證書,並且 PHP 不在其上提供根證書列表
解決方案是提供一個包含最新根目錄的文件 證書,或者理想情況下,讓 Curl 解析本地根存儲 底層作業系統提供。
使用本機憑證授權單位
在 Curl 7.71 及更高版本上,可以設定 Curl 請 Curl 使用本機(系統)根憑證的選項。 這甚至在 Windows 上也有效,其中 Curl 解析系統根證書 並使用它們。
當 CURLOPT_SSL_OPTIONS 選項設定為 CURLSSLOPT_NATIVE_CA 時 或包含這些位元的位元掩碼,Curl 嘗試使用本機 根證書存儲,取決於證書的功能和版本 底層 TLS 庫。
如果 Curl 擴充功能是使用 Curl 7.71 或更高版本以及 PHP 8.2 及更高版本建構的,這是建議的修復。
$ch = curl_init('https://php.watch'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); curl_exec($ch);
請注意,上面的程式碼片段不會檢查Curl 版本和 PHP 版本,並假設滿足 PHP 和 Curl 版本要求。這 以下是有條件地新增 Curl 選項的範例:
$ch = curl_init('https://php.watch'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if (defined('CURLSSLOPT_NATIVE_CA') && version_compare(curl_version()['version'], '7.71', '>=')) { curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); } curl_exec($ch);
下載並維護 cacert.pem 檔案
對於在 8.2 之前的 PHP 版本上執行的應用程式(其中 CURLSSLOPT_NATIVE_CA 常數不可用),或當 Curl 版本低於 7.71 時, 推薦的替代解決方案是下載 Curl 相容的 根證書文件,並配置 PHP 或 Curl 請求來使用它。
Curl 項目維護著最新的證書清單。請參閱從 Mozilla 提取的 CA 憑證。
下載 cacert.pem 檔案
- 將檔案移至 PHP 和 Web 伺服器可存取的目錄。例如,C:/php/cacert.pem。
編輯 php.ini 檔案並修改curl.cainfo 條目以指向 cacert.pem 檔案的絕對路徑。
$ch = curl_init('https://php.watch'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_exec($ch); // false curl_error($ch); // SSL certificate problem: unable to get local issuer certificate
(選用)重新啟動 Web 伺服器(例如 Apache)以重新載入 INI 檔案。
這種方法的缺點是必須定期更新 cacert.pem 檔案。 cacert.pem 例如,Curl 專案提供的檔案是從根目錄中提取的 由 Mozilla 維護的商店。平均而言,此列表和文件得到 每年更新4-5次。確保與最新root的兼容性 證書列表,請確保更新此文件的本機副本 定期
如果無法修改INI 文件,請在Curl 請求中指定cacert.pem 文件的絕對路徑:
$ch = curl_init('https://php.watch'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); curl_exec($ch);
在PHP 8.2 和Curl 7.77 上,可以使用CURLOPT_CAINFO_OB 選項來取得包含cacert.pem 內容的字串。
以上是如何修復 Windows 上的 PHP Curl HTTPS 憑證授權單位問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

記事本++7.3.1
好用且免費的程式碼編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。