file_get_contents (): การดำเนินการ SSL ล้มเหลวด้วยรหัส 1, ไม่สามารถเปิดใช้งาน crypto


188

ฉันพยายามเข้าถึงบริการ REST นี้โดยเฉพาะจากหน้า PHP ที่ฉันสร้างขึ้นบนเซิร์ฟเวอร์ของเรา ฉันทำให้ปัญหาแคบลงเหลือสองบรรทัดนี้ ดังนั้นหน้า PHP ของฉันมีลักษณะเช่นนี้:

<?php
$response = file_get_contents("https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json");

echo $response; ?>

หน้าจะตายในบรรทัดที่ 2 พร้อมข้อผิดพลาดต่อไปนี้:

  • คำเตือน: file_get_contents (): การดำเนินการ SSL ล้มเหลวด้วยรหัส 1 OpenSSL ข้อความแสดงข้อผิดพลาด: ข้อผิดพลาด: 14090086: กิจวัตร SSL: SSL3_GET_SERVER_CERTIFICATE: การตรวจสอบใบรับรองล้มเหลวใน ... php on line 2
    • คำเตือน: file_get_contents (): ไม่สามารถเปิดใช้งานการเข้ารหัสลับใน ... php ในบรรทัดที่ 2
    • คำเตือน: file_get_contents ( https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json): ไม่สามารถเปิดสตรีม: การดำเนินการล้มเหลวใน ... php ในบรรทัด 2

เรากำลังใช้เซิร์ฟเวอร์ Gentoo เราเพิ่งอัพเกรดเป็น PHP เวอร์ชัน 5.6 มันเป็นหลังจากการอัพเกรดเมื่อปัญหานี้ปรากฏขึ้น

ฉันพบเมื่อฉันแทนที่บริการ REST ด้วยที่อยู่เช่นhttps://www.google.com; หน้าของฉันใช้งานได้ดี

ในความพยายามก่อนหน้านี้ฉันตั้งค่า“verify_peer”=>falseและส่งผ่านสิ่งนั้นเป็นอาร์กิวเมนต์ไปยัง file_get_contents ตามที่อธิบายไว้ที่นี่: file_get_contents ไม่สนใจ Verify_peer => false? แต่เหมือนนักเขียนที่ระบุไว้; มันไม่ต่างอะไรเลย

ฉันถามผู้ดูแลเซิร์ฟเวอร์ของเราว่ามีบรรทัดเหล่านี้ในไฟล์ php.ini ของเราหรือไม่:

  • ขยาย = php_openssl.dll
  • allow_url_fopen = เปิด

เขาบอกฉันว่าเนื่องจากเราอยู่ใน Gentoo, openssl จึงถูกรวบรวมเมื่อเราสร้าง; และยังไม่ได้ตั้งค่าในไฟล์ php.ini

ฉันยังยืนยันว่าallow_url_fopenใช้งานได้ เนื่องจากลักษณะเฉพาะของปัญหานี้ ฉันไม่ได้รับข้อมูลจำนวนมากเพื่อขอความช่วยเหลือ คุณเคยเจอเรื่องแบบนี้บ้างไหม? ขอบคุณ


หากคุณใช้ Kaspersky ให้ตรวจสอบสิ่งนี้: stackoverflow.com/a/54791481/3549317
cespon

คำตอบ:


344

นี่เป็นลิงค์ที่มีประโยชน์อย่างมากในการค้นหา:

http://php.net/manual/en/migration56.openssl.php

เอกสารอย่างเป็นทางการที่อธิบายการเปลี่ยนแปลงที่ทำเพื่อเปิด ssl ใน PHP 5.6 จากที่นี่ฉันได้เรียนรู้เกี่ยวกับพารามิเตอร์อีกหนึ่งตัวที่ฉันควรตั้งค่าเป็นเท็จ: "Verify_peer_name" => false

