1

我有以下设置:

有 2 台服务器需要 SSL 客户端证书。该证书用于身份验证。

用户(使用他的浏览器)将使用他的客户端证书向 Server1 发出请求。到目前为止,一切都很好。现在,我想做的是:Server1 将向 Server2 发出请求,解析该响应,并将其返回给用户。

Server1 使用 php_curl 执行请求。我希望 Server1 将(用户的)原始客户端证书传递给 Server2(它将验证用户,..)。Server1 然后“代表”用户发布。

这可能吗?

Apache 启用了 ExportCertData SSLOption。我已经尝试将以下标头添加到 curl 选项(认为这与使用客户端证书的 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'];

但没有运气。

4

1 回答 1

2

除非您手头有带有密钥等的证书,否则您无法使用原始客户端证书传递请求。这就是 SSL 的工作原理。

如果您同时运行两台服务器,您可以在 Server1 上验证客户端证书,并通过自定义标头或您认为最适合的任何方式在 Server2 上传递经过验证的信息。

如果您不负责第二台服务器,那么您就没有运气了,因为让 MITM 攻击变得简单并不是 SSL 创建者的意图之一。

于 2011-09-16T10:30:03.313 回答