성공적인 HTTPS 요청에는 HTTP 클라이언트가 알려지고 신뢰할 수 있는 루트 목록에 대한 서버 제공 TLS 인증서 인증서. PHP Curl 확장도 다르지 않습니다. 컬 확장 프로그램은 libcurl을 사용하여 HTTPS 요청을 하고 libcurl은 OpenSSL과 같은 TLS 라이브러리를 사용하여 요청을 검증합니다.
Curl 확장 프로그램에는 다음을 포함하는 유효한 파일이 필요합니다. 모두 HTTPS 검증을 완료하기 위한 신뢰할 수 있는 루트 인증서 및 PHP 이를 php.ini 파일의 지시문으로 노출합니다.
Linux, BSD 및 macOS에서 libcurl은 기본적으로 시스템 루트를 사용할 수 있습니다. 인증서가 있지만 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 호출이 잘못된 응답으로 실패하고, cur_error가 SSL 인증서 문제: 로컬 발급자 인증서를 가져올 수 없음 오류를 나타내는 경우 이는 Curl을 의미합니다. 루트 인증서가 포함된 파일이 제공되지 않았거나 파일을 찾을 수 없었습니다.
이 오류는 Linux, BSD 및 macOS 시스템에서는 흔하지 않지만 상당히 Windows에서는 루트를 얻기 위해 지정된 파일이 없기 때문에 일반적입니다. 인증서이며 PHP는 루트 인증서 목록을 제공하지 않습니다.
해결책은 최신 루트가 포함된 파일을 제공하는 것입니다. 또는 이상적으로는 Curl이 기본 루트 저장소를 구문 분석하도록 합니다. 기본 운영 체제가 제공합니다.
Curl 7.71 이상에서는 Curl 설정이 가능합니다. Curl에 기본(시스템) 루트 인증서를 사용하도록 요청하는 옵션입니다. 이는 Curl이 시스템 루트 인증서를 구문 분석하는 Windows에서도 작동합니다.
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);
위 스니펫은 컬 버전과 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);
PHP 8.2 이전 버전에서 실행되는 애플리케이션의 경우(여기서 CURLSSLOPT_NATIVE_CA 상수를 사용할 수 없음) 또는 Curl 버전이 7.71보다 오래된 경우 권장되는 대체 솔루션은 Curl 호환 파일을 다운로드하는 것입니다. 루트 인증서 파일을 선택하고 이를 사용하도록 PHP 또는 Curl 요청을 구성하세요.
Curl 프로젝트는 최신 인증서 목록을 유지 관리합니다. Mozilla에서 추출한 CA 인증서를 확인하세요.
cacert.pem 파일을 다운로드하세요
php.ini 파일을 편집하고 cacert.pem 파일의 절대 경로를 가리키도록 컬.cainfo 항목을 수정합니다.
$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
선택적으로 웹 서버(예: Apache)를 다시 시작하여 INI 파일을 다시 로드합니다.
이 접근 방식의 단점은 cacert.pem 파일을 정기적으로 업데이트해야 한다는 것입니다. cacert.pem 예를 들어 Curl 프로젝트에서 제공하는 파일은 루트에서 추출됩니다. Mozilla가 관리하는 저장소입니다. 평균적으로 이 목록과 파일은 1년에 4~5번 업데이트됩니다. 최신 루트와의 호환성을 보장하려면 인증서 목록을 보려면 이 파일의 로컬 복사본을 업데이트하세요. 정기적으로
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_BLOB 옵션을 사용하면 cacert.pem 내용을 포함하는 문자열이 가능합니다.
위 내용은 Windows에서 PHP Curl HTTPS 인증 기관 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!