HTTPS และ SSL3_GET_SERVER_CERTIFICATE: การตรวจสอบใบรับรองล้มเหลว CA ก็โอเค


208

ฉันใช้XAMPPเพื่อการพัฒนา เมื่อเร็ว ๆ นี้ฉันอัปเกรดการติดตั้ง xampp จากรุ่นเก่าเป็น 1.7.3

ตอนนี้เมื่อฉันขดไซต์ที่เปิดใช้งาน HTTPS ฉันได้รับข้อยกเว้นต่อไปนี้

ข้อผิดพลาดร้ายแรง: ข้อยกเว้นที่ไม่ได้ตรวจสอบ 'RequestCore_Exception' พร้อมข้อความ 'ทรัพยากร cURL: id ทรัพยากร # 55; ข้อผิดพลาด cURL: ปัญหาใบรับรอง SSL ตรวจสอบว่าใบรับรอง CA นั้นตกลง รายละเอียด: ข้อผิดพลาด: 14090086: รูทีน SSL: SSL3_GET_SERVER_CERTIFICATE: การตรวจสอบใบรับรองล้มเหลว (60) '

ทุกคนแนะนำให้ใช้ตัวเลือก curl เฉพาะจากรหัส PHP เพื่อแก้ไขปัญหานี้ ฉันคิดว่านี่ไม่ควรเป็นอย่างนั้น เนื่องจากฉันไม่มีปัญหากับ XAMPP เวอร์ชันเก่าและเกิดขึ้นหลังจากติดตั้งเวอร์ชันใหม่เท่านั้น

ฉันต้องการความช่วยเหลือในการพิจารณาว่าการเปลี่ยนแปลงการตั้งค่าในการติดตั้ง PHP ของฉัน Apache ฯลฯ สามารถแก้ไขปัญหานี้ได้อย่างไร

คำตอบ:


145

curl ใช้เพื่อรวมรายการของ CA ที่ยอมรับ แต่ไม่รวมบันเดิล ANY CA อีกต่อไป ดังนั้นโดยค่าเริ่มต้นมันจะปฏิเสธใบรับรอง SSL ทั้งหมดว่าไม่สามารถตรวจสอบได้

คุณจะต้องได้ใบรับรองของ CA และชี้ไปที่มัน รายละเอียดเพิ่มเติมที่รายละเอียดของ cURLS เกี่ยวกับใบรับรอง SSL ของเซิร์ฟเวอร์รายละเอียดเกี่ยวกับใบรับรอง


4
ขดที่เกิดขึ้นใน Amazon PHP บริการเว็บห้องสมุด ฉันไม่เข้าใจวิธีแก้ไขโดยไม่ต้องแก้ไขรหัสห้องสมุด
Josnidhin

41
จากนั้นปิดการตรวจสอบใบรับรอง ( CURLOPT_SSL_VERIFYPEER-> false) คุณเพิ่มใบรับรอง CA ของไซต์ที่คุณพยายามทำ SSL ด้วยหรือปิดใช้งานการยืนยัน CA มีเพียงสองตัวเลือกเท่านั้น
Marc B

78
เพียงแค่ fyi - ตั้งค่าCURLOPT_SSL_VERIFYPEERเพื่อfalseเอาชนะวัตถุประสงค์ของการใช้ SSL
จนถึง

13
@ จะไม่เอาชนะวัตถุประสงค์ของ SSL ได้ครึ่งหนึ่งใช่ไหม คุณยังคงได้รับความเป็นส่วนตัวระหว่างคุณและเพื่อนของคุณ: คุณไม่มีความเป็นเพื่อนแท้
Mark Fox

10
โดยไม่มีความถูกต้องจุดในการเข้ารหัสข้อมูลที่คุณส่งคืออะไร หากคุณได้รับ MITMed แล้วข้อมูลจะถูกทำลายต่อไป
hdgarrood

290

มันเป็นปัญหาที่พบได้บ่อยใน Windows คุณจำเป็นเพียงเพื่อให้ชุดที่จะcacert.pemcurl.cainfo

