Fix Curl Error: SSL certificate problem: unable to get local issuer certificate

最近正在安裝 WHMCS localhost 開發環境,程式安裝成功,但許可證一直無法通過,在原廠協助下,來來回回終於找到錯誤原因,就是 Curl 有錯誤,錯誤訊息:

Curl Error: SSL certificate problem: unable to get local issuer certificate

Fix Curl Error: SSL certificate problem: unable to get local issuer certificate

Curl在 WHMCS 中是很重要的,很多API的介接都需要靠它,我已經成功修復錯誤,以下分享修正方法。

修正 unable to get local issuer certificate 錯誤

Step 1. 下載CA憑證

到這個網址下載憑證: Download the certificate bundle.

Download the certificate bundle.

點紅框處下載,檔名為 cacert.pem

Step 2. 複製檔案到PHP安裝目錄中

雖然可以放在任意位置,單純是因為好找,所以我把它放在PHP安裝目錄中:

C:\php-7\extras\ssl\cacert.pem

Step 3. 確認PHP.ini啟用 mod_ssl 模組

找到 PHP.ini  檔打開它並查找 php_openssl.dll

如果它前面有分號,代表沒有開啟,請將分號移除

;extension=php_openssl.dll

如果 PHP.ini  中沒有查找到 php_openssl.dll  請於空白處,自行加入下方這一行

extension=php_openssl.dll

Step 4. 設定cacert.pem

繼續在 PHP.ini  中查找 curl.cainfo  及 openssl.cafile  這兩行

填入 Step 2 的 cacert.pem  檔案之絕對路徑,和上一個步驟一樣,前方有分號請移除分號,如果找不到這兩行請自行添加

特別注意:目錄斜線跟 Windows 檔案總管的斜線相反,要用左斜線

curl.cainfo="C:/php-7/extras/ssl/cacert.pem"
openssl.cafile="C:/php-7/extras/ssl/cacert.pem"

Step 5. 重新啟動服務器

重啟後,重新測試

Fix Curl Error: SSL certificate problem: unable to get local issuer certificate

參考:[……]

閱讀更多

MIS WAMP手動安裝及設定教學 Apache2.4 + PHP7 for windows10

手動安裝 Apache2.4 + PHP7 for windows10

首先,我該選x64或x86安裝呢?

何謂 x64 和 x86,可閱讀下方網址文章,本篇不多做解釋
x86和x64到底有什麼差異? http://www.ithome.com.tw/node/56880

注意 !!!

若安裝x64版本,PHP & Apache 都需要選擇x64版本,反之亦然

安裝 PHP7 for windows

本例下載 PHP 7.0 VC14 x64 Thread Safe

php-7.0.10-Win32-VC14-x64.zip

解壓縮至 PHP 的存放目錄
本例解壓縮至 C:php-7.0.10-Win32-VC14-x64

設定 php.ini PHP.ini 為PHP的設定檔

PHP安裝目錄中尚無 PHP.ini
但於安裝目錄中有下列2個檔案
php.ini-development 為開發環境用參考設定檔
php.ini-production    為正式環境用參考設定檔
本例複製 php.ini-development 更名為 php.ini 置於於PHP安裝目錄中 文字編輯器開啟 php.ini

以下為常用設定

視需求調整參數,至於設定內容就不於本篇討論

「C:/php-7.0.10-Win32-VC14-x64/」為PHP安裝目錄

注意!!!!!!!!!!

分隔路徑的斜線,要用「/」而不是 windows 檔案總管的「\」

所以是
「C:/php-7.0.10-Win32-VC14-x64/」

不是
「C:\php-7.0.10-Win32-VC14-x64\

儲存 httpd.conf

Apache安裝為 windows 服務,開機自動啟動

開啟 Win10 的 「命令提示字元(系統管理員)」

// 測試設定檔是否正確

錯誤會跳錯誤訊息,正確會顯示syntax OK,接著安裝服務

// 安裝服務,反之解除安裝為 httpd.exe -k uninstall

測試是否正確運行

在網站根目錄C:/AppServ/www下建立一個index.php檔案

運行 http://127.0.0.1
看到下列畫面,代表安裝成功

呼~打完收工!!

[……]

閱讀更多

Javascript for each in 做到跟PHP foreach 一樣的使用方式

//先宣告物件
var myobj = new Object();

//給物件的屬性值
myobj.color = ‘red’;
myobj.name = ‘hsin’;
myobj.nation = ‘taiwan’;

//這邊展現如何用for – in 取出。
var content=”;
for(var key in myobj){
       content +=”屬性名稱:”+ key+” ; 值: “+myobj[key]+”n”;
}

alert(content);

出處:四處流浪的阿基[……]

閱讀更多

PHP 判斷是否為行動裝置

