我有几台服务器在同一台机器上运行,有些只使用 http,有些同时使用 http 和 https。在单独的文件中定义了几个服务器块,这些文件包含在主配置文件中。
我已经为 http 设置了一个“默认”服务器,它将为与其他配置文件中的任何其他 server_names 不匹配的请求提供通用的“维护页面”。http 默认服务器按预期工作,它使用 server_name "_" 并且它首先出现在包含列表中(因为我观察到在跨服务器重复 server_names 的情况下,使用第一个出现的)。这很好用。
我希望完全相同的服务器块(仅将“listen 80 default_server”切换为“listen 443 default_server”,而不是服务页面“return 444”),但事实并非如此。相反,看起来新的默认 https 服务器实际上是在获取所有传入的 https 连接并导致它们失败,尽管其他服务器块对传入请求有更合适的 server_names。删除新的默认 https 服务器将导致恢复半正确行为:带有 https 的网站将全部正确加载;但是没有 https 的网站都将被路由到包含文件中的第一个 https 服务器(根据文档,如果没有出现“default_server”,那么出现的第一个服务器块将是“default”)。
所以我的问题是,在 nginx 中为 ssl 连接定义“默认服务器”的正确方法是什么?为什么当我显式设置“default_server”时,它会变得贪婪并获取所有连接,而当我隐式让 nginx 决定“默认服务器”时,它会像我期望的那样工作(将不正确的服务器设置为默认值,而其他真实服务器)行为正确)?
这是我的“默认服务器”。Http 可以在不破坏其他服务器的情况下工作。Https 破坏其他服务器并消耗所有服务器。
server {
listen 443 ssl default_server;
server_name _;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
return 444;
}
server {
listen *:80 default_server;
server_name _;
charset utf-8;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
root /home/path/to/templates;
location / { …Run Code Online (Sandbox Code Playgroud) 我有以下配置:
SSLEngine on
SSLCertificateFile /etc/httpd/conf/login.domain.com.crt
SSLCertificateKeyFile /etc/httpd/conf/login.domain.com.key
SSLCipherSuite ALL:-ADH:+HIGH:+MEDIUM:-LOW:-SSLv2:-EXP
Run Code Online (Sandbox Code Playgroud)
但我不知道如何生成.crt和.key文件。
我有一个 HAProxy / stunnel 服务器,可以为我们在 AWS 上的站点处理 SSL。在测试期间,我在这台服务器上创建了一个自签名证书,并使用 Chrome 从我的桌面点击它来测试 stunnel 是否正常工作。
现在我已经在该服务器上安装了合法证书。当我在 Chrome 中从我的机器访问该站点时,它会引发以下错误:
错误 113 (net::ERR_SSL_VERSION_OR_CIPHER_MISMATCH):未知错误。
我的猜测是 Chrome 缓存了自签名证书的密钥,它与合法证书的密钥不匹配。该站点适用于我机器上的所有其他浏览器,因此这只是 Chrome 的问题。
一个有趣的注意事项:从隐身会话 ( Ctrl+ Shift+ N) 中点击页面时,它可以正常工作。所以它显然是某种缓存的东西。
我做了我能想到的所有事情(转储我的缓存,从“管理证书”对话框的“个人和其他人”页面中删除证书,Ctrl+F5等)。
我的机器是 Windows 7 x64。Chrome 版本:12.0.742.91。
在 Google Chrome 帮助表单上,有关于听起来像是同一个问题的描述;然而,没有找到解决办法。
更新:今天似乎已经“自我修复”了。我讨厌这样的问题。我仍然不知道是什么导致了它或它是如何自行解决的。大概是缓存的证书过期了或者什么的,但我仍然有兴趣知道这些信息的存储位置以及如何验证它。
如果您在负载均衡器(例如 haproxy)后面有 5 个 Web 服务器,并且它们为同一个域提供内容,那么您是否需要所有服务器的 SSL 证书,还是可以在每台服务器上使用相同的证书?
我知道您可以将所有 SSL 请求放在特定服务器上,但这需要分布式会话信息,并希望它不会出现。
我正在创建一个 websocket 服务器,它将在ws.mysite.example. 我希望网络套接字服务器既是 SSL 加密的又domain.example是 SSL 加密的。我是否需要为我创建的每个子域购买新证书?我创建的每个子域都需要一个专用 IP 地址吗?我可能会拥有多个子域。
我正在使用在 Ubuntu 上运行的 NGINX 和 Gunicorn。
在 Ubuntu 上,用于签署证书(供 nginx 使用)的私钥的最佳位置似乎在 /etc/ssl/private/
这个答案补充说证书应该进入,/etc/ssl/certs/但这似乎是一个不安全的地方。做.crt文件需要保持安全或者他们认为公众?
我想在 nginx 中创建一个规则来做两件事:
有很多关于如何单独执行这些操作的示例,但我无法找到一个正确执行这两项操作的解决方案(即不创建重定向循环并正确处理所有情况)。
它需要处理所有这些情况:
1. http://www.example.com/path
2. https://www.example.com/path
3. http://example.com/path
4. https://example.com/path
Run Code Online (Sandbox Code Playgroud)
这些都应该在https://example.com/path (#4) 结束而不循环。有任何想法吗?
从 Chrome 58 开始,它不再接受依赖于Common Name以下内容的自签名证书:https : //productforums.google.com/forum/#! topic/chrome/zVo3M8CgKzQ;context-place = topicsearchin/chrome/category $3ACanary%7Csort:相关性%7Cspell:false
相反,它需要使用Subject Alt Name. 我之前一直在关注有关如何生成自签名证书的指南:https : //devcenter.heroku.com/articles/ssl-certificate-self,它工作得很好,因为我需要server.crt和server.key文件来完成我正在做的事情。我现在需要生成新的证书,其中包括SAN我所有的尝试都没有在 Chrome 58 上工作。
这是我所做的:
我按照上面提到的 Heroku 文章中的步骤来生成密钥。然后我写了一个新的 OpenSSL 配置文件:
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = san
extensions = san
[ req_distinguished_name ]
countryName = US
stateOrProvinceName = Massachusetts
localityName = Boston
organizationName = MyCompany
[ san ]
subjectAltName = DNS:dev.mycompany.com
Run Code Online (Sandbox Code Playgroud)
然后server.crt使用以下命令生成:
openssl req …Run Code Online (Sandbox Code Playgroud) 我知道不能再使用 SHA-1 对 SSL 证书进行签名。然而,所有 CA 根证书都是 SHA-1 签名的(大部分)。这是否意味着不再受“你奶奶 SSL 商店”信任的相同算法适用于世界上最顶级的安全证书?
我错过了什么吗?(密钥用法?密钥大小?)
我想通过非 SSL 站点代理来自 SSL 站点的请求。我的 Apache httpd.conf 如下所示:
<VirtualHost 1.2.3.4:80>
ServerName foo.com
ProxyPass / https://bar.com/
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
因此,当我访问http://foo.com 时,我希望 apache 向https://bar.com发出请求并将其获取的页面发送给我。
相反,我收到了 500 错误,在错误日志中,我看到:
[error] proxy: HTTPS: failed to enable ssl support for 4.3.2.1:443 (bar.com)
Run Code Online (Sandbox Code Playgroud)
大概我在这里遗漏了一个指令。可能是哪个?
别介意安全隐患。我完全理解其中的风险。