我剛剛將 Debian 7、Nginx 1.6.2、PHP 5.4.39 升級到 Debian 8、Nginx 1.6.2、PHP 5.6.9。
在該伺服器上運行著一個 CRM,我們過去常常透過 PHP、EspoCRM 發送電子郵件,並且使用 ZendFramwork2 電子郵件(透過伺服器 2 發送 - 透過 Thunderbird 發送效果很好)。
在升級之前,這一切都運作得很好。現在我收到一條錯誤訊息:
500 unable to connect via tls
因此,稍微搜尋一下並沒有發現 CRM 的任何內容,而是指向了自簽名憑證和/或上面堆疊中的某些內容(NGinx/PHP?)。
知道從哪裡開始挖掘嗎?在我的 CRM 伺服器中,錯誤日誌中沒有任何內容(猜測是被 CRM 吞噬了)。
我在郵件伺服器的 syslog 或 authlog 中也沒有看到任何內容。
編輯:新增資訊:
phpinfo ()
Registered Stream Socket Transports tcp, udp, unix, udg, ssl, sslv3, tls, tlsv1.0, tlsv1.1, tlsv1.2
curl
SSL Yes
SSL Version OpenSSL/1.0.1k
imap
SSL Support enabled
openssl
OpenSSL support enabled OpenSSL
Library Version OpenSSL 1.0.1k 8 Jan 2015 OpenSSL Header Version
OpenSSL 1.0.1k 8 Jan 2015 Directive Local Value Master Value
openssl.cafile no value no value openssl.capath no value no value
Phar
OpenSSL support enabled
我使用了 Debian 7 中的舊設定檔(NGinx 是同一版本 - 我在 D7 上使用了向後移植)。
伺服器和軟體:
伺服器A:郵件伺服器、Debian 6、Postfix、自簽名憑證
伺服器B:Debian 8、Nginx、PHP、EspoCRM - 我選擇了 TLS,因為它在我本地 PC 上的 Thunderbird 中工作,並且在 Debian 7 到 8 升級之前就可以工作。
本地電腦:Kubuntu、Thunderbird、郵件可以透過 TLS 發送和接收。
答案1
據我了解,PHP 5.6 不允許接受驗證或處理自簽名憑證。
http://php.net/manual/en/migration56.openssl.php
您必須停用對等方和對等方名稱的驗證
$streamContext = stream_context_create([
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false
]
]);
如果嘗試在套件內執行此操作(這似乎是設計使然),那麼這並不簡單,您不能只在 php.ini 中設定一些標誌或類似的簡單內容。
答案2
500 無法透過 tls 連接
這對於確定問題所在並不是很有幫助 - 但它一定是在程式碼中的某個位置,而您可能不維護該位置,因此修改程式碼以使其正常工作應該是最後的手段。
了解什麼操作會觸發此錯誤將很有用。
由於清單中唯一提到自簽名憑證的地方是郵件伺服器,那麼我將假設這就是導致問題的原因。
您所需要做的就是將自簽名憑證新增至應用程式所在主機上的接受機構。假設(再次)MTA 使用 SMTPS:
openssl s_client -showcerts -connect servera.example.com:465 </dev/null
會給你證書鏈。將輸出複製到(例如)/etc/ssl/certs/lbutlr_local.crt
然後運行update-ca-certificates