หมายเหตุ:นี้มีมากผลกระทบอย่างมีนัยสำคัญการรักษาความปลอดภัย การปิดใช้งานการตรวจสอบอาจทำให้ผู้โจมตี MITMใช้ใบรับรองที่ไม่ถูกต้องดักฟังคำขอ แม้ว่ามันจะมีประโยชน์ในการทำสิ่งนี้ในการพัฒนาท้องถิ่น แต่ก็ควรใช้วิธีการอื่นในการผลิต

ดังนั้นรหัสการทำงานของฉันมีลักษณะดังนี้:

<?php
$arrContextOptions=array(
    "ssl"=>array(
        "verify_peer"=>false,
        "verify_peer_name"=>false,
    ),
);  

$response = file_get_contents("https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json", false, stream_context_create($arrContextOptions));

echo $response; ?>

122
สิ่งนี้เป็นการหยุดการรับรอง SSL และเป็นช่องโหว่ด้านความปลอดภัย
hypery2k

8
ตามที่ @ hypery2k ชี้ให้เห็นคุณไม่ควรปิดใช้งานการยืนยัน ดูคำตอบของฉันสำหรับโซลูชันทางเลือกที่ไม่สามารถเอาชนะ ssl ได้
elitechief21

4
สิ่งนี้ไม่ควรทำ แทนที่จะเหยียบย่ำปัญหาที่คุณควรแก้ไข ดูทางออกที่ดีกว่าจาก @ elitechief21
Jasper

5
สิ่งนี้อาจทำให้คุณหงุดหงิดหากคุณกำลังทดสอบจากสภาพแวดล้อมท้องถิ่นกับ API ในกรณีนี้ปกติฉันจะทำการตรวจสอบ
HappyCoder

12
ตั้งแต่ฉันมักจะมาที่นี่เมื่อฉันพยายามทำเช่นนี้และนี่คือรหัสที่จะสามารถคัดลอกและวาง:file_get_contents($url, false, stream_context_create(array('ssl' => array('verify_peer' => false, 'verify_peer_name' => false))));
Laurent

154

คุณไม่ควรปิดการยืนยัน หากคุณควรดาวน์โหลดบันเดิลใบรับรองบางทีชุดcurlจะทำอย่างไร

จากนั้นคุณเพียงแค่วางมันลงบนเว็บเซิร์ฟเวอร์ของคุณให้ผู้ใช้ที่ได้รับอนุญาต php เพื่ออ่านไฟล์ จากนั้นรหัสนี้ควรจะทำงานให้คุณ:

$arrContextOptions=array(
    "ssl"=>array(
        "cafile" => "/path/to/bundle/cacert.pem",
        "verify_peer"=> true,
        "verify_peer_name"=> true,
    ),
);

$response = file_get_contents("https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json", false, stream_context_create($arrContextOptions));

หวังว่าใบรับรองหลักของไซต์ที่คุณพยายามเข้าถึงนั้นอยู่ในกลุ่ม curl หากไม่เป็นเช่นนี้จะยังใช้งานไม่ได้จนกว่าคุณจะได้รับใบรับรองหลักของไซต์และนำไปไว้ในไฟล์ใบรับรองของคุณ


ไฟล์. crt มาจากไหน ไม่มีลิงค์ในเว็บไซต์ curl ที่คุณให้มีเพียง. pem
vee

1
ไฟล์ pem ควรเหมือนกัน ในขณะที่โพสต์นี้พวกเขามีใบรับรองสองรุ่นในเว็บไซต์ของพวกเขาคือ pem และ crt และฉันเพิ่งใช้ไฟล์ crt สำหรับตัวอย่างของฉัน (โดยปกติแล้วเป็นสิ่งที่พวกเขาจะลบ) สำหรับการอ้างอิงในอนาคตไฟล์ crt มักจะเปลี่ยนชื่อไฟล์ pem ที่ถูกเปลี่ยนชื่อเพื่อให้ windows รับรู้ไฟล์เป็นไฟล์ใบรับรอง กรณีนี้จะไม่เกิดขึ้นเสมอไป แต่ในกรณีนี้ ฉันจะอัปเดตตัวอย่างของฉันเพื่อที่จะใช้ไฟล์ pem ในปัจจุบันบนเว็บไซต์ curl
elitechief21

