2015-10-15 193 views
3

我的應用程序(PHP)從具有簽名值的OKTA獲取SAML響應,並且我還擁有具有公鑰的OKTA證書。我的應用程序執行以下操作:OKTA SAML簽名驗證 - PHP

  1. 從證書獲取公鑰。
  2. 從發送給它的SAML獲取簽名值。現在,它使用函數openssl_verify($ data,$ signature,$ pubkeykey,「sha1WithRSAEncryption」);由於$ data是OKTA用來簽署saml響應的內容,我不確定需要設置哪些$數據。

我的代碼,

$pubkeyid = openssl_pkey_get_details(openssl_pkey_get_public(file_get_contents("okta.cert"))); 
$pubkeyid = $pubkeyid["key"]; 
$signature = "<get it form SAML Response>"; 
$data = ???? (what should be provided) 
$ok = openssl_verify($data, $signature, $pubkeyid,"sha1WithRSAEncryption"); 

我總是得到0,當我指定數據的值被髮送到應用程序的SAML響應。 我錯過了什麼嗎?

回答

4

SAML簽名驗證遠多於調用openssl_verify()函數。我會建議爲此目的使用一些庫,如https://github.com/lightSAML/lightSAML

在這種情況下,使用LightSAML核心,簽名驗證可以做到像他們的菜譜http://www.lightsaml.com/LightSAML-Core/Cookbook/How-to-verify-signature-of-SAML-message/頁的說明在下面的步驟

  • 反序列化XML數據模型對象 - 在你的情況Response類
  • 從它的證書從他們的元數據
  • 通話validate()方法上響應簽名屬性加載IDP的公共密鑰

請注意,響應的正確處理仍然只是驗證簽名。完整的SAML Web瀏覽器SSO配置文件解決了LightSAML也實施的其他驗證問題。

如果您使用的是Symfony,您可能會檢查LightSAML/SpBundle,因爲它實現了完整的SAML SSO配置文件,並且與Symfony的安全性相集成,使得SAML SSO非常易於實現。

如果您真的想從頭開始做,可以檢查xmlseclibs如何執行此操作,例如在https://github.com/robrichards/xmlseclibs上維護的其中一個叉上。