2011-12-09 73 views
46

摘要:
有沒有辦法強制PHP中的內置SoapClient類通過HTTPS連接到具有無效證書的服務器?禁用PHP中的證書驗證SoapClient

爲什麼我要這麼做?
我在沒有DNS條目或證書的服務器上部署了新的應用程序。我想嘗試使用SoapClient 連接到它,然後設置DNS條目並修復證書,最合理的方法似乎是在測試期間讓客戶端忽略證書。

難道我沒有意識到這是一個巨大的安全風險嗎?
這僅用於測試。當服務投入生產時,將會有一個有效的證書,客戶將被迫驗證它。

+1

我真的很感興趣,如果這個想法與stream_context_create()確實爲你工作。如果您必須更改某些內容,請告訴我們,以便其他人也可以利用此功能。 – Kaii

+0

我也有興趣,如果建議的解決方案工作 –

回答

72

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 
]); 

文檔:

+1

不幸的是,這似乎並沒有工作,並且verify_peer選項已經默認爲false(http://php.net/manual/en/context.ssl.php)。 – zpon

+1

@zpon:這通常有效。檢出您沒有使用具有不同選項的不同SSL子圖層。再仔細檢查一下你是否遇到一個PHP bug,看到一個相關的問題:[Php SoapClient stream_context選項](http:// stackoverflow。com/questions/9909232/php-soapclient-stream-context-option) – hakre

+2

'allow_self_signed'怎麼設置爲'true'?默認爲'false' –

2

正確的列表爲PHP 5.6。 8 is

'SSL'=>數組( 'verify_peer_name'=>假, 'allow_self_signed'=>真),

10

接受的答案的作品,但僅在非WSDL模式。如果您嘗試在WSDL模式下使用它(即將WSDL文件url作爲第一個參數傳遞),則您將面臨下載WSDL文件時忽略流上下文的事實。因此,如果WSDL文件也位於具有損壞的證書的服務器上,則它將失敗,最有可能丟出消息failed to load external entity。查看更多herehere

如上所述,最簡單的方法是手動下載WSDL文件並將本地副本傳遞給SoapClient。你可以用file_get_contents下載它,使用與接受的答案完全相同的流上下文。

請注意,您在創建SoapServer時也必須執行此操作。

+3

我試過PHP7中接受的答案,它在WSDL模式下工作。所以也許現在這個問題已經解決了。 –