4
นอกจากนี้ยังมีฟังก์ชั่นstream_context_set_defaultที่มีประโยชน์ซึ่งสามารถใช้งานได้ดังนั้นคุณไม่จำเป็นต้องส่งมันเข้าไปใน file_get_contents ทุกครั้ง
Ken Koch

ใครเคยได้รับสิ่งนี้ให้ทำงาน ฉันลองด้วยชุด cacert.pem ที่เชื่อมโยงกับคำตอบนี้และยังมีใบรับรอง Root Comodo CA (ซึ่งเป็นรูต CA สำหรับใบรับรองที่ฉันต้องการตรวจสอบ) แต่จะล้มเหลวเสมอ
zmippie

1
จากมุมมองด้านความปลอดภัย: ถัดจากการใช้ตัวเลือกบริบท cafile stream อาจเป็นเรื่องสำคัญอย่างยิ่งที่จะต้องกำหนด ciphers ที่อนุญาตในตัวเลือกบริบท ciphers stream และห้ามรุ่น SSL ที่รู้จักกันว่ามีช่องโหว่ นอกจากนี้ยังแนะนำให้ตั้งค่าตัวเลือกบริบทของกระแสข้อมูลให้ปิดการใช้งานการบีบอัดเป็นจริงเพื่อลดการโจมตีแบบ CRIME
Josef Glatz

36

ฉันแก้ไขสิ่งนี้โดยทำให้แน่ใจว่าติดตั้ง OpenSSL บนเครื่องของฉันแล้วเพิ่มลงใน php.ini ของฉัน:

openssl.cafile=/usr/local/etc/openssl/cert.pem

@Akhi คุณควรจะพบบทเรียนบางอย่างถ้าคุณเป็น Google
andlin

2
ฉันใช้วิธีการเดียวกันโดยใช้ PHP 7 บน IIS ดาวน์โหลดcert.pemไฟล์และตั้งค่าphp.iniเช่นนี้และใช้งานได้:openssl.cafile=D:\Tools\GnuWin32\bin\cacert.pem
David Refoua

1
ฉันดาวน์โหลดไฟล์ PEM จากcurl.haxx.se/docs/caextract.html - แก้ไขปัญหาให้ฉันบน Windows ด้วย URL gstatic.com เฉพาะ
Jake

การดาวน์โหลดไฟล์ PEM จากcurl.haxx.se/docs/caextract.htmlไม่ทำงานสำหรับฉันใน Centos 7 ฉันสร้างใบรับรองบันเดิลโดยเชื่อมใบรับรองหลักและ pkcs7 แล้วเชื่อมโยงกับเซิร์ฟเวอร์แล้วระบุพา ธ openssl.cafile +1 สำหรับคำตอบและทิศทางที่ถูกต้อง
Arvind K.

เมื่อสร้างชุดข้อมูลอย่าลืมแปลงไฟล์ pkcs เป็นไฟล์ pem ก่อนที่จะต่อกับใบรับรองหลัก
Arvind K.

22

คุณสามารถแก้ไขปัญหานี้ได้โดยการเขียนฟังก์ชั่นที่กำหนดเองที่ใช้ curl ดังที่:

function file_get_contents_curl( $url ) {

  $ch = curl_init();

  curl_setopt( $ch, CURLOPT_AUTOREFERER, TRUE );
  curl_setopt( $ch, CURLOPT_HEADER, 0 );
  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
  curl_setopt( $ch, CURLOPT_URL, $url );
  curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, TRUE );

  $data = curl_exec( $ch );
  curl_close( $ch );

  return $data;

}

จากนั้นใช้file_get_contents_curlแทนfile_get_contentsทุกครั้งที่คุณเรียก url ที่ขึ้นต้นด้วย https


สิ่งนี้ใช้ได้สำหรับฉัน เยี่ยมมากและขอขอบคุณ!
นิคกรีน

11