ตั้งแต่ PHP 5.3.7 คุณสามารถทำได้:

  1. ดาวน์โหลดhttps://curl.haxx.se/ca/cacert.pemและบันทึกไว้ที่ใดที่หนึ่ง
  2. อัปเดตphp.ini- เพิ่ม curl.cainfo = "PATH_TO / cacert.pem"

มิฉะนั้นคุณจะต้องทำสิ่งต่อไปนี้สำหรับทุก ๆ ทรัพยากร cURL:

curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");

2
สิ่งนี้ใช้ได้กับฉันใน XAMPP บน OS X มันแก้ไขปัญหาที่ปลั๊กอิน Wordpress จะไม่อัปเดตเนื่องจากไม่สามารถหาใบรับรองท้องถิ่นได้
Jonathan Nicol

8
สำหรับคนอื่นที่พยายามแก้ปัญหานี้บน Windows โดยใช้ Apache ฉันต้องกำหนดเส้นทางแบบเต็ม (เช่น C: \ PATH_TO \ cacert.pem) ในรหัส PHP ของฉัน บน IIS เส้นทางสัมพัทธ์ดูเหมือนว่าจะใช้ได้
http203

หาก cacert.pem อยู่ในไดเรกทอรีเดียวกันดังนั้น curl_setopt ($ ch, CURLOPT_CAINFO, dirname ( FILE ) '/cacert.pem'); จะทำงาน
mujaffars

7
เมื่อใช้ WampServer ด้วย2.คุณต้องเพิ่มตัวแปรลงในสองphp.iniไฟล์แยกกัน ดูstackoverflow.com/a/25706713/1101095
Nate

สิ่งที่ทำให้งง / แดกดันคือคุณสามารถดาวน์โหลดcurl.haxx.se/ca/cacert.pemผ่าน HTTPS โดยไม่ต้องระบุตัวเลือกเพิ่มเติมใด ๆ ใบรับรองสำหรับ curl.haxx.se สำรองไว้ใน curl หรือไม่
qbolec

84

คำเตือน: สิ่งนี้สามารถแนะนำปัญหาด้านความปลอดภัยที่ SSL ได้รับการออกแบบมาเพื่อป้องกันการแสดงรหัสฐานที่ไม่ปลอดภัยทั้งหมดของคุณ มันขัดกับการปฏิบัติที่แนะนำทุกประการ

แต่การแก้ไขง่ายๆที่ใช้งานได้สำหรับฉันก็คือการโทร:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

ก่อนโทร:

curl_exec():

ในไฟล์ php

ฉันเชื่อว่านี่เป็นการปิดการใช้งานการตรวจสอบใบรับรอง SSL ทั้งหมด


65
... และด้วยการปิดการใช้งานการตรวจสอบใบรับรองคุณจะเปิดประตูสู่การโจมตี MITM ที่อาจเกิดขึ้นซึ่ง SSL / TLS นั้นมีเป้าหมายเพื่อป้องกัน อย่าทำอย่างนี้!
Bruno

12
ได้. ฉันควรจะให้ความสำคัญกับเรื่องนี้มากขึ้นในคำตอบ ทำสิ่งนี้เฉพาะเมื่อคุณไม่ได้ทำงานอะไรที่สำคัญ ฉันใช้บน localhost เพื่อเข้าถึงเว็บไซต์ที่ฉันตั้งโปรแกรมไว้เป็นการส่วนตัว
Chris Dutrow

3
ลงคะแนนจากฉัน นี่เป็นการแก้ไขที่สกปรกเพื่อให้โค้ดทำงานได้ แต่ไม่ใช่วิธีแก้ปัญหา ตอบโดยАртурКурицынนั้นดีกว่ามาก
Ilija

