通过ProxyPass将SSLVerifyClient标头转发到Docker apache实例

时间:2019-04-03 09:28:04

标签: apache docker-container proxypass ssl-client-authentication

您好Stackoverflowrians!

我有一台安装了apache2的Ubuntu 18.04服务器,该服务器托管我的生产服务器,并且我已经创建了一个具有相同配置的Docker容器来开发和测试我的WebApp。

在生产服务器中,我正在使用客户端证书来授权对我的API的访问,并且工作正常。但是在我的开发服务器中,我无法在我的PHP代码中获得客户端证书$ _SERVER标头(SSL_CLIENT_VERIFY等),并且在ProxyPass之后,它似乎忘记了原始标头。

我在两个实例上都设置了apache虚拟主机,而生产服务器上的apache只是从端口443到docker端口8080的ProxyPass-ses。在docker实例中,再次通过apache VirtualHost查找DocumentRoot。

在两个实例上都启用了所有必需的apache模块。

这是我的生产apache VirtualHost配置

<VirtualHost *:443>
ServerName dev.mywebapp.com

ProxyPass "/" "http://dev.mywebapp.com:8080/"
ProxyPassReverse "/" "http://dev.mywebapp.com:8080/"

#Server Certificate for HTTPS
SSLCertificateFile /etc/letsencrypt/live/dev.mywebapp.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/dev.mywebapp.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

#Client Certificate 
SSLCACertificateFile /etc/ssl/local-cert.crt
SSLVerifyClient optional
SSLVerifyDepth 10
SSLOptions +StdEnvVars
</VirtualHost>

这是我的docker实例上的VirtualHost

<VirtualHost *:80>
    ServerName dev.mywebapp.com
    ServerAdmin pdo@agrointelli.com
    DocumentRoot /var/www/html/mywebapp/public_html
</VirtualHost>

在我的API.php中,我使用if语句来验证发送客户端证书

if (!isset($_SERVER['SSL_CLIENT_M_SERIAL'])
    || !isset($_SERVER['SSL_CLIENT_V_END'])
    || !isset($_SERVER['SSL_CLIENT_VERIFY'])
    || $_SERVER['SSL_CLIENT_VERIFY'] !== 'SUCCESS'
    || !isset($_SERVER['SSL_CLIENT_I_DN'])
   ) {
    $this->output->set_status_header(403);
    echo json_encode(array('response'=>'error','message'=>"Certificate is not provided!"));
}

我尝试将VirtualHost Config ProxyPreserveHost On Header Set

添加到生产服务器中

我也尝试在开发服务器中设置SSLVerifyClient,但没有成功。

我找到了其他选项,但是开发docker容器中的$ _SERVER没有我需要的所有SSL_CLIENT_ *标头。我该怎么做才能转发它们?看来生产服务器实际上已经在验证客户端证书,但是在代理之后,docker实例不知道该证书。

0 个答案:

没有答案