我有一个Nginx和不同的子域:
a.mydomain.com
b.mydomain.com
c.mydomain.com
Nginx有4条规则:
1)重写规则:
server {
listen 80
server_name gl.udesk.org;
root /nowhere;
rewrite ^ https://a.mydomain.com$request_uri permanent;
}
2)https规则:
server {
listen 443;
server_name a.mydomain.com;
root /home/a/a/public;
ssl on;
ssl_certificate conf.d/ssl/a.crt;
ssl_certificate_key conf.d/ssl/a.key;
ssl_protocols ...
ssl_ciphers ...
ssl_prefer_server_ciphers on;
location ...
}
3)http默认规则:
server {
listen 80 default_server;
return 444;
}
4)https默认规则:
server {
listen 443 default_server;
return 444;
}
因此,如果我启动nginx并:
- 如果我在浏览器中转到http://a.mydomain.com,它将重定向到 https://a.mydomain.com,然后返回错误107(net :: ERR_SSL_PROTOCOL_ERROR):SSL协议错误。
- 如果我在浏览器中转到https://b.mydomain.com,则希望它返回错误444。但相反,它返回相同的错误107(net :: ERR_SSL_PROTOCOL_ERROR):SSL协议错误。
- 因此,对于所有由DNS提供商CNAME注册的域名(即a,b,c)
- 所有http版本(例如规则3-)均按预期工作:
- http://a.mydomain.com重定向到https://版本,
- http://b.mydomain.com和http://c.mydomain.com返回配置错误444。
那么,为什么nginx中的https规则配置起来如此棘手,我应该如何对其进行正确配置以使其获得与http版本相同的行为?
更新:
创建一个新证书并添加:
ssl on;
ssl_certificate conf.d/ssl/default.crt;
ssl_certificate_key conf.d/ssl/default.key;
现在可以使用,但是我可以找到不需要任何SSL证书的解决方案。只需重置除https://a.mydomain.com 以外的所有https(端口443)子域的所有连接,而无需提供证书。
2
你不能 SSL必须先获得证书,然后Web服务器才能知道所需的域。它必须具有要发送的证书,否则就无法建立与客户端进行通信的连接。
—
Darth Android
@DarthAndroid:魔术被称为SNI - en.wikipedia.org/wiki/Server_Name_Indication。
—
施
@Shi我知道SNI的-这使得web服务器来接它发证书,但它仍然必须选择一个证书。
—
Darth Android
nginx
还不够聪明,无法意识到用户不需要做什么证书。