Introduction
我在我的网站后端使用PHP5.6和Apache2.4,在那里我使用SSL来验证客户端作为进入站点的一种可选形式。我想获得一些包含在证书中但Apache2.4没有显示的SSL_CLIENT_*变量,因此,我不能使用$_SERVER访问它们。
描述
我希望从客户端证书中获得以下环境变量:
当我在PHP5.6中转储$_SERVER时,我可以看到变量SSL_CLIENT_VERIFY返回的内容。如果它返回GENEROUS,则显示所有三个变量;如果它是SUCCESS,则显示上面列表中的第一个变量SSL_CLIENT_S_DN_CN;如果SSL_CLIENT_VERIFY是NONE,则没有客户机提供的证书。
我在Windows 10 (Apache2.4和PHP7.0)上本地使用了XAMPPv3.2.2,我可以访问所有变量,但不知何故,我无法使用运行Apache2.4和PHP5.6的远程Debian 9服务器进行访问。
我试图设置SSLRequire (根据docs-mod_ssl被取消推荐)选项和Require,但没有成功。
我求助于StackOverflow和ServerFault搜索类似的问题,涉及SSL证书,但我遇到的所有问题都涉及SSL基本配置( HTTPS、Proxy等)。并使用现有的环境变量(如以这种方式工作的SSLRequire )创建标题,这是我通过阅读文档所理解的。
在default-ssl.conf中,我尝试使用变量设置标头,但当我执行以下操作时:
print_r(getallheaders());
PHP5.6返回NULL
Array ( [...] [SSL_CLIENT_SAN_OTHER_msUPN_0] => (null) [SSL_CLIENT_SAN_Email_0] => (null) )
问题还是如何从客户端证书中获取变量SSL_CLIENT_SAN_OTHER_msUPN_0和SSL_CLIENT_SAN_Email_0。
附件
1.我的Apache 2.4 SSL配置文件:
default-ssl.conf
<VirtualHost *:443>
ServerName myserver.name #Omitted
RequestHeader set SSL_CLIENT_SAN_OTHER_msUPN_0 "%{SSL_CLIENT_SAN_OTHER_msUPN_0}s"
RequestHeader set SSL_CLIENT_SAN_Email_0 "%{SSL_CLIENT_SAN_Email_0}s"
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Configuracoes de cache
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Note "Cache desabilitado no servidor/host"
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# Configuracao do SSL
SSLEngine on
# [...] Certificados AC e certificados da aplicacao: OMITTED
SSLOptions +StdEnvVars +OptRenegotiate -StrictRequire +FakeBasicAuth -ExportCertData
# Solicita certificado SSL/TLS do cliente
SSLVerifyClient optional_no_ca
SSLVerifyDepth 3
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +OptRenegotiate -ExportCertData -StrictRequire +FakeBasicAuth +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>2. PHP 5.6文件
index.php
<?php //index.php
// Get client certificate data
$cn = $_SERVER['SSL_CLIENT_S_DN_CN'];
$email = $_SERVER['SSL_CLIENT_SAN_Email_0'];
$id = $_SERVER['SSL_CLIENT_SAN_OTHER_msUPN_0'];
$client_certificate_data = [
'cn' => $cn,
'email' => $email,
'id' => $id
];
echo json_encode(
$client_certificate_data,
JSON_NUMERIC_CHECK
);// Output: {"cn":"EXAMPLE CN CONTENT HERE","email":null,"id":null}
发布于 2017-08-05 04:44:21
Apache指令SSLOptions +StdEnvVars将SSL信息作为环境变量传递给Php。有关更多信息,请参见这些链接:
在PHP中使用SSL客户端证书和SSLOptions指令
发布于 2017-08-05 04:51:08
如果SSL_CLIENT_VERIFY设置为NONE,则意味着客户端没有发送证书。当然,在这种情况下,无法提供有关客户端证书的信息。
在所有其他情况下,您应该得到SSL_CLIENT_S_DN_CN。只有当客户端证书包含SAN条目时才能获得SSL_CLIENT_SAN_*,也就是说,您看到的差异可能是由于所使用的客户端证书不同所致。
https://stackoverflow.com/questions/45515750
复制相似问题