2
@Bruno นี่เป็นโซลูชั่นที่สมบูรณ์แบบสำหรับสคริปต์ผู้ช่วยการทดสอบแอปพลิเคชันที่เชื่อถือได้อินทราเน็ต ..... ทุกคนที่รู้ A LITTLE เกี่ยวกับ SSL รู้ว่าในกรณีใดการตรวจสอบความถูกต้องของใบรับรองสามารถข้ามได้ ดังนั้นความคิดเห็น 'ฉลาด' ทั้งหมดในคำตอบนี้และสิ่งต่าง ๆ เช่น 'ไม่ทำเช่นนี้' จึงเป็นเพียงการไม่ยอมรับ !!
Kenyakorn Ketsombut

5
... " ทุกคนที่รู้เรื่องเล็ก ๆ น้อย ๆเกี่ยวกับ SSL [... ] " ... และคุณจะประหลาดใจที่มีคนจำนวนไม่น้อยที่รู้เรื่องพื้นฐานของ SSL / TLS เล็กน้อยและกำลังจะมาถึง ที่นี่เพื่อคัดลอก / วางการแก้ไขด่วนสำหรับข้อความแสดงข้อผิดพลาด
Bruno

53

ที่มา: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

Curl: ปัญหาใบรับรอง SSL ตรวจสอบว่าใบรับรอง CA นั้นตกลง

7 เมษายน 2549

เมื่อเปิด URL ที่ปลอดภัยด้วย Curl คุณอาจได้รับข้อผิดพลาดดังต่อไปนี้:

ปัญหาใบรับรอง SSL ตรวจสอบว่าใบรับรอง CA นั้นตกลง

ฉันจะอธิบายว่าทำไมข้อผิดพลาดและสิ่งที่คุณควรทำเกี่ยวกับมัน

วิธีที่ง่ายที่สุดในการกำจัดข้อผิดพลาดคือการเพิ่มสองบรรทัดต่อไปนี้ในสคริปต์ของคุณ วิธีการนี้ทำให้เกิดความเสี่ยงด้านความปลอดภัย

//WARNING: this would prevent curl from detecting a 'man in the middle' attack
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 

ลองดูว่าพารามิเตอร์สองตัวนี้ทำอะไร การอ้างอิงคู่มือ

CURLOPT_SSL_VERIFYHOST : 1 เพื่อตรวจสอบการมีอยู่ของชื่อทั่วไปในใบรับรองเพียร์ SSL 2 เพื่อตรวจสอบการมีอยู่ของชื่อสามัญและตรวจสอบว่าตรงกับชื่อโฮสต์ที่ให้ไว้

CURLOPT_SSL_VERIFYPEER : FALSE เพื่อหยุด CURL จากการตรวจสอบใบรับรองของเพื่อน สามารถระบุใบรับรองสำรองเพื่อตรวจสอบกับด้วยตัวเลือก CURLOPT_CAINFO หรือสามารถระบุไดเรกทอรีใบรับรองด้วยตัวเลือก CURLOPT_CAPATH CURLOPT_SSL_VERIFYHOST อาจต้องเป็น TRUE หรือ FALSE หาก CURLOPT_SSL_VERIFYPEER ถูกปิดใช้งาน (ค่าเริ่มต้นคือ 2) การตั้งค่า CURLOPT_SSL_VERIFYHOST เป็น 2 (นี่คือค่าเริ่มต้น) จะรับประกันว่าใบรับรองที่นำเสนอให้คุณมี 'ชื่อสามัญ' ที่ตรงกับ URN ที่คุณใช้ในการเข้าถึงทรัพยากรระยะไกล นี่เป็นการตรวจสุขภาพ แต่ไม่รับประกันว่าโปรแกรมของคุณจะไม่ได้รับการถอดรหัส

ป้อน 'คนที่อยู่ตรงกลาง'

