您好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实例不知道该证书。