ทำงานให้ฉันฉันใช้ PHP 5.6 ควรเปิดใช้งานส่วนขยาย openssl และในขณะที่เรียก google map api Verify_peer ให้ทำผิดโค้ดด้านล่างใช้ได้สำหรับฉัน

<?php
$arrContextOptions=array(
    "ssl"=>array(
         "verify_peer"=>false,
         "verify_peer_name"=>false,
    ),
);  
$url = "https://maps.googleapis.com/maps/api/geocode/json?latlng="
      . $latitude
      . ","
      . $longitude
      . "&sensor=false&key="
      . Yii::$app->params['GOOGLE_API_KEY'];

$data = file_get_contents($url, false, stream_context_create($arrContextOptions));

echo $data;
?>

10

หากเวอร์ชัน PHP ของคุณคือ 5 ให้ลองติดตั้ง cURL โดยพิมพ์คำสั่งต่อไปนี้ในเทอร์มินัล:

sudo apt-get install php5-curl

9
สิ่งนี้ไม่เกี่ยวข้องกับอะไรcURLเลย
Andreas

2
การติดตั้ง php curl ควรเป็นคำตอบที่ถูกต้อง! สำหรับระบบ Mac ของฉันฉันใช้พอร์ตและคำสั่งคือ:sudo port install php70-curl
hailong

8

คุณโดยทั่วไปมีการตั้งค่า SSL_CERT_FILE ตัวแปรสภาพแวดล้อมเพื่อเส้นทางของแฟ้ม PEM ของ SSL ใบรับรองดาวน์โหลดได้จากลิงค์ต่อไปนี้: http://curl.haxx.se/ca/cacert.pem

ฉันใช้เวลามากมายในการคิดออก


ลิงก์ไม่ทำงาน แต่ฉันพบสิ่งนี้ที่คล้ายกัน: akrabat.com/ssl-certificate-verification-on-php-5-6
Daniel P

6

ทำตามขั้นตอนด้านล่างจะแก้ไขปัญหานี้

  1. ดาวน์โหลดใบรับรอง CA จากลิงค์นี้: https://curl.haxx.se/ca/cacert.pem
  2. ค้นหาและเปิด php.ini
  3. ค้นหาcurl.cainfoและวางพา ธ สัมบูรณ์ที่คุณดาวน์โหลดใบรับรองcurl.cainfo ="C:\wamp\htdocs\cert\cacert.pem"
  4. รีสตาร์ท WAMP / XAMPP (เซิร์ฟเวอร์ apache)
  5. มันได้ผล!

หวังว่าจะช่วย !!


ปลอดภัยไหม ฉันรักการแก้ปัญหาที่ง่าย แต่ im ขาดข้อมูลบางอย่างที่นี่ ..
swisswiss

สำหรับการทดสอบก็โอเค
Geomorillo

5

แค่อยากจะเพิ่มสิ่งนี้เนื่องจากฉันพบปัญหาเดียวกันและไม่มีอะไรที่ฉันสามารถหาได้ทุกที่ (เช่นการดาวน์โหลดไฟล์ cacert.pem การตั้งค่า cafile ใน php.ini เป็นต้น)

หากคุณใช้ NGINX และใบรับรอง SSL ของคุณมาพร้อมกับ "ใบรับรองระดับกลาง" คุณต้องรวมไฟล์ใบรับรองระดับกลางกับไฟล์ "mydomain.com.crt" หลักของคุณและควรใช้งานได้ Apache มีการตั้งค่าเฉพาะสำหรับ certs ระดับกลาง แต่ NGINX ไม่รองรับจึงต้องอยู่ในไฟล์เดียวกับใบรับรองปกติของคุณ


4

สาเหตุของข้อผิดพลาดนี้คือ PHP ไม่มีรายชื่อผู้ออกใบรับรองที่เชื่อถือได้

PHP 5.6 และใหม่กว่าพยายามโหลด CA ที่ระบบเชื่อถือโดยอัตโนมัติ ปัญหาที่สามารถแก้ไขได้ ดูhttp://php.net/manual/en/migration56.openssl.phpสำหรับข้อมูลเพิ่มเติม

