LevelUp! Studio » https https://blog.levelup.in.th Experience the new world. Fri, 26 May 2017 10:06:07 +0000 th hourly 1 http://wordpress.org/?v=3.8.1 [Unity3D] เราจะแก้ปัญหา NSURLErrorDomain error -1012 ใน WWW class ของ Unity 5 ใน iOS ได้อย่างไร? https://blog.levelup.in.th/2015/05/30/unity3d-%e0%b9%80%e0%b8%a3%e0%b8%b2%e0%b8%88%e0%b8%b0%e0%b9%81%e0%b8%81%e0%b9%89%e0%b8%9b%e0%b8%b1%e0%b8%8d%e0%b8%ab%e0%b8%b2-nsurlerrordomain-error-1012-%e0%b9%83%e0%b8%99-www-class-%e0%b8%82/ https://blog.levelup.in.th/2015/05/30/unity3d-%e0%b9%80%e0%b8%a3%e0%b8%b2%e0%b8%88%e0%b8%b0%e0%b9%81%e0%b8%81%e0%b9%89%e0%b8%9b%e0%b8%b1%e0%b8%8d%e0%b8%ab%e0%b8%b2-nsurlerrordomain-error-1012-%e0%b9%83%e0%b8%99-www-class-%e0%b8%82/#comments Sat, 30 May 2015 09:36:13 +0000 http://blog.levelup.in.th/?p=4376 เนื่องจากตอนนี้ Unity 5 ก็ออกมาสักพักใหญ่แล้ว แถมฟรีอีกตะหาก (ถ้ารายได้ไม่ถึงเป้า) เราก็ควรจะใช้ Unity 5 กันใช่ไหมครับ แต่ช่วงนี้ Unity 5 ได้ทำ bug (อันใหญ่หลวง) เอาไว้ นั่นคือหากเราใช้ WWW class เรียกไปที่ URL ใดๆ ที่เป็น https จะทำให้ไม่สามารถรับข้อมูลจาก URL นั้นๆ ได้เลย จะ WWW class จะแจ้ง error กลับมาว่า

The operation couldn’t be completed. (NSURLErrorDomain error -1012.)

ซึ่งเว็บเกมของผมเป็น HTTPS ทั้งหมดจึงกระทบเต็มๆ และบางคนอาจจะคิดว่าผมไม่พบปัญหานี้หรอก แต่ถ้าคุณต้องมีการเรียก Profile picture จาก  Facebook แล้วละก็ยังไงคุณก็จะถูกบังคับให้เรียกผ่าน HTTPS โดยอัตโนมัติ ถึง URL จะไม่ได้ระบุเป็น HTTPS  ก็ตาม เช่น http://graph.facebook.com/my_facebook_id/picture แต่สุดท้าย Facebook ก็จะ Redirect ไปยังที่อยู่รูปจริงๆ ที่เป็น HTTPS อยู่ดี และทำให้ไม่สามารถแสดงรูป profile facebook ได้ในที่สุด

จริงๆ แล้วปัญหานี้มีการแจ้งกันมาตั้งแต่เดือนมีนาคมแล้ว และ Unity ก็บอกว่าแก้ไปแล้วในเวอร์ชั่น 5.x.x แต่จนแล้วจนรอดก็ยังไม่ได้แก้จริงสักที ณ เวอร์ชั่นปัจจุบัน 5.0.1f ล่าสุดก็ยังไม่ได้แก้ ดังนั้นเราคงจะรอกันไม่ได้ ต้องหาวิธีแก้กันเอง โดยวิธีแก้ก็คือให้สร้างไฟล์ชื่อว่า CustomConnection.mm ขึ้นมา และใส่ code ด้านล่างลงไป

