2011-09-16 92 views
1

我有以下設置:使用php_curl轉發SSL客戶端證書

有2臺服務器需要SSL客戶端證書。 證書用於身份驗證。

用戶(使用他的瀏覽器)將使用他的客戶端證書向Server1發出請求。 到目前爲止,這麼好。 現在,我想要做的事情: Server1將向Server2發出請求,解析該響應並將其返回給用戶。

Server1使用php_curl執行請求。 我希望Server1將(用戶的)原始客戶端證書傳遞給Server2(它將驗證用戶,..)。 Server1然後發佈'代表'該用戶。

這可能嗎?

Apache已啓用ExportCertData SSLOption。 我已經嘗試下面的標題添加到捲曲選項(搞清楚這是大致相同的Apache代理設置與客戶端證書):

$headers[] = "SSL_CLIENT_S_DN: ".$_SERVER['SSL_CLIENT_S_DN']; 
$headers[] = "SSL_CLIENT_I_DN: ".$_SERVER['SSL_CLIENT_I_DN']; 
$headers[] = "SSL_SERVER_S_DN_OU: ".$_SERVER['SSL_SERVER_S_DN_OU']; 
$headers[] = "SSL_CLIENT_VERIFY: ".$_SERVER['SSL_CLIENT_VERIFY']; 
$headers[] = "SSL_CLIENT_V_START: ".$_SERVER['SSL_CLIENT_V_START']; 
$headers[] = "SSL_CLIENT_V_END: ".$_SERVER['SSL_CLIENT_V_END']; 
$headers[] = "SSL_CLIENT_M_VERSION: ".$_SERVER['SSL_CLIENT_M_VERSION']; 
$headers[] = "SSL_CLIENT_M_SERIAL: ".$_SERVER['SSL_CLIENT_M_SERIAL']; 
$headers[] = "SSL_CLIENT_CERT: ".$_SERVER['SSL_CLIENT_CERT']; 
$headers[] = "SSL_CLIENT_VERIFY: ".$_SERVER['SSL_CLIENT_VERIFY']; 
$headers[] = "SSL_SERVER_M_VERSION: ".$_SERVER['SSL_SERVER_M_VERSION']; 
$headers[] = "SSL_SERVER_I_DN: ".$_SERVER['SSL_SERVER_I_DN']; 
$headers[] = "SSL_SERVER_CERT: ".$_SERVER['SSL_SERVER_CERT']; 

,但與那些沒有運氣。

+1

IIRC SSL是端到端的,你不能代理它。 – hakre

+0

Apache可以在SSL連接上進行代理。另外,我可以設置新的SSL連接,只需使用相同的證書,或者這是不可能的?我不太想要代理請求,我正在做另一個請求,只是具有相同的證書。 – kclement

+2

客戶端證書?然後他們不會再按預期工作了。您應該嘗試在中間人攻擊客戶端連接以使其更透明。 – hakre

回答

2

您無法將原始客戶端證書的請求傳遞給您,除非您擁有包含密鑰等證書。這就是SSL的工作原理。

如果您運行的是兩臺服務器,則可以在Server1上驗證客戶端證書,並通過自定義標頭或您認爲最適合的方式在Server2上傳遞驗證信息。

如果您對第二臺服務器沒有責任,那麼對您來說沒有任何好運,因爲簡化MITM攻擊並不是SSL創造者的意圖之一。

+0

這是我的備份解決方案。我知道它是有效的,但我更願意根據他的SSL證書進行用戶身份驗證,而不是另一個(即使它是受信任的)服務器將用戶的CN作爲字符串參數進行綁定。我瞭解主要的中間層攻擊危險,但Apache代理也存在同樣的問題,不是嗎? – kclement

+0

當然,你可以通過* undecrypted *請求,比如Apache mod_proxy。但我在這找不到任何特別的目的。 – sanmai