PHP 5.5 และก่อนหน้านี้มีจริงๆยากที่จะติดตั้งอย่างถูกต้องตั้งแต่คุณด้วยตนเองต้องระบุกำ CA ในบริบทแต่ละคำขอสิ่งที่คุณทำไม่ได้ต้องการที่จะโรยรอบรหัสของคุณ ดังนั้นฉันจึงตัดสินใจใช้โค้ดสำหรับรุ่น PHP <5.6 การตรวจสอบ SSL จะถูกปิดใช้งาน:

$req = new HTTP_Request2($url);
if (version_compare(PHP_VERSION, '5.6.0', '<')) {
    //correct ssl validation on php 5.5 is a pain, so disable
    $req->setConfig('ssl_verify_host', false);
    $req->setConfig('ssl_verify_peer', false);
}

สิ่งนี้ช่วยให้ฉันพบปัญหาของฉัน แม้ว่าฉันจะใช้ PHP 5.6 ฉันใช้ไลบรารีไคลเอนต์ api ที่ล้าสมัยซึ่งระบุไฟล์ CA เก่าด้วยตนเองโดยใช้ตัวเลือกบริบท cafile ตามลิงก์ของคุณด้านบน การลบสิ่งนั้นออกจากไลบรารีไคลเอ็นต์ api แก้ไขให้ฉัน PHP เริ่มสันนิษฐานว่าใช้ OpenSSLs กลุ่มที่เชื่อถือได้
Joe Lipson

4

มีข้อผิดพลาดเดียวกันกับ PHP 7 ใน XAMPP และ OSX

คำตอบดังกล่าวข้างต้นในhttps://stackoverflow.com/เป็นสิ่งที่ดี แต่ก็ไม่ได้แก้ปัญหาให้ฉันได้อย่างสมบูรณ์ ฉันต้องจัดเตรียมห่วงโซ่ใบรับรองที่สมบูรณ์เพื่อให้ file_get_contents () ทำงานอีกครั้ง นั่นเป็นวิธีที่ฉันทำ:

รับใบรับรอง root / ระดับกลาง

ก่อนอื่นฉันต้องหาว่ารูทและใบรับรองกลางคืออะไร

วิธีที่สะดวกที่สุดคือบางทีเครื่องมือรับรองออนไลน์เช่นssl-shopper

ฉันพบใบรับรองสามใบรับรองใบรับรองเซิร์ฟเวอร์หนึ่งใบรับรองและใบรับรองลูกโซ่สองใบ (ใบรับรองฉบับแรกคือใบรับรองรูทใบรับรองใบรับรองอีกใบหนึ่งฉบับกลาง)

สิ่งที่ฉันต้องทำก็แค่ค้นหาอินเทอร์เน็ตเพื่อหาทั้งคู่ ในกรณีของฉันนี่คือราก:

thawte DV SSL SHA256 CA

และจะนำไปสู่เขา URL thawte.com ดังนั้นฉันแค่ใส่หนังสือรับรองนี้เป็น textfile และทำเช่นเดียวกันสำหรับสื่อกลาง เสร็จสิ้น

รับใบรับรองโฮสต์

สิ่งต่อไปที่ฉันต้องทำคือดาวน์โหลดใบรับรองเซิร์ฟเวอร์ของฉัน บน Linux หรือ OS X สามารถทำได้ด้วย openssl:

openssl s_client -showcerts -connect whatsyoururl.de:443 </dev/null 2>/dev/null|openssl x509 -outform PEM > /tmp/whatsyoururl.de.cert

ตอนนี้นำพวกเขาทั้งหมดเข้าด้วยกัน

ตอนนี้เพียงรวมพวกเขาทั้งหมดเป็นไฟล์เดียว (อาจเป็นการดีที่จะใส่ไว้ในโฟลเดอร์เดียวฉันเพิ่งรวมมันเป็นไฟล์เดียว) คุณสามารถทำได้เช่นนี้:

