我的系统上有多个目录,例如,
/var/www/dir1 /var/www/dir2 /var/www/dir3
我想要做的是为每个目录生成一个服务器/客户端 SSL 证书,然后设置每个目录,使客户端证书必须与服务器证书匹配才能访问该目录。现在,如果有人拥有 /var/www/dir2 的客户端证书并尝试访问 /var/www/dir1,他们将无法访问,因为这些目录使用不同的证书。这些目录中的每一个都托管在同一个域上(即 domain.com/dir1、domain.com/dir2)。
现在,我遇到的问题是我不完全确定如何在 Apache 中实现这一点。 (另外,我并不真正关心 domain.com 是否需要 SSL,但我希望目录需要它。)
答案1
我对此的理解是错误的。我生成了一个服务器证书,然后为每个客户端生成一个客户端证书。我创建了 /etc/httpd/clients 目录,并在该目录中为每个客户端存储了一个文件,如下所示:
<Directory /var/www/html/test.com>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
SSLVerifyClient require
SSLVerifyDepth 5
SSLOptions +FakeBasicAuth
SSLRequireSSL
SSLRequire %{SSL_CLIENT_S_DN_CN} eq "test.com"
</Directory>
每个客户端现在都有自己的 SSL 客户端证书,可以使用它来访问 Web 服务器上的给定目录。
答案2
SSL 证书与域名相关联,但由于 SSL 的工作方式,每个 IP 地址只能拥有一个证书。这是因为 SSL 握手要求提供证书前将域名传递给 Web 服务器。因此,Web 服务器无法为每个目录或域名应用不同的证书。您也无法购买或创建证书!
您能做的最好的事情是为 dir1.example.com dir2.example.com 等创建不同的证书,然后使用 Apache 的 URL 重写将 www.example.com/dir1 重定向到 dir1.example.com。但这必须是重定向,否则证书将无法工作。