>  기사  >  백엔드 개발  >  Curl https가 PHP에서 SSL 인증을 건너뛰고 오류를 보고합니다.

Curl https가 PHP에서 SSL 인증을 건너뛰고 오류를 보고합니다.

小云云
小云云원래의
2018-03-01 13:55:3410253검색

이 기사는 주로 Curl https가 PHP에서 SSL 인증을 건너뛰는 오류 보고 문제에 대한 분석 및 솔루션을 공유합니다. 이것이 모든 사람에게 도움이 되기를 바랍니다.

function get($url = '', $cookie = ''){
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 从证书中检查SSL加密算法是否存在
  curl_setopt($ch, CURLOPT_SSLVERSION, 2);//设置SSL协议版本号
  if($cookie){
      curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
      curl_setopt ($ch, CURLOPT_REFERER,'https://wx.qq.com');
    }
  curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);  $output = curl_exec($ch);  if ( curl_errno($ch) )    return curl_error($ch);
  curl_close($ch);  return $output;
}

위 메소드는 사용자 컬이 https 요청을 시작하는 함수입니다. CURLOPT_SSLVERSION 항목은 SSL 프로토콜 버전을 지정합니다. 인터넷의 많은 코드에서는 1/2/3으로 설정할 수 있다고 하지만 내 테스트 결과는 다음과 같습니다.

  1. 1시로 설정하면 PHP 5.2.11 버전에서 다음 오류가 보고됩니다.
    "error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)"
    여기에 보고된 오류는 귀하의 PHP에 있는 openssl 버전이 너무 낮다는 것입니다. 해결책은 귀하의 PHP가 5.3.60에 도달하도록 업그레이드하는 것입니다(어떤 버전이 더 높은지는 테스트하지 않았으나 openssl 버전이 다음보다 높으면 괜찮습니다). 0.9.8)

  2. 2로 설정하면 다음 오류가 보고됩니다.
    Linux 환경 오류: " SSL 버전 범위가 유효하지 않습니다."
    Windows 환경에서는 "OpenSSL이 없이 빌드되었습니다." SSLv2 지원"
    이것은 이해하기 더 쉽습니다. 즉, SSL 프로토콜의 버전 번호가 유효하지 않습니다. 3으로 설정되면 다음 오류가 보고됩니다:

    Linux 환경 오류: "파일 끝이 발생했습니다".
  3. Windows 환경 오류: "login.wx.qq.com:443 연결 시 알 수 없는 SSL 프로토콜 오류"
  4. 이 오류의 원인 온라인으로 정보를 확인한 결과 SSLV2 및 SSLV3 때문인 것으로 생각됩니다. 보안 허점이 있으므로 WeChat은 더 이상 SSLV2 및 SSLV3 프로토콜 버전을 사용하지 않으므로 3으로 설정하면 오류가 발생합니다.



    function get($url = '', $cookie = ''){
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
      curl_setopt($ch, CURLOPT_HEADER, 0);
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 从证书中检查SSL加密算法是否存在
      curl_setopt($ch, CURLOPT_SSLVERSION, 2);//设置SSL协议版本号
      if($cookie){
          curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
          curl_setopt ($ch, CURLOPT_REFERER,'https://wx.qq.com');
        }
      curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);  $output = curl_exec($ch);  if ( curl_errno($ch) )    return curl_error($ch);
      curl_close($ch);  return $output;
    }

    위 메소드는 사용자 컬이 https 요청을 시작하는 함수입니다. CURLOPT_SSLVERSION 항목은 SSL 프로토콜 버전을 지정합니다. 인터넷의 많은 코드에서는 1/2/3으로 설정할 수 있다고 합니다. 내 테스트는 다음과 같습니다.

1로 설정하면 PHP 5.2.11 버전에서 다음 오류가 보고됩니다.

"error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)"
    오류 원인 여기에 보고된 내용은 PHP의 openssl 버전이 너무 낮다는 것입니다. 해결 방법 PHP를 5.3.60으로 업그레이드하십시오(어느 버전이 더 높은지는 테스트하지 않았으며 openssl 버전이 0.9.8보다 크면 문제가 없습니다).


  1. 2로 설정하면 다음 오류가 보고됩니다:

    Linux 환경 오류: "SSL 버전 범위가 유효하지 않습니다."
  2. Windows 환경 오류: "OpenSSL은 SSLv2 지원 없이 빌드되었습니다." 즉, SSL 프로토콜의 버전 번호가 유효하지 않습니다. 3으로 설정되면 다음 오류가 보고됩니다.
  3. Linux 환경에서 보고된 오류: "파일 끝이 발생했습니다."

    Windows 환경에서 보고된 오류: "login.wx.qq.com:443 연결 시 알 수 없는 SSL 프로토콜 오류"
    이 오류의 원인은 온라인으로 정보를 확인한 결과 SSLV2 때문인 것으로 생각됩니다. SSLV3에 보안 허점이 있어 WeChat에서는 더 이상 사용하지 않습니다. SSLV2 및 SSLV3 프로토콜 버전이므로 3으로 설정하면 오류가 발생합니다.

  4. 관련 권장 사항:


  5. Nginx 환경에서 PHP가 사용하는 SSL 인증(https) 구성

위 내용은 Curl https가 PHP에서 SSL 인증을 건너뛰고 오류를 보고합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.