首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用运行在Apache2.4上的PHP5.6从SSL_CLIENT_*证书中获取SSL_CLIENT_*变量?

如何使用运行在Apache2.4上的PHP5.6从SSL_CLIENT_*证书中获取SSL_CLIENT_*变量?
EN

Stack Overflow用户
提问于 2017-08-04 21:28:10
回答 2查看 13.5K关注 0票数 1

Introduction

我在我的网站后端使用PHP5.6和Apache2.4,在那里我使用SSL来验证客户端作为进入站点的一种可选形式。我想获得一些包含在证书中但Apache2.4没有显示的SSL_CLIENT_*变量,因此,我不能使用$_SERVER访问它们。

描述

我希望从客户端证书中获得以下环境变量:

  • SSL_CLIENT_S_DN_CN
  • SSL_CLIENT_SAN_OTHER_msUPN_
  • SSL_CLIENT_SAN_Email_

当我在PHP5.6中转储$_SERVER时,我可以看到变量SSL_CLIENT_VERIFY返回的内容。如果它返回GENEROUS,则显示所有三个变量;如果它是SUCCESS,则显示上面列表中的第一个变量SSL_CLIENT_S_DN_CN;如果SSL_CLIENT_VERIFYNONE,则没有客户机提供的证书。

我在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_0SSL_CLIENT_SAN_Email_0

附件

1.我的Apache 2.4 SSL配置文件:

default-ssl.conf

代码语言:javascript
复制
<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

代码语言:javascript
复制
<?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}

EN

回答 2

Stack Overflow用户

发布于 2017-08-05 04:44:21

Apache指令SSLOptions +StdEnvVars将SSL信息作为环境变量传递给Php。有关更多信息,请参见这些链接:

在PHP中使用SSL客户端证书SSLOptions指令

票数 1
EN

Stack Overflow用户

发布于 2017-08-05 04:51:08

如果SSL_CLIENT_VERIFY设置为NONE,则意味着客户端没有发送证书。当然,在这种情况下,无法提供有关客户端证书的信息。

在所有其他情况下,您应该得到SSL_CLIENT_S_DN_CN。只有当客户端证书包含SAN条目时才能获得SSL_CLIENT_SAN_*,也就是说,您看到的差异可能是由于所使用的客户端证书不同所致。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45515750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档