首页 > 解决方案 > Apache - 仅允许具有特定 SSL 证书的客户端访问(POST)特定端点

问题描述

我有一个用 PHP 编写的应用程序,可以使用 PHP-FPM 和 Apache 堆栈访问。

我希望该应用程序的单个端点(例如POST /create,它是一个 SOAP 服务)仅可用于提供有效且受信任的 SSL 证书的客户端的请求。“受信任”是指指向单个(或多个)证书,而不仅仅是“有效的证书,因为它的 CA 是有效的”。

我已经尝试了多种方法来解决它,但我故意不在这里展示它们以不提出任何建议,这可能只是设计上的错误。

Internet 向我返回了一堆关于如何生成 SSL 证书或如何让客户端使用 SSL 证书进行身份验证的教程,但这次并非如此。

有没有好人可以帮助我?

标签: phpapacheauthenticationsslsoap

解决方案


我到了某个点,我可以称之为解决方案,所以我把它贴在这里。

成功的因素有以下几点:

  1. 至关重要:确保SSLCACertificatePath /etc/ssl/certs为某些虚拟主机(或全局)启用了该功能 - 令人惊讶的评论(Debian Jessie)。
  2. 用于客户端身份验证的证书由官方(众所周知的公共)CA 签名,因此无需将自签名 CA 添加到服务器的 OpenSSL 环境。在其他情况下,上面提到的写得很好的教程将有助于安装自定义 CA 和生成相关的客户端证书。谢谢@YvesLeBorg。
  3. 对于我使用的最终身份验证条件.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仍然无法授权,我不知道为什么......

但在这一点上,我认为问题已在主要部分得到解决。


推荐阅读