我正在尝试让 apache 将客户个人证书的各个部分公开给 php,包括(最重要的)“alt subject name”字段。当我在浏览器中检查证书时,我可以看到此值,但默认情况下 Apache 不会公开此值(主要是 CN/DN)。
运行 LAMPP 1.7.1
有任何想法吗?
答案1
PEM 编码的证书可在环境变量中供您的 PHP 应用程序使用
$SSL_CLIENT_CERT
您可以使用 PHP openssl 函数来解析此信息,它会返回一个证书密钥和值的关联数组。我假设其中一个是您的替代名称。
https://www.php.net/manual/en/function.openssl-x509-parse.php
它将需要修改你的 PHP 应用程序,但并不可怕:
- 检查环境变量是否存在
- 解码证书
- 检查代表 alt 名称的键是否存在
- 将与该键关联的值分配给应用程序其余部分可以使用的其他变量
我认为,可以轻松地将其打包成一个函数,并将其包含在多个应用程序中。
答案2
我花了一段时间才解决这个问题,而且信息相当分散,所以我这样做是为了让...
首先确保您的 Apache 具有以下设置:
SSLOptions +ExportCertData
否则 $_SERVER["SSL_CLIENT_CERT"] 将为空白。
一旦您验证了 $_SERVER["SSL_CLIENT_CERT"] 有内容,然后使用:
$clicertarray = openssl_x509_parse($_SERVER["SSL_CLIENT_CERT"]);
将证书解析为数组,然后您将能够使用以下命令提取主题备用名称:
$clicertarray["extensions"]["subjectAltName"];
答案3
使用var_dump($_ENV)并查找以 SSL_ 开头的变量
另外,检查SSL选项来自 apache 的手册。标准环境变量和出口证书数据看起来不错。如果第一个没有帮助,也许你需要解析通过出口证书数据