#include "Unity/WWWConnection.h"
@interface UnityWWWCustomRequestProvider : UnityWWWRequestDefaultProvider
{
}
+ (NSMutableURLRequest*)allocRequestForHTTPMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers;
@end
@implementation UnityWWWCustomRequestProvider
+ (NSMutableURLRequest*)allocRequestForHTTPMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers
{
NSMutableURLRequest* request = [super allocRequestForHTTPMethod:method url:url headers:headers];
// let's pretend for security reasons we dont want ANY cache nor cookies
request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
[request setHTTPShouldHandleCookies:NO];
return request;
}
@end
@interface UnityWWWCustomConnectionDelegate : UnityWWWConnectionSelfSignedCertDelegate
{
}
@end
@implementation UnityWWWCustomConnectionDelegate
- (NSCachedURLResponse*)connection:(NSURLConnection*)connection willCacheResponse:(NSCachedURLResponse*)cachedResponse
{
// we dont want caching
return nil;
}
- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response
{
[super connection:connection didReceiveResponse:response];
}
@end
IMPL_WWW_DELEGATE_SUBCLASS(UnityWWWCustomConnectionDelegate);
IMPL_WWW_REQUEST_PROVIDER(UnityWWWCustomRequestProvider);

จากนั้นเซพไปที่ Assets/Plugins/iOS/CustomConnection.mm เท่านี้เป็นอันจบ ไม่ต้องไป set path ใดๆ เพิ่มเติม Unity จะจัดการของมันเองต่ออัตโนมัติ โดยหลักการทำงานของมันคือการแก้ไข class WWW ของ Unity ด้วยตัวเราเองผ่าน Plugin เพื่อ bypass cache บางอย่างที่ WWW ทำงานผิดพลาด สามารถอ่านรายละเอียดเพิ่มเติมได้ที่ Manual หน้านี้ครับ

ซึ่งวิธีแก้วิธีนี้ก็มาจากคนของ Unity นั่นแหละมาโพสต์บอกใน Forum ของเขาเองที่มีคนถาม แต่ด้วยเหตุผลประการใดก็ไม่อาจทราบได้ ตัว Unity หลักๆ กลับไม่ถูกแก้ไขเสียทีจนเราต้องมาแก้ไขเองนี่แหละ เท่านี้เป็นอันจบพิธีครับ :)

]]>
https://blog.levelup.in.th/2015/05/30/unity3d-%e0%b9%80%e0%b8%a3%e0%b8%b2%e0%b8%88%e0%b8%b0%e0%b9%81%e0%b8%81%e0%b9%89%e0%b8%9b%e0%b8%b1%e0%b8%8d%e0%b8%ab%e0%b8%b2-nsurlerrordomain-error-1012-%e0%b9%83%e0%b8%99-www-class-%e0%b8%82/feed/ 0
วิธีใส่ SSL Certification (HTTPS) ใน Socket.io (Node.js) https://blog.levelup.in.th/2012/08/31/how-to-use-ssl-certificate-https-in-socketio-nodejs%e0%b8%a7%e0%b8%b4%e0%b8%98%e0%b8%b5%e0%b9%83%e0%b8%aa%e0%b9%88-ssl-certification-https-%e0%b9%83%e0%b8%99-socketio-nodejs/ https://blog.levelup.in.th/2012/08/31/how-to-use-ssl-certificate-https-in-socketio-nodejs%e0%b8%a7%e0%b8%b4%e0%b8%98%e0%b8%b5%e0%b9%83%e0%b8%aa%e0%b9%88-ssl-certification-https-%e0%b9%83%e0%b8%99-socketio-nodejs/#comments Fri, 31 Aug 2012 12:27:47 +0000 http://blog.levelup.in.th/?p=1981

จากการเปิดเกมป๊อกเด้งมาหลายอาทิตย์พบปัญหาคือการติดตั้ง SSL สำหรับ NodeJS นั้นไม่ค่อยจะเหมือนกับภาษาชาวบ้านอื่นๆ ซักเท่าไหร่ครับ ไฟล์ config สำหรับรัน NodeJS นั้นจะไม่ได้เป็นลักษณะเหมือนอย่าง php.ini ซึ่งเป็นไฟล์แยกต่างหากโดยเฉพาะ แต่ NodeJS จะใช้การ config ผ่าน syntax javascript ทั้งหมดครับ (เรียก function เพื่อ setting ค่าต่างๆ ครับ) โดยผมทำเกมบน Facebook จึงต้องติดตั้ง SSL เพื่อให้ใช้งาน HTTPS ได้ ซึ่งองค์ประกอบสำหรับการติดตั้ง SSL 1 domain จะได้แก่

  1. private key file
  2. certificate file ที่ได้จากการซื้อ SSL กับเว็บไซต์ที่รับจดทะเบียน
  3. intermediate file ตามแต่เจ้าของ SSL ที่เราเลือกใช้

