2011-09-16 93 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