这是一个令人恼火的问题,我希望有人能帮助我解决。
首先,我运行自己的 CA,因此我正在做自签名证书;我可以使用 openssl 对它们做任何我需要的事情。
我有一个域名 example.com 和一个运行 nginx 的网络服务器,我正在尝试设置一种情况以便重定向:
http://example.com -> http://www.example.com
和
httpS://example.com -> httpS://www.example.com
我的问题不是让 nginx 在那里做我需要的事情;它确实会做,无论是通过重写还是重定向。目前,我有一个带有 if 重写的单个服务器块,以简化操作(是的,我知道 if 是邪恶的!)。我的问题是 SSL 证书。
如果我为“example.com”生成一个普通的单域证书,我会收到“www.example.com”的证书错误。好的,所以我将为“*.example.com”创建一个通配符!但现在我收到了裸域的证书错误。这对我来说很合理,但如果可能的话,我仍然希望将它们合并为一个证书和一个 nginx 服务器块。因此,我尝试制作一个带有 subjectAltName 的 CSR,其值为“DNS:example.com,DNS:*.example.com”。但这似乎也不起作用:裸域可以工作并重定向,但一旦我刷新,我就会收到一个奇怪的证书错误,提示“该证书仅对 example.com 有效”,而经检查,CN 是针对“*.example.com”的。
有人可以提供一些建议,如何解决这个问题,并尽可能简单地创建这套完整的重定向吗?
是的,我知道我可以忽略https://example.com总共只监听 www.example.com 上的 SSL,但是我内心的完美主义者不允许这样做;我希望这个网站的所有内容都与 SSL 完全无关,无论有没有 SSL 都能以完全相同的方式工作,即使是这个初始重定向!
编辑:nginx 配置:
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
root /var/www/example.com;
index index.html index.htm;
server_name www.example.com example.com;
ssl_certificate /etc/ssl/sites/example.com.crt;
ssl_certificate_key /etc/ssl/sites/example.com.key;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
ssl_prefer_server_ciphers on;
if ($http_host != "www*") {
rewrite ^ $scheme://www.$http_host$request_uri permanent;
}
location / {
try_files $uri $uri/ /index.html;
}
}
答案1
您正在寻找的 X.509 功能称为主题备用名称(或 SAN)。
你可以在这里读更多关于它的内容:http://en.wikipedia.org/wiki/SubjectAltName
您可以在此处阅读有关使用此属性生成证书的信息:https://library.linode.com/security/ssl-certificates/subject-alternate-names
以下是 nginx 和 SAN 证书的配置指南:http://blog.simplytestable.com/using-a-multiple-domain-ucc-secure-certificate-with-nginx/