是的,您可以向HTTP服务器发送nginx代理请求,然后自身通过HTTPS响应客户端。执行此操作时,您将要确保,无论谁是预期的攻击者,nginx <-> proxy连接都不会被嗅探到。足够安全的方法可能包括:
- 代理到同一主机(与您一样)
- 代理防火墙后面的其他主机
代理到公共Internet上的另一台主机并不足够安全。
以下是有关使用与代理服务器相同的Web服务器获取Let's Encrypt证书的说明。
从Let's Encrypt请求初始证书
修改您的server
子句以允许.well-known
从本地目录提供子目录,例如:
server {
listen 80;
server_name sub.domain.com www.sub.domain.com;
[…]
location /.well-known {
alias /var/www/sub.domain.com/.well-known;
}
location / {
# proxy commands go here
[…]
}
}
http://sub.domain.com/.well-known
让我们加密服务器将在其中寻找它所遇到的挑战的答案。
然后,您可以使用certbot客户端使用webroot插件(以root用户身份)从Let's Encrypt请求证书:
certbot certonly --webroot -w /var/www/sub.domain.com/ -d sub.domain.com -d www.sub.domain.com
您的密钥,证书和证书链现在将安装在 /etc/letsencrypt/live/sub.domain.com/
配置Nginx以使用您的证书
首先创建一个新的服务器子句,如下所示:
server {
listen 443 ssl;
# if you wish, you can use the below line for listen instead
# which enables HTTP/2
# requires nginx version >= 1.9.5
# listen 443 ssl http2;
server_name sub.domain.com www.sub.domain.com;
ssl_certificate /etc/letsencrypt/live/sub.domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/sub.domain.com/privkey.pem;
# Turn on OCSP stapling as recommended at
# https://community.letsencrypt.org/t/integration-guide/13123
# requires nginx version >= 1.3.7
ssl_stapling on;
ssl_stapling_verify on;
# Uncomment this line only after testing in browsers,
# as it commits you to continuing to serve your site over HTTPS
# in future
# add_header Strict-Transport-Security "max-age=31536000";
access_log /var/log/nginx/sub.log combined;
# maintain the .well-known directory alias for renewals
location /.well-known {
alias /var/www/sub.domain.com/.well-known;
}
location / {
# proxy commands go here as in your port 80 configuration
[…]
}
}
重新加载nginx:
service nginx reload
验证HTTPS现在通过访问工作https://sub.domain.com
,并https://www.sub.domain.com
在您的浏览器(和你特别希望的任何其他浏览器的支持),并检查他们不报告证书错误。
推荐:还可以查看raymii.org:Nginx上的SSL增强安全性,
并在SSL Labs中测试您的配置。
(推荐)将HTTP请求重定向到HTTPS
一旦确认您的网站可以使用该https://
URL 的版本,而不是让某些用户因为访问而不提供不安全的内容http://sub.domain.com
,请将其重定向到该网站的HTTPS版本。
将整个端口80 server
子句替换为:
server {
listen 80;
server_name sub.domain.com www.sub.domain.com;
rewrite ^ https://$host$request_uri? permanent;
}
现在,您还应该在端口443配置中取消注释此行,以使浏览器记住甚至不要尝试该站点的HTTP版本:
add_header Strict-Transport-Security "max-age=31536000";
自动续订您的证书
您可以使用此命令(以root用户身份)来续订certbot已知的所有证书,并使用新证书(与现有证书具有相同的路径)重新加载nginx:
certbot renew --renew-hook "service nginx reload"
certbot仅会尝试更新已过期60天以上的证书,因此非常安全(建议使用!)定期运行此命令(如果可能)自动运行。例如,您可以将以下命令放入/etc/crontab
:
# at 4:47am/pm, renew all Let's Encrypt certificates over 60 days old
47 4,16 * * * root certbot renew --quiet --renew-hook "service nginx reload"
您可以通过试运行来测试续订,它将与Let's Encrypt登台服务器联系以对联系您的域进行真实测试,但不会存储生成的证书:
certbot --dry-run renew
或者,您可以通过以下方法强制进行早期续订:
certbot renew --force-renew --renew-hook "service nginx reload"
注意:您可以根据需要进行多次空运行,但是实际续订要受“ 让我们加密”速率的限制。