แต่ตัวไฟล์ Intermediate ของ SSL นี่สิเจ้าปัญหา เพราะมักเป็น Chain ที่ต่อเนื่องไปยัง Root CA (มี CA หลายชั้นในการตรวจสอบใบอนุญาต SSL ของเรา) ตัวอย่างไฟล์ Intermediate ที่ผมใช้คือ PositiveSSL มีดังนี้ (จริงๆ จะยาวกว่านี้มากนะครับ นี่เป็นเพียงแค่ตัวอย่างลักษณะหน้าตาเฉยๆ )

-----BEGIN CERTIFICATE-----
MIIFKTCCBBGgAwIBAgIRANJ0OUh7t/Gr2RV5gntPmEIwDQYJKoZIhvcNAQEFBQAw
cTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ29tb2RvIENBIExpbWl0ZWQxFzAVBgNV
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFAzCCA+ugAwIBAgIQTM1KmltFEyGMz5AviytRcTANBgkqhkiG9w0BAQUFADCB
lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEhjCCA26gAwIBAgIQUkIGSk83/kNpSHqWZ/9dJzANBgkqhkiG9w0BAQUFADBv
MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk
ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF
...
-----END CERTIFICATE-----

จากที่ยกมาจะเห็นได้ว่ามี —–BEGIN CERTIFICATE—– และ —–END CERTIFICATE—– ทั้งหมด 3 ชุด นั่นคือมีโซ่ทั้งหมด 3 บล็อค (ของคุณอาจมีมากหรือน้อยกว่านี้ตามแต่เจ้า CA ที่คุณจดทะเบียนใช้งาน) ทีนี้สำหรับ Node.js เราต้องแยกไฟล์ intermediate ออกเป็น 3 ไฟล์ (ตามจำนวนบล็อคที่พบ) ไฟล์ละบล็อค แล้วใส่ลงไปใน code ดังนี้ (ใน code ทั้งสามไฟล์จะชื่อ intermediate.pem, intermediate2.pem, intermediate3.pem)


var privateKey = fs.readFileSync('/home/pokdeng/op2-ssl/private.key').toString();
var certificate = fs.readFileSync('/home/pokdeng/op2-ssl/cert.pem').toString();
var ca = fs.readFileSync('/home/pokdeng/op2-ssl/intermediate.pem').toString();
var ca2 = fs.readFileSync('/home/pokdeng/op2-ssl/intermediate2.pem').toString();
var ca3 = fs.readFileSync('/home/pokdeng/op2-ssl/intermediate3.pem').toString();
var ios = require('socket.io').listen(443, {key:privateKey, cert:certificate, ca:[ca,ca2,ca3]});