因為目前裝置已經不只有電腦,可能有電腦、平板及手機,如何去判別user的瀏覽器然後給予不同內容,這樣的功能變得非常重要,今天發現了一個很簡單的方法~用網友寫好的Mobile Detect  class來做判斷,官網在下方,
http://mobiledetect.net/;
那斷的方式也很簡單~
範例如下~

  1. require_once(“Mobile_Detect.php”);   
  2. $detect = new Mobile_Detect;   
  3. $deviceType = ($detect->isMobile() ? ($detect->isTablet() ? ‘tablet’ : ‘phone’) : ‘computer’);  
  1. <?php $check = $detect->isMobile(); if($check): ?>    
  2.     是的話做的事   
  3. <?php else: ?>  
  4.     不是的話做的事   
  5. <?php endif; ?>  

延伸閱讀
http://blog.wingzero.tw/2014/09/php.html

[……]

閱讀更多

PHP Deprecated: Function set_magic_quotes_runtime() is deprecated 解決方法

set_magic_quotes_runtime()於 PHP5.3後棄用

在 PHP.net 官方文件中有提到,set_magic_quotes_runtime()於PHP5.3已經棄用,雖然不會造成Fatal error而中斷程式,但會發送E_DEPRECATED的過時警告

Deprecated: Function set_magic_quotes_runtime() is deprecated

替代方案:

set_magic_quotes_runtime(0);

意思同上,以下列方法替代棄用的set_magic_quotes_runtime()

ini_set("magic_quotes_runtime", 0);
這一段主要是修改 php.ini 中 magic_quotes_runtime 參數
用以將SQL語句自動加上跳脫字元反斜線,以防止SQL注入隱碼攻擊(SQL injection)

PHP 5.4起,使用此函數會拋出Fatal error,終止程式運行

Fatal error: Uncaught Error: Call to undefined function set_magic_quotes_runtime()

相容性:

有時在寫PHP並不一定確定針對某一版本去寫,另外目標主機環境百百款,PHP版本也很不固定,每次要針對版本再改就會很麻煩,我覺得相容性就變得很重要,解決方法如下:

把舊版本程式有使用到

set_magic_quotes_runtime(0);

都改為就可以了

ini_set("magic_quotes_runtime", 0);
另外在前面加上@,加上@的意思就是強制不拋錯誤訊息,如下
@set_magic_quotes_runtime(0);
不過我覺得還是不要使用@強制不拋錯誤訊息的作法,
因為有很多時候Debug還是需要錯誤訊息,
當然還有其他方法,其他方法可參考官網文件,

參考資料:

[……]

閱讀更多

PHP.INI的安全性設定參考

php.ini的安全性設定參考
safe_mode = on
限制system, exec等系統執行的能力,限制某些function只能處理與自己同一個UID的檔案。
safe_mode受限制的功能請參考http://tw2.php.net/manual/en/features.safe-mode.functions.php
因為mail()的第五個參數有漏洞,可突破safe_mode的限制,執行系統命令,最好disable,以SMTP的方式替代寄信。
register_globals = off
allow_url_fopen = Off (很重要的設定)
allow_url_fopen 打開的時候, 如果有人傳入一個參數為 xxx=http://xxx/xxx 之類的東西,
如果這個 php 的程式, 沒有檢查這個變數, 或是 register_globals 是開啟的情形下, 也許會造成這個 php 使用
include() 去把遠端那個 URL 的檔案給引入執行…. 也就是執行到了別人寫的程式, 這時… 自然別人想在那裡頭做什麼,
就能夠做什麼了.
display_errors = off
盡量不要在正式上線的主機直接顯示錯誤在頁面上,以避免暴露系統資訊。如需有debug的需要則開啟log_errors = On ,並以error_log = filename指定錯誤訊息要記錄到哪個檔案。
magic_quotes_gpc = on
默認是on,但需檢查一遍
open_basedir =web目錄
盡量將網站的起路徑限制在web的路徑,並免駭客去引用web路徑以外的檔案。
disable_functions = (很重要的設定,對外的Web建議要把可以執行系統指令的functions拿掉) system,exec,passthru,proc_close,proc_get_status,proc_nice,proc_open,proc_terminate,shell_exec,popen,dl,set_time_limit
非必要一定要關閉的funciton,不然駭客會利用來執行檔案來取得你的管理權限。
能的話盡量將php檔案編碼過,可避免駭客在得到你的程式後,進一步分析程式的漏洞。
盡量限制可上傳檔案的folder,其他的目錄都不要讓web server有寫入的權限。
php檔案的owner不能是root,配合safe_mode使用,可以避免駭客利用來以root身份執行命令。
fsockopen能的話也關掉,但是因為有部分套裝程式會用到,例如Horde Webmail,如果關掉fsockopen imap會連不上。

[……]

閱讀更多

PHP 以 Curl 傳遞 POST 資料,並取得回傳值

Curl 傳遞 POST 資料,並取得回傳值

/**
* VECTOR COOL
* https://vector.cool
*/
//用curl傳post並取回傳值
//一定要傳絕對路徑
function curl_post($url,$post)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST,true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$result = curl_exec($ch);
curl_close ($ch);
return $result;
}

使用範例:

/**
* VECTOR COOL
* https://vector.cool
*/
$url='http://tw.yahoo.com';
$post_value= array(
'name' => 'JACK',
'age' => '20',
'phone' => '0968123456',
'address' => '台灣'
);

echo curl_post($url,$post_value);

 [……]

閱讀更多