php - Apache - 仅允许具有特定 SSL 证书的客户端访问(POST)特定端点
问题描述
我有一个用 PHP 编写的应用程序,可以使用 PHP-FPM 和 Apache 堆栈访问。
我希望该应用程序的单个端点(例如POST /create
,它是一个 SOAP 服务)仅可用于提供有效且受信任的 SSL 证书的客户端的请求。“受信任”是指指向单个(或多个)证书,而不仅仅是“有效的证书,因为它的 CA 是有效的”。
我已经尝试了多种方法来解决它,但我故意不在这里展示它们以不提出任何建议,这可能只是设计上的错误。
Internet 向我返回了一堆关于如何生成 SSL 证书或如何让客户端使用 SSL 证书进行身份验证的教程,但这次并非如此。
有没有好人可以帮助我?
解决方案
我到了某个点,我可以称之为解决方案,所以我把它贴在这里。
成功的因素有以下几点:
- 至关重要:确保
SSLCACertificatePath /etc/ssl/certs
为某些虚拟主机(或全局)启用了该功能 - 令人惊讶的评论(Debian Jessie)。 - 用于客户端身份验证的证书由官方(众所周知的公共)CA 签名,因此无需将自签名 CA 添加到服务器的 OpenSSL 环境。在其他情况下,上面提到的写得很好的教程将有助于安装自定义 CA 和生成相关的客户端证书。谢谢@YvesLeBorg。
对于我使用的最终身份验证条件
.htaccess
:<IfModule mod_ssl.c> <If "%{REQUEST_URI} == '/create' && %{REQUEST_METHOD} == 'POST'"> SSLVerifyClient require Require expr %{SSL_CLIENT_M_SERIAL} eq '1234567890ABCDEF123456789ABCDEF1' SSLVerifyDepth 2 </If> </IfModule>
正如您所看到的,对某个证书的验证是使用它的序列号进行的(我仍然不确定这是否是验证唯一证书的最佳方法)。
这些步骤使curl
请求工作,但在某些环境中 SoapUI仍然无法授权,我不知道为什么......
但在这一点上,我认为问题已在主要部分得到解决。
推荐阅读
- angular - 无法激活已激活的出口离子
- node.js - 对特定条件有限制的环回查询/查找
- php - 如何制作 php tree optgroup?
- python - 如何使用树莓派检测python中的按键
- javascript - 在冒号上拆分所有表单输入并换行
- php - 如何将真实条件的值分配给laravel中if else条件之外的变量?
- r - 将 NA 转换为特定列的虚拟对象
- python - 为什么我的 Python 包被导入为“命名空间”模块,如何正确导入模块?
- javascript - 如何将两个数组组合成一个可用的 cfquery 或类似的解决方案?
- graphene-python - 在石墨烯 graphql 查询中返回 django 模型属性字段