โปรแกรมของคุณอาจทำให้เข้าใจผิดในการพูดคุยกับเซิร์ฟเวอร์อื่นแทน สิ่งนี้สามารถทำได้ผ่านกลไกต่าง ๆ เช่น dns หรือ arp พิษ (นี่คือเรื่องราวของอีกวัน) ผู้บุกรุกสามารถลงนามในใบรับรองด้วยตัวเองด้วยชื่อ 'comon' ที่โปรแกรมของคุณคาดหวัง การสื่อสารจะยังคงถูกเข้ารหัส แต่คุณจะมอบความลับให้ผู้หลอกลวง การโจมตีแบบนี้เรียกว่า 'คนที่อยู่ตรงกลาง'

เอาชนะ 'คนที่อยู่ตรงกลาง'

เราต้องยืนยันว่าใบรับรองที่นำเสนอนั้นดีสำหรับของจริง เราทำสิ่งนี้โดยเปรียบเทียบกับใบรับรองที่เราเชื่อถือ * ที่เชื่อถือได้

หากทรัพยากรระยะไกลได้รับการคุ้มครองโดยใบรับรองที่ออกโดยหนึ่งใน CA หลักเช่น Verisign, GeoTrust และคณะคุณสามารถเปรียบเทียบกับชุดใบรับรอง CA ของ Mozilla ได้อย่างปลอดภัยซึ่งคุณสามารถรับได้จาก http://curl.haxx.se/docs/caextract .html

บันทึกไฟล์cacert.pemไว้ในเซิร์ฟเวอร์ของคุณและตั้งค่าตัวเลือกต่อไปนี้ในสคริปต์ของคุณ

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE); 
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");

สำหรับเครดิตข้อมูลข้างต้นทั้งหมดไปที่: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html


38
โดยทั่วไปถือว่าสุภาพที่จะให้เครดิตแหล่งข้อมูลของคุณและอ้างเฉพาะบางส่วนที่เกี่ยวข้องกับคำถามแทนที่จะคัดลอกและวางไว้ที่นี่!
Dan Herd

1
ขออภัยฉันไม่ได้ไปใช่ฉันชื่นชอบ Dan สำหรับสิ่งนั้นและอัปเดตโพสต์
Deepak Oberoi

6
อย่างน้อย Deepak ก็พยายามค้นคว้า @danherd ดังนั้นคุณต้องการทำวิจัยเพื่อค้นหาว่าเขาเอารหัสมาจากไหน? รหัสแหล่งที่มาของรหัสนี้คืออะไร แทนที่จะเสียเวลาในการหาข้อผิดพลาดของคนอื่นพยายามช่วยเหลือคนอื่นด้วยตัวเอง อย่าต่อสู้แบ่งปัน!
GTodorov

17

โซลูชันด้านบนนั้นยอดเยี่ยม แต่ถ้าคุณใช้ WampServer คุณอาจพบว่าการตั้งค่าcurl.cainfoตัวแปรphp.iniไม่ทำงาน

ในที่สุดฉันก็พบว่า WampServer มีสองphp.iniไฟล์:

C:\wamp\bin\apache\Apachex.x.x\bin
C:\wamp\bin\php\phpx.x.xx

ครั้งแรกที่เห็นได้ชัดว่าใช้สำหรับเมื่อไฟล์ PHP shell_exec()จะเรียกผ่านทางเว็บเบราว์เซอร์ในขณะที่สองจะใช้เมื่อมีคำสั่งถูกเรียกใช้ผ่านบรรทัดคำสั่งหรือ

TL; DR

หากใช้ WampServer คุณต้องเพิ่มcurl.cainfoบรรทัดลงในไฟล์ทั้งสอง php.ini


6

สำหรับความรักของทุกสิ่งที่ศักดิ์สิทธิ์ ...

ในกรณีของฉันฉันต้องตั้งค่าopenssl.cafileตัวแปร PHP เป็นพา ธ ไฟล์ PEM

ฉันเชื่อว่ามันเป็นความจริงที่ว่ามีหลายระบบที่การตั้งค่าcurl.cainfoใน PHP's config เป็นสิ่งที่จำเป็น แต่ในสภาพแวดล้อมที่ฉันทำงานด้วยซึ่งเป็นคอนเทนเนอร์ eboraas / laravel dockerซึ่งใช้ Debian 8 (jessie) และ PHP 5.6 การตั้งค่าตัวแปรที่ไม่ได้ทำเคล็ดลับ