cat /tmp/thawteRoot.crt > /tmp/chain.crt
cat /tmp/thawteIntermediate.crt >> /tmp/chain.crt
cat /tmp/tmp/whatsyoururl.de.cert >> /tmp/chain.crt

บอก PHP ว่าจะหาโซ่ได้ที่ไหน

มีฟังก์ชั่นที่มีประโยชน์นี้ openssl_get_cert_locations () ที่จะบอกคุณที่ PHP กำลังมองหาไฟล์ใบรับรอง และมีพารามิเตอร์นี้ที่จะบอก file_get_contents () ว่าจะหาไฟล์ใบรับรองที่ไหน บางทีทั้งสองวิธีจะได้ผล ฉันชอบวิธีพารามิเตอร์ (เปรียบเทียบกับวิธีแก้ปัญหาที่กล่าวถึงข้างต้น)

ดังนั้นนี่คือ PHP-Code ของฉันตอนนี้

$arrContextOptions=array(
    "ssl"=>array(
        "cafile" => "/Applications/XAMPP/xamppfiles/share/openssl/certs/chain.pem",
        "verify_peer"=> true,
        "verify_peer_name"=> true,
    ),
);

$response = file_get_contents($myHttpsURL, 0, stream_context_create($arrContextOptions));

นั่นคือทั้งหมดที่ file_get_contents () ทำงานอีกครั้ง ไม่มี CURL และหวังว่าจะไม่มีข้อบกพร่องด้านความปลอดภัย


ไฟล์chain.pemคืออะไร? นี่คือchain.crtอะไร
Dr.X

มันไม่ใช่ chain.crt สำหรับใบรับรองจริง นี่คือรายการถ้าใบรับรองระดับกลางหรือที่รู้จักในเครือใบรับรอง คุณไม่จำเป็นต้องใช้มัน ใช้ตัวตรวจสอบใบรับรอง SSL เพื่อดูว่าคุณต้องการหรือไม่ หากเป็นเช่นนั้นคุณอาจค้นหาชื่อผู้ออกใบรับรองของคุณ + คำว่า "chain" หรือ "ตัวกลาง" เพื่อค้นหาไฟล์ที่ถูกต้อง
nr

4

หลังจากตกเป็นเหยื่อของปัญหานี้บน CentOS หลังจากอัปเดต php เป็น php5.6 ฉันพบวิธีแก้ปัญหาที่เหมาะกับฉัน

รับไดเรกทอรีที่ถูกต้องสำหรับ certs ของคุณที่จะวางโดยค่าเริ่มต้นด้วยสิ่งนี้

php -r 'print_r(openssl_get_cert_locations()["default_cert_file"]);'

จากนั้นใช้สิ่งนี้เพื่อรับใบรับรองและวางไว้ในตำแหน่งเริ่มต้นที่พบจากรหัสด้านบน

wget http://curl.haxx.se/ca/cacert.pem -O <default location>

3

มีปัญหา ssl เดียวกันบนเครื่องของนักพัฒนาซอฟต์แวร์ของฉัน (php 7, xampp บน windows) ที่มีใบรับรองที่ลงชื่อด้วยตนเองพยายามที่จะเปิดไฟล์ " https: // localhost / ... " - เห็นได้ชัดว่า root-certificate-assembly (cacert.pem) ไม่ทำงาน ฉันเพิ่งคัดลอกรหัสจาก apache server.crt-File ด้วยตนเองใน cacert.pem ที่ดาวน์โหลดและทำรายการ openssl.cafile = path / to / cacert.pem ใน php.ini


2

สิ่งที่ต้องลองก็คือการติดตั้งใหม่ca-certificatesตามรายละเอียดที่นี่

# yum reinstall ca-certificates
...
# update-ca-trust force-enable 
# update-ca-trust extract

และอีกสิ่งที่ควรลองคืออนุญาตใบรับรองอย่างชัดเจนของไซต์หนึ่งตามที่อธิบายไว้ที่นี่ (โดยเฉพาะถ้าไซต์หนึ่งเป็นเซิร์ฟเวอร์ของคุณเองและคุณมี. pem ที่เข้าถึงแล้ว)

