将服务从 http
变为 https
,需要进行 ssl
证书的配置。需要完成一下步骤:
- 获取
ssl
证书 - 安装
ssl
证书 - 配置 nginx 支持
https
- 重启 nginx
http
到https
的重定向(可选)
1. 获取 ssl 证书(自签名证书)
对于 ssl/tls
证书,一般来说,它们是基于 域名 进行颁发的,而不是 ip地址。这是因为 ssl/tls
证书是用来验证服务器身份和提供一个安全的连接通道的,它们需要关联到一个被认可的域名以确保服务器的真实性。
如果你没有 域名,但是你的应用又需要使用 https
,那么以下几种方式或许可以考虑:
- 购买一个域名:
域名现在相当便宜,你可以购买一个,并将其解析到你的 ip 地址。 - 自签名证书:
可以创建自己的自签名证书。但是,用户的浏览器会显示一个警告,提示他们证书不受信任。这可能不适合面向公众的应用程序,但对于测试或内部使用的服务来说,这是一个可行的选择。 - 使用 cloudflare
cloudflare 是一个内容分发网络(cdn)和 dns 提供商,它提供免费的ssl
证书,即使你没有域名也可以使用。但是,这需要将你的流量通过他们的网络,可能并不适合所有应用。
1.1. 安装 openssl
// 更新 apt-get 下载源节点 sudo apt-get update // 查看当前 apt-get 下载源节点里 libssl-dev 可下载安装的所有版本和默认的最合适的版本 sudo apt-cache policy libssl-dev // 下载并默认安装 libssl-dev(默认的版本) sudo apt-get install libssl-dev // 如果要指定安装某个版本 //sudo apt-get install libssl-dev=版本号
1.2. 自签名证书
使用 openssl 工具来创建自己的自签名证书
- 生成私钥
打开命令行,然后输入以下命令来生成一个新的 rsa 私钥:openssl genrsa -out server.key 2048
,将在当前目录下生成一个名为server.key
的 2048 位私钥文件。 - 生成证书签名请求(csr)
使用此命令生成 csr(certificate signing request):openssl req -new -key server.key -out server.csr
,会提示输入很多东西,一直按 enter 即可 - 生成自签名证书
最后,使用以下命令生成自签名证书:openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
,这将生成一个有效期为一年的自签名证书 server.crt。
1.3. 尝试在 flask 应用中使用
from flask import flask app = flask(__name__) @app.route("/") def index(): return "hello world" if __name__ == "__main__": app.run(ssl_context=('server.crt', 'server.key'), host='0.0.0.0', port=8080) #app.run(host='0.0.0.0', port=8080)
这样,flask 服务器就会在 https
上运行了。但是,请注意,因为使用的是自签名证书,所以浏览器将警告用户这个连接不安全(因为证书不是由受信任的证书颁发机构签署的)。对于公开服务,应该考虑获得一个由公认的 ca 签署的证书。
直接在 flask 中使用 ssl 证书的示意图:
2. 安装 ssl 证书
将上面生成的 ssl 证书文件放置到位于 /etc/nginx/ssl/
目录中。确保已经拥有了服务器私钥(server.key
)和证书文件(server.crt
或 server.crt
)。
3. 配置 nginx 支持 https
3.1. 打开 nginx 配置文件
nginx 的配置文件通常位于 /etc/nginx/ 目录下,具体取决于你的系统和 nginx 安装方式。大部分情况下,站点特定的配置在 /etc/nginx/sites-available/ 中。
3.2. 修改或增加一个server块
在 /etc/nginx/sites-available/default 配置文件中,将文件中的内容全部替换为下面的 server 模块(或者新建一个使用 ssl 的 server 块),内容如下:
server { listen 443 ssl; server_name _; # server_name your-domain.com; # 没有域名则直接写一个下划线即可 ssl_certificate /etc/nginx/ssl/server.crt; # 修改为证书路径 ssl_certificate_key /etc/nginx/ssl/server.key; # 修改为私钥路径 location / { proxy_pass http://127.0.0.1:8080; # 修改为 http 服务地址 proxy_set_header host $host; proxy_set_header x-real-ip $remote_addr; } }
- 替换 your-domain.com 为真实的域名,没有域名则直接写一个下划线(_)即可。
- listen 443 ssl 告诉 nginx 在 443 端口上监听 ssl 连接。
- ssl_certificate 和 ssl_certificate_key 指令分别指向你的证书文件和私钥文件的实际路径。
4. 重启 nginx
保存并关闭配置文件,然后运行以下命令来检查新的配置是否有语法错误:
sudo nginx -t
如果这个命令没有报错,就可以安全地重启 nginx:
sudo systemctl restart nginx
nginx 重启成功后,将可以在浏览器上通过 https 访问服务器应用了。由于使用的是自签名证书,用户的浏览器将显示一个警告,提示他们此证书不受信任。这对于测试和开发环境可能没问题,但是如果计划在生产环境中使用 ssl,应该考虑从一个可信的证书颁发机构获取一个证书。
使用 nginx 作为反向代理后,使用 ssl 证书的示意图:
5. http 到 https 的重定向(可选)
如果希望所有的 http 流量都自动跳转到 https,可以在 nginx 配置中添加以下内容:
server { listen 80; server_name your-domain.com; return 301 https://$host$request_uri; }
这段配置会捕获所有到端口 80(http) 的请求,并将它们重定向到相同地址的 https 版本。
到此这篇关于nginx下将http改为https的操作步骤的文章就介绍到这了,更多相关nginx将http改为https内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论