ผมสังเกตเห็นว่าการส่งออกของphp -iไม่ได้พูดถึงอะไรเกี่ยวกับการตั้งค่าการตั้งค่าเฉพาะที่ opensslแต่มันก็มีไม่กี่บรรทัดเกี่ยวกับ มีทั้งตัวเลือกopenssl.capathและopenssl.cafileตัวเลือก แต่เพียงแค่ตั้งค่าตัวที่สองที่อนุญาตให้ขดผ่าน PHP จนในที่สุดก็โอเคกับ HTTPS URL


ขอบคุณ! การตั้งค่า curl.cainfo ไม่ทำงานสำหรับฉันเช่นกัน แต่การตั้งค่า openssl.cafile ทำได้! ฉันใช้ Windows 7 พร้อม XAMPP และ PHP 7.1.1
knezmilos

@knezmilos คุณตั้งค่า openssl.cafile ได้อย่างไร? คุณดาวน์โหลดมาจากที่ไหนและคุณเปิดใช้งานอย่างไร
Krys

แต่ฉันคิดว่ามันเป็นแบบนี้: curl.cainfo = "C: \ xampp \ cacert \ cacert.pem" และ openssl.cafile = "C: \ xampp \ cacert \ cacert.pem" ใน php ในขณะที่ฉันคิดว่าฉันได้รับไฟล์ pem จากหนึ่งในคำตอบที่นี่
knezmilos

1
"สำหรับความรักของทุกสิ่งที่ศักดิ์สิทธิ์ ... " แน่นอน สิ่งนี้ใช้ได้กับการติดตั้ง Ubuntu 18.08 / Apache / Php7.2 ของฉัน หากข้อผิดพลาดของ curl ชี้ไปที่ไฟล์ที่ถูกต้องแสดงว่าเป็นความผิดพลาดอย่างแน่นอน
JTG

4

บางครั้งหากแอปพลิเคชันที่คุณพยายามติดต่อมีใบรับรองที่ลงชื่อด้วยตนเอง cacert.pem ปกติจากhttp://curl.haxx.se/ca/cacert.pemไม่สามารถแก้ปัญหาได้

หากคุณแน่ใจเกี่ยวกับ URL ปลายทางของบริการให้กดผ่านเบราว์เซอร์บันทึกใบรับรองด้วยตนเองในรูปแบบ "ใบรับรอง X 509 พร้อมลูกโซ่ (PEM)" ชี้ไฟล์ใบรับรองนี้ด้วย

curl_setopt ($ch, CURLOPT_CAINFO, "pathto/{downloaded certificate chain file}");   

4

ฉันมีข้อผิดพลาดเดียวกันกับ amazon AMI linux

ฉันแก้ไขโดยการตั้งค่าcurl.cainfoบน/etc/php.d/curl.ini

https://gist.github.com/reinaldomendes/97fb2ce8a606ec813c4b

เพิ่มตุลาคม 2018

ใน Amazon Linux v1 ให้แก้ไขไฟล์นี้

vi /etc/php.d/20-curl.ini

เพื่อเพิ่มบรรทัดนี้

curl.cainfo="/etc/ssl/certs/ca-bundle.crt"

สมบูรณ์แบบขอบคุณ! ฉันอัปเดตคำถามเพื่อเพิ่มสิ่งที่ฉันทำอย่างนั้นเพื่อแก้ไขปัญหาให้ฉันแทนที่จะสร้างคำตอบอื่น
ทิม

3

เมื่อตั้งค่าตัวเลือก curl สำหรับ CURLOPT_CAINFO โปรดอย่าลืมใช้อัญประกาศเดี่ยวการใช้เครื่องหมายคำพูดคู่จะทำให้เกิดข้อผิดพลาดอื่นเท่านั้น ดังนั้นตัวเลือกของคุณควรมีลักษณะดังนี้:

