我爲特殊目的寫了一個小型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的建議和工作方式是什麼?
順便說一句,如果要實現在PHP中的TLS(或SSL)連接,'stream_set_timeout'將無法正常工作(我運行PHP 5.4.4從CLI)。我最終使用'stream_select'作爲解決方案。 –
如何提供證書和密碼? – yasirmturk