ใน code ตัวอย่างจะเป็น Socket.IO นะครับ หากเป็นการสร้าง server แบบอื่น (หรือใช้ Framework ใดๆ) parameter ก็จะแตกต่างกันไป แต่ส่วนที่เหมือนกันคือก้อน {key:privateKey, cert:certificate, ca:[ca,ca2,ca3]} ครับ เมื่อใส่แล้วก็ต้องทดสอบว่าเรา setup ได้ถูกต้องหรือยังด้วยการไปที่ http://www.digicert.com/help/ แล้วกรอก URL ที่เรียก Node.js ของเราลงไป (ของผมคือ http://op2.levelup.in.th/socket.io/socket.io.js) หาก setup ได้ถูกต้อง จะปรากฎโซ่คล้องกันต่อเนื่องกันไปพร้อม icon ติ๊กถูก แสดงข้อความว่า “SSL Certificate is correctly installed” ก็เป็นอันเสร็จพิธี!

]]>
https://blog.levelup.in.th/2012/08/31/how-to-use-ssl-certificate-https-in-socketio-nodejs%e0%b8%a7%e0%b8%b4%e0%b8%98%e0%b8%b5%e0%b9%83%e0%b8%aa%e0%b9%88-ssl-certification-https-%e0%b9%83%e0%b8%99-socketio-nodejs/feed/ 0
การแก้ไข ปรับเปลี่ยนเว็บไซต์ให้รองรับ HTTPS https://blog.levelup.in.th/2011/09/30/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b9%89%e0%b9%84%e0%b8%82-%e0%b8%9b%e0%b8%a3%e0%b8%b1%e0%b8%9a%e0%b9%80%e0%b8%9b%e0%b8%a5%e0%b8%b5%e0%b9%88%e0%b8%a2%e0%b8%99%e0%b9%80%e0%b8%a7%e0%b9%87/ https://blog.levelup.in.th/2011/09/30/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b9%89%e0%b9%84%e0%b8%82-%e0%b8%9b%e0%b8%a3%e0%b8%b1%e0%b8%9a%e0%b9%80%e0%b8%9b%e0%b8%a5%e0%b8%b5%e0%b9%88%e0%b8%a2%e0%b8%99%e0%b9%80%e0%b8%a7%e0%b9%87/#comments Fri, 30 Sep 2011 14:28:59 +0000 http://blog.levelup.in.th/?p=1204 เนื่องด้วย facebook บังคับให้ application ทุกตัวใช้งาน HTTPS ภายในวันที่ 1 ตุลาคมนี้ ทำให้ผมต้องนั่งปรับแก้ยกใหญ่ โดยสิ่งที่ต้องแก้มีดังนี้

ต้องแก้อะไรบ้าง?

1. ทำ self-signed certificate (ใช้งาน https ได้แต่ browser จะขึ้นเตือนว่าไม่ปลอดภัย และไม่สามารถใช้งานกับ facebook app ที่อยู่ใน canvas ได้) หรือไปขอ certificate จากผู้ให้บริการต่างๆเช่น Thawte, RapidSSL, Godaddy, Verisign ฯลฯ ซึ่งต้องเสียค่าจดทะเบียน ซึ่งจะแตกต่างกันไป

2. แก้ไข code ของเราในการ link ไปแต่ละหน้าจาก http:// ให้เป็น https:// ทั้งหมด เพื่อให้คนที่ใช้งานเว็บไซต์อยู่ไม่หลุดออกจากการเชื่อมต่อ https เพียงเพราะคลิก link เปลี่ยนหน้า