curl_setopt ($ch, CURLOPT_CAINFO, 'c:\wamp\www\mywebfolder\cacert.pem');

นอกจากนี้ในการตั้งค่าไฟล์ php.ini ของคุณควรเขียนเป็น: (สังเกตคำพูดของฉัน)

curl.cainfo = "C:\wamp\www\mywebfolder"

ฉันวางไว้ใต้บรรทัดที่ระบุสิ่งนี้: extension=php_curl.dll

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


1
ฉันหวังว่า php.ini ควรชี้ไปที่ไฟล์ pem แทนที่จะเป็นโฟลเดอร์หลัก
dejjub-AIS

2

ฉันสิ้นสุดที่นี่เมื่อพยายามรับ GuzzleHttp (php + apache บน Mac) เพื่อรับหน้าจาก www.googleapis.com

นี่คือทางออกสุดท้ายของฉันในกรณีที่ช่วยใครก็ได้

ดูที่ห่วงโซ่ใบรับรองสำหรับโดเมนที่ให้ข้อผิดพลาดนี้กับคุณ สำหรับฉันมันคือ googleapis.com

openssl s_client -host www.googleapis.com -port 443

คุณจะได้รับสิ่งนี้กลับมา:

Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.googleapis.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority

หมายเหตุ: ฉันบันทึกสิ่งนี้หลังจากที่ฉันแก้ไขปัญหาไปยังผลลัพธ์ในเครือของคุณอาจดูแตกต่างกัน

จากนั้นคุณต้องดูใบรับรองที่อนุญาตใน php เรียกใช้ phpinfo () ในหน้า

<?php echo phpinfo();

จากนั้นค้นหาไฟล์ใบรับรองที่โหลดจากหน้าผลลัพธ์:

openssl.cafile  /usr/local/php5/ssl/certs/cacert.pem

นี่คือไฟล์ที่คุณจะต้องแก้ไขด้วยการเพิ่มใบรับรองที่ถูกต้องลงไป

sudo nano /usr/local/php5/ssl/certs/cacert.pem

โดยทั่วไปคุณจะต้องผนวก "ลายเซ็น" ใบรับรองที่ถูกต้องต่อท้ายไฟล์นี้

คุณสามารถค้นหาบางส่วนได้ที่นี่: คุณอาจต้อง google / ค้นหาผู้อื่นในเครือหากคุณต้องการ

พวกเขามีลักษณะเช่นนี้:

ภาพใบรับรองตัวอย่าง

( หมายเหตุ: นี่คือภาพเพื่อให้ผู้คนไม่เพียงแค่คัดลอก / วางใบรับรองจาก stackoverflow )

เมื่อใบรับรองที่ถูกต้องอยู่ในไฟล์นี้ให้รีสตาร์ท apache และทดสอบ


0

คุณอาจจะลองติดตั้งca-certificatesแพคเกจหรืออย่างชัดเจนอนุญาตใบรับรองในคำถามตามที่อธิบายไว้ที่นี่


-5

การแก้ปัญหาง่ายมาก! ใส่บรรทัดนี้ก่อนcurl_exec:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

สำหรับฉันมันใช้งานได้


7
ไม่เคย เคยปิดการใช้งานการตรวจสอบเพียร์นอกจากคุณจะไม่สนใจว่าข้อมูลจะถูกส่งระหว่างการขนส่งหรือไม่
rdlowrey

ตกลง หากคุณต้องการแอพที่ปลอดภัยคุณต้องมีการยืนยันจากเพื่อน
braden

2
"ไม่เคยปิดการใช้งานการตรวจสอบเพียร์" ไม่เว้นแต่คุณต้องการฟังก์ชันเบราว์เซอร์เริ่มต้น นอกจากนี้ทำไม downvote นี้มาก? นี่เป็นคำตอบเดียวที่สั้นหวานตรงประเด็นและมีประสิทธิภาพ
Adam F

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