摘要:
有沒有辦法強制PHP中的內置SoapClient類通過HTTPS連接到具有無效證書的服務器?禁用PHP中的證書驗證SoapClient
爲什麼我要這麼做?
我在沒有DNS條目或證書的服務器上部署了新的應用程序。我想嘗試使用SoapClient 連接到它,然後設置DNS條目並修復證書,最合理的方法似乎是在測試期間讓客戶端忽略證書。
難道我沒有意識到這是一個巨大的安全風險嗎?
這僅用於測試。當服務投入生產時,將會有一個有效的證書,客戶將被迫驗證它。
摘要:
有沒有辦法強制PHP中的內置SoapClient類通過HTTPS連接到具有無效證書的服務器?禁用PHP中的證書驗證SoapClient
爲什麼我要這麼做?
我在沒有DNS條目或證書的服務器上部署了新的應用程序。我想嘗試使用SoapClient 連接到它,然後設置DNS條目並修復證書,最合理的方法似乎是在測試期間讓客戶端忽略證書。
難道我沒有意識到這是一個巨大的安全風險嗎?
這僅用於測試。當服務投入生產時,將會有一個有效的證書,客戶將被迫驗證它。
SoapClient
需要一個流上下文在它的參數,你可以自己創建。這樣,你可以控制傳輸層的幾乎每一個方面:
$context = stream_context_create([
'ssl' => [
// set some SSL/TLS specific options
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
]
]);
$client = new SoapClient(null, [
'location' => 'https://...',
'uri' => '...',
'stream_context' => $context
]);
文檔:
不幸的是,這似乎並沒有工作,並且verify_peer選項已經默認爲false(http://php.net/manual/en/context.ssl.php)。 – zpon
@zpon:這通常有效。檢出您沒有使用具有不同選項的不同SSL子圖層。再仔細檢查一下你是否遇到一個PHP bug,看到一個相關的問題:[Php SoapClient stream_context選項](http:// stackoverflow。com/questions/9909232/php-soapclient-stream-context-option) – hakre
'allow_self_signed'怎麼設置爲'true'?默認爲'false' –
正確的列表爲PHP 5.6。 8 is
'SSL'=>數組( 'verify_peer_name'=>假, 'allow_self_signed'=>真),
接受的答案的作品,但僅在非WSDL模式。如果您嘗試在WSDL模式下使用它(即將WSDL文件url作爲第一個參數傳遞),則您將面臨下載WSDL文件時忽略流上下文的事實。因此,如果WSDL文件也位於具有損壞的證書的服務器上,則它將失敗,最有可能丟出消息failed to load external entity
。查看更多here和here。
如上所述,最簡單的方法是手動下載WSDL文件並將本地副本傳遞給SoapClient。你可以用file_get_contents
下載它,使用與接受的答案完全相同的流上下文。
請注意,您在創建SoapServer時也必須執行此操作。
我試過PHP7中接受的答案,它在WSDL模式下工作。所以也許現在這個問題已經解決了。 –
我真的很感興趣,如果這個想法與stream_context_create()確實爲你工作。如果您必須更改某些內容,請告訴我們,以便其他人也可以利用此功能。 – Kaii
我也有興趣,如果建議的解決方案工作 –