3. แก้ไข code ของเราที่ call ไปยัง external site ต่างๆ เช่น banner exchange ต่างๆ (ที่จริงพวก widget เช่น google+, facebook like หรือ google analytic ก็เข้าเคสนี้ แต่เนื่องจาก code ที่ให้มาจะ auto detect ให้เองว่าเป็น https หรือไม่อยู่แล้วจึงไม่ค่อยมีปัญหานัก ยกเว้นเรา call หาไฟล์ javascript ข้างนอกเองตรงๆ ก็ต้องแก้จาก http:// เป็น https:// ด้วยเช่นกัน)

ผู้ให้บริการ SSL แต่ละเจ้าต่างกันอย่างไร?

เมื่อเราเลือกจะจด SSL แล้วจะมีผู้ให้บริการหลากหลายยี่ห้อมาให้เลือกมากมายเช่น  Thawte, RapidSSL, Godaddy, Verisign ราคาแต่ละเจ้าก็จะต่างๆ กันไป หลายคนอาจสงสัยว่าแล้วเราจะเลือกจดเจ้าที่แพงๆ ไปทำไมกัน? คำตอบคือ “แบรนด์ความน่าเชื่อถือ” ครับ ยิ่งจดแพง ก็จะยิ่งมีความน่าเชื่อถือมากขึ้นตามไปด้วย (อารมณ์ประมาณถ้าไม่จริงจังกับความปลอดภัย ผมคงไม่เลือกจดแพงที่มีแต่เว็บใหญ่ๆ เค้าจดกันหรอกครับ 55) รวมไปถึงขั้นตอนการยืนยันตัวตนด้วยเช่นกัน SSL บางประเภทอาจต้องยืนยันถึงขั้นว่าบริษัทนี้มีตัวตน มีเอกสารการจดทะเบียนถูกต้อง และใช้เวลาการ approve นานเป็นอาทิตย์ จึงสามารถเชื่อถือได้ว่าผ่านการตรวจสอบมาแล้วอย่างดี อะไรประมาณนั้น 55

แต่สำหรับคนทั่วๆ ไปถ้าไม่ได้ทำเกี่ยวกับพวกจ่าย credit card บนหน้าเว็บของเราเองก็ใช้แบบถูกสุดเลยก็ได้ครับ เพราะพวกของถูกๆ จะ approve เร็วและสามารถใช้งานได้ทันทีภายใน 2-3 ชั่วโมง

ขั้นตอนการจดทะเบียน https

1.  เชื่อมต่อเข้า ssh ไปยัง server ของเราที่ host ไฟล์ของเราอยู่

2. สร้าง private key ด้วยคำสั่ง
openssl genrsa -out www.mycompany.com.key 2048

3. สร้าง file csr (ต้องใช้ตอนจดทะเบียน https) ด้วยคำสั่ง
openssl req -new -key www.mycompany.com.key -out www.mycompany.com.csr

4. กรอกรายละเอียด โดยช่องใดไม่ต้องการกรอกสามารถพิมพ์ . เพื่อเว้นว่างไว้ได้ ซึ่งจุดที่สำคัญที่สุดมีเพียงอันเดียวคือ Common Name ให้ใส่เป็นชื่อโดเมนที่ต้องการ (www.mycompany.com และ mycompany.com จะถือว่าเป็นคนละชื่อกัน ต้องจดแยกกัน) ตัวอย่างการกรอกข้อมูลเช่น

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [AU]:TH
State or Province Name (full name) [Some-State]:Bangkok
Locality Name (eg, city) []:.
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company LLC
Organizational Unit Name (eg, section) []:.
Common Name (eg, YOUR name) []:www.mycompany.com
Email Address []:.

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:.
An optional company name []:.

5. copy ข้อมูลในไฟล์ www.mycompany.com.csr ส่งให้ผู้รับจดทะเบียน ssl ดำเนินการต่อไป

6. ต้องมีอีเมล์ที่ชื่อดังต่อไปนี้เท่านั้น(อันใดอันหนึ่ง) เพื่อใช้รับ certificate ที่ทางผู้รับจดทะเบียน https จะส่งกลับมาให้ หากไม่มีจะไม่สามารถจดทะเบียนได้
- admin@mycompany.com

- administrator@mycompany.com

- hostmaster@mycompany.com

- webmaster@mycompany.com

- root@mycompany.com

- postmaster@mycompany.com

7. ติดตั้ง certificate ลง webserver เพื่อเรียกใช้งาน ซึ่ง webserver แต่ละตัว รวมไปถึง hosting แต่ละที่ก็จะมีขั้นตอนต่างๆ กันไป

ขั้นตอน ก็ประมาณนี้แหละครับ ที่จริงมีการจดทะเบียนหลายแบบด้วย ที่นำเสนอให้นี้เป็นการจดต่อ 1 domain ถ้า subdomain ก็ต้องจดแยกกันไป แต่จะมีการจดแบบเหมา เช่น *.mycompany.com แล้วทุกๆ subdomain ภายใต้ domain mycompany.com จะใช้งาน https ได้ทั้งหมด แต่ค่าใช้จ่ายก็จะสูงขึ้นไปอีก และมีข้อจำกัดคือทุกๆ subdomain ต้องใช้งาน IP เดียวกันทั้งหมด ขอจบบทความแต่เพียงเท่านี้ครับ :)

]]>
https://blog.levelup.in.th/2011/09/30/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b9%89%e0%b9%84%e0%b8%82-%e0%b8%9b%e0%b8%a3%e0%b8%b1%e0%b8%9a%e0%b9%80%e0%b8%9b%e0%b8%a5%e0%b8%b5%e0%b9%88%e0%b8%a2%e0%b8%99%e0%b9%80%e0%b8%a7%e0%b9%87/feed/ 12