วิธีแก้ปัญหา Ruby Error เกี่ยวกับ SSL certificate

สำหรับใครที่ใช้คำสั่ง bundle install ใน Ruby แล้วเจอ Error เกี่ยวกับ SSL certificate แบบนี้ จะแก้ยังไงดี มาอ่านบทความนี้แล้วทำตามได้เลยจ้า

ตัวอย่าง error ที่หลายๆคนจะเจอก็เป็นแบบนี้

C:\Bitnami\redmine\apps\redmine\htdocs\plugins>bundle install
Warning: this Gemfile contains multiple primary sources. Using `source` more than once without a block is a security risk, and may result in installing unexpected gems. To resolve this warning, use a block to indicate which gems should come from the secondary source. To upgrade this warning to an error, run `bundle config disable_multisource true`.
Fetching source index from https://rubygems.org/
Retrying source fetch due to error (2/3): Bundler::Fetcher::CertificateFailureError Could not verify the SSL certificate for https://rubygems.org/.
There is a chance you are experiencing a man-in-the-middle attack, but most likely your system doesn't have the CA certificates needed for verification. For information about OpenSSL certificates, see bit.ly/ruby-ssl. To connect without using SSL, edit your Gemfile sources and change 'https' to 'http'.
Retrying source fetch due to error (3/3): Bundler::Fetcher::CertificateFailureError Could not verify the SSL certificate for https://rubygems.org/.
There is a chance you are experiencing a man-in-the-middle attack, but most likely your system doesn't have the CA certificates needed for verification. For information about OpenSSL certificates, see bit.ly/ruby-ssl. To connect without using SSL, edit your Gemfile sources and change 'https' to 'http'.
Could not verify the SSL certificate for https://rubygems.org/.
There is a chance you are experiencing a man-in-the-middle attack, but most
likely your system doesn't have the CA certificates needed for verification. For
information about OpenSSL certificates, see bit.ly/ruby-ssl. To connect without
using SSL, edit your Gemfile sources and change 'https' to 'http'.

ทำไม เนื่องจากเจ้า Ruby ในส่วนของ net/http library นั้นไม่ได้ทำการตรวจสอบ SSL certificate ในระหว่าง TLS handshake

วิธีแก้ไข ก็คือเราจะทำการเอา certificate ที่ตรวจสอบแล้วจากเว็บของ curl มาใช้แทน

โดยก่อนอื่นให้ทำการติดตั้ง RailsInstaller สำหรับใครที่ติดตั้งแล้วก็ข้ามขั้นตอนนี้ไปได้เลย
http://railsinstaller.org/en

หลังจากติดตั้งเสร็จแล้ว เราก็มา Download เจ้า cacert.pem จาก curl website http://curl.haxx.se/ca/ แล้วเราก็เอาไฟล์ cacert.pem ไปวางไว้ที่ C:\RailsInstaller\cacert.pem

เสร็จแล้วก็เรียกคำสั่ง
set SSL_CERT_FILE=C:\RailsInstaller\cacert.pem

C:\Bitnami\redmine\apps\redmine\htdocs\plugins>set SSL_CERT_FILE=C:\RailsInstaller\cacert.pem

หลังจากนั้นลองใช้คำสั่ง bundle install ดู ก็จะไม่พบปัญหา Error อีกแล้วดังตัวอย่าง ด้านล่าง ก็เป็นอันจบพิธีสำหรับการแก้ไขปัญหา SSL certificate ของ ruby

ตัวอย่าง bundle install หลังจากลง certificate แล้ว ก็จะลงได้ปกติ

C:\Bitnami\redmine\apps\redmine\htdocs\plugins>bundle install
Warning: this Gemfile contains multiple primary sources. Using `source` more than once without a block is a security risk, and may result in installing unexpected gems. To resolve this warning, use a block to indicate which gems should come from the secondary source. To upgrade this warning to an error, run `bundle config disable_multisource true`.
Fetching gem metadata from https://rubygems.org/..............
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies.....
Using rake 10.4.2
...
Using thin 1.6.1
Using tzinfo-data 1.2015.1
Updating files in vendor/cache
  * liquid-2.6.3.gem
  * rubyzip-1.1.7.gem
  * redmine_crm-0.0.53.gem
Bundle complete! 32 Gemfile dependencies, 56 gems now installed.
Gems in the groups development, test and RAILS_ENV=production were not installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.

ข้อมูลอ้างอิงจาก
https://gist.github.com/fnichol/867550