2014-01-29 91 views
3

我爲特殊目的寫了一個小型SIP客戶端。 基本上它連接到端口5060使用函數fsockopen()使用TLS在PHP中建立連接

$fp = fsockopen("10.0.0.1", 5060, $errno, $errstr, 30); 

然後基本上讀取和寫入利用fread()fwrite() SIP命令。

現在我的SIP服務運營商希望我們的客戶使用SIPS,其基本上是基於TLS的SIP,即 。我花了幾個小時尋找信息 關於如何使用PHP連接到使用TLS的端口,但沒有任何 成功。顯然,fsockopen()支持TLS的程度,但 當我更換了上面:

$fp = fsockopen("tls://10.0.0.1", 5061, $errno, $errstr, 10); 

我什麼也沒得到。我可以從我的外殼與OpenSSL的客戶端連接到服務器:

$ openssl s_client -connect 10.0.0.1:5061 

而且我可以通過沒有問題,連接與SIP服務器進行通信。 OpenSSL支持在PHP中編譯。

我的問題是我無法在PHP中設置與服務器的TLS連接。我在一些論壇上注意到,在較舊版本的PHP中,可以通過fsockopen()來構建和使用SSL上下文,但顯然不再是了,因爲我得到了有關太多參數的錯誤。

我也使用stream_context_create()stream_context_set_option()嘗試,但我沒有得到任何答覆從服務器:

$context = stream_context_create(); 
$result=stream_context_set_option($context, 'ssl', 'verify_peer', 'TRUE'); 
$result=stream_context_set_option($context, 'ssl', 'cafile', 'cert.cer'); 
$result=stream_context_set_option($context, 'ssl', 'verify_depth', '5'); 

$fp = stream_socket_client('tls://'.$host.':'.$port, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context); 

,但我仍然無法從服務器獲取任何回覆或錯誤。在PHP中使用TLS的建議和工作方式是什麼?

回答

2

這足以打開TLS連接:

$context = stream_context_create(); 

$fp = stream_socket_client('tls://'.$host.':'.$port, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context) 

如果證書是在他們的地方。如果不是,請按照Filippos鏈接的說明進行操作。

+0

順便說一句,如果要實現在PHP中的TLS(或SSL)連接,'stream_set_timeout'將無法正常工作(我運行PHP 5.4.4從CLI)。我最終使用'stream_select'作爲解決方案。 –

+0

如何提供證書和密碼? – yasirmturk

0

您還需要安裝適當的證書才能使TLS正常工作。 Check this SO question中有關如何使用常規TLS連接使用密鑰文件的示例。

此外,請檢查SIPS本身的規格RFC 5630

2

我認爲你的一些選項對於驗證自簽名證書是錯誤的;下面應該足以使其工作:

$context = stream_context_create([ 
    'ssl' => [ 
    'verify_peer' => true, 
    'allow_self_signed' => true, 
    'local_cert' => 'cert.cer', 
    ], 
]); 
0

我剛剛遇到這個錯誤,在這裏和那裏調試連接問題或代理問題,終於找到了罪魁禍首......並且解決方案是安裝php-pecl-crypto擴展。

我的機器是CentOS的7使用雷米回購的PHP