# cp /your/site.pem /etc/pki/ca-trust/source/anchors/
# update-ca-trust extract

ฉันพบข้อผิดพลาด SO ที่แน่นอนนี้หลังจากอัปเกรดเป็น PHP 5.6 บน CentOS 6 พยายามเข้าถึงเซิร์ฟเวอร์ซึ่งมีใบรับรอง cheapsslsecurity ซึ่งอาจจำเป็นต้องได้รับการอัปเดต แต่ฉันติดตั้งใบรับรองencryptและด้วยสองขั้นตอนข้างต้น เคล็ดลับ. ฉันไม่รู้ว่าทำไมขั้นตอนที่สองจึงจำเป็น


คำสั่งที่มีประโยชน์

ดูรุ่น openssl:

# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013

ดูการตั้งค่าปัจจุบัน PHP cli ssl:

# php -i | grep ssl
openssl
Openssl default config => /etc/pki/tls/openssl.cnf
openssl.cafile => no value => no value
openssl.capath => no value => no value

1

เกี่ยวกับข้อผิดพลาดคล้ายกับ

[11-May-2017 19:19:13 อเมริกา / ชิคาโก] คำเตือน PHP: file_get_contents (): การดำเนินการ SSL ล้มเหลวด้วยรหัส 1 OpenSSL ข้อความแสดงข้อผิดพลาด: ข้อผิดพลาด: 14090086: รูทีน SSL: ssl3_get_server_certificate: การตรวจสอบใบรับรองล้มเหลว

คุณตรวจสอบสิทธิ์ของใบรับรองและไดเรกทอรีที่อ้างอิงโดย openssl หรือไม่

คุณสามารถทำได้

var_dump(openssl_get_cert_locations());

เพื่อให้ได้สิ่งที่คล้ายกันนี้

array(8) {
  ["default_cert_file"]=>
  string(21) "/usr/lib/ssl/cert.pem"
  ["default_cert_file_env"]=>
  string(13) "SSL_CERT_FILE"
  ["default_cert_dir"]=>
  string(18) "/usr/lib/ssl/certs"
  ["default_cert_dir_env"]=>
  string(12) "SSL_CERT_DIR"
  ["default_private_dir"]=>
  string(20) "/usr/lib/ssl/private"
  ["default_default_cert_area"]=>
  string(12) "/usr/lib/ssl"
  ["ini_cafile"]=>
  string(0) ""
  ["ini_capath"]=>
  string(0) ""
}

ปัญหานี้ทำให้ฉันผิดหวังสักพักจนกระทั่งฉันรู้ว่าโฟลเดอร์ "certs" ของฉันมีสิทธิ์ 700 ครั้งเมื่อควรมีสิทธิ์ 755 โปรดจำไว้ว่านี่ไม่ใช่โฟลเดอร์สำหรับกุญแจ แต่เป็นใบรับรอง ฉันขอแนะนำให้อ่านลิงค์นี้ในสิทธิ์ SSL

เมื่อฉันทำ

chmod 755 certs

ปัญหาได้รับการแก้ไขแล้วอย่างน้อยก็สำหรับฉันแล้ว


เย้! CHMOD ก็เป็นปัญหาของฉันเช่นกัน ;-) ขอบคุณ
RA

0

ผมมีปัญหาเดียวกันสำหรับหน้าเว็บที่เชื่อถือได้อีกเมื่อใช้หรือwget file_get_contentsการวิจัยจำนวนมาก (รวมถึงการตอบสนองต่อคำถามนี้) ทำให้เกิดวิธีง่ายๆ - การติดตั้ง Curl และ PHP-Curl - หากฉันเข้าใจถูกต้อง Curl มี Root CA สำหรับ Comodo ซึ่งแก้ไขปัญหาได้

ติดตั้งโปรแกรมเสริม Curl และ PHP-Curl จากนั้นเริ่ม Apache ใหม่

sudo apt-get install curl
sudo apt-get install php-curl
sudo /etc/init.d/apache2 reload

ทั้งหมดตอนนี้ทำงาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.