给网站配置https访问

前言

用户要求给部署网站配置https访问,配置过程中踩了一些坑,现作如下内容整理

正文

配置https访问总体来说需要两步,下面将做具体介绍:

1.生成SSL证书

2.配置nginx

1.生成SSL证书

有多种方式可以取得SSL证书,下面主要介绍两种方式。

(看是否申请好域名,没域名的情况下,可以使用自签名证书)

a.自签名证书(不推荐用于生产环境)

自签名证书可以用于开发或内部测试环境,但不被浏览器信任。

安装 OpenSSL

大多数 Linux 发行版已经预装了 OpenSSL。如果没有安装,可以通过以下命令安装:

bash 复制代码
sudo apt-get update
sudo apt-get install openssl

获取证书

这个命令将生成一个自签名证书和私钥,有效期为 365 天

bash 复制代码
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

证书文件路径

证书文件:/etc/nginx/ssl/nginx.crt

私钥文件:/etc/nginx/ssl/nginx.key


b.使用 Let's Encrypt(推荐)

Let's Encrypt 是一个免费、自动化的证书颁发机构,适合大多数网站。
安装 Certbot

Certbot 是 Let's Encrypt 的官方客户端工具,用于获取和自动配置 SSL 证书。

bash 复制代码
sudo apt-get update
sudo apt-get install certbot

获取证书

使用 Certbot 获取证书。例如,如果你的域名是 example.com,运行以下命令:

bash 复制代码
sudo certbot certonly --webroot -w /var/www/html -d example.com

这里 -w 指定了网站的根目录,-d 指定了域名。

证书文件路径

Let's Encrypt 会将证书文件放在 /etc/letsencrypt/live/your-domain/ 目录下:

证书文件:/etc/letsencrypt/live/your-domain/fullchain.pem

私钥文件:/etc/letsencrypt/live/your-domain/privkey.pem

自动续期

Let's Encrypt 的证书有效期为 90 天,但 Certbot 会自动续期。确保你的系统已配置定时任务:

bash 复制代码
sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer

2. 配置 Nginx 以使用 SSL证书

修改 Nginx 配置文件,使其支持 HTTPS。以下是一个完整的示例配置:

(证书路径根据实际情况配置)

bash 复制代码
# HTTP 重定向到 HTTPS
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name example.com;

    # 将所有 HTTP 请求重定向到 HTTPS
    return 301 https://$host$request_uri;
}
# HTTPS 配置
server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    server_name example.com;   #  example.com 是域名

    # 指定 SSL 证书和密钥文件路径
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;  # 替换为你的证书路径
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;  # 替换为你的密钥路径

    # 主站配置
    location / {
        proxy_pass http://127.0.0.1:8080;  # 代理到后端服务
    }
}

3. 测试和验证配置

在应用配置之前,建议进行以下测试:

检查 Nginx 配置语法

bash 复制代码
sudo nginx -t

如果配置文件没有语法错误,你会看到类似以下的输出:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

重新加载 Nginx

如果配置正确,重新加载 Nginx 服务:

bash 复制代码
sudo systemctl restart nginx

验证 HTTPS

使用浏览器访问 https://example.com,确保网站正常加载,并检查浏览器地址栏是否显示"安全连接"。


常见错误及解决方法

以下是一些常见的 Nginx 配置文件错误及其解决方法:

1. 未知指令

错误示例:

bash 复制代码
nginx: [emerg] unknown directive "some_directive" in /etc/nginx/nginx.conf:42

解决方法:

检查拼写错误,确保指令名称正确。

确保该指令在正确的上下文中使用。例如,某些指令只能在 server 块中使用,而不能在 http 块中使用。

如果你使用的是自定义模块,确保该模块已正确安装并加载。

2. 指令参数错误

错误示例:

bash 复制代码
nginx: [emerg] invalid number of arguments in "some_directive" directive in /etc/nginx/nginx.conf:42

解决方法:

检查指令的参数是否正确。某些指令可能需要特定数量的参数。

参考 Nginx 官方文档,确保指令的使用方式正确。

3. 文件路径错误

错误示例:

bash 复制代码
nginx: [emerg] open() "/etc/nginx/sites-enabled/default" failed (2: No such file or directory) in /etc/nginx/nginx.conf:42

解决方法:

检查文件路径是否正确。确保文件确实存在。

如果文件不存在,创建该文件或修改配置文件中的路径。

4. 权限问题

错误示例:

bash 复制代码
nginx: [emerg] open() "/etc/nginx/ssl/nginx.crt" failed (13: Permission denied) in /etc/nginx/nginx.conf:42

解决方法:

检查文件的权限,确保 Nginx 用户(通常是 www-data 或 nginx)有权限访问该文件。

修改文件权限:

bash 复制代码
sudo chmod 644 /etc/nginx/ssl/nginx.crt
sudo chown www-data:www-data /etc/nginx/ssl/nginx.crt

5.无法加载位于 /etc/nginx/ssl/nginx.crt 的证书文件,因为在该文件中找不到有效的 PEM 格式的证书数据

错误示例:

bash 复制代码
nginx: [emerg] cannot load certificate "/etc/nginx/ssl/nginx.crt": PEM_read_bio_X509_AUX() failed (SSL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)
nginx: configuration file /etc/nginx/nginx.conf test failed

解决方法:

检查证书文件格式,如果文件存在,确保它是以正确的 PEM 格式编写的。

证书文件应该以 -----BEGIN CERTIFICATE----- 开头,并以 -----END CERTIFICATE----- 结尾。可以使用 cat 命令查看文件内容:

bash 复制代码
cat /etc/nginx/ssl/nginx.crt

如果文件内容不正确,你需要修正它或重新生成证书。


注:重新加载或重启 Nginx

修改完成后,再次使用 sudo nginx -t 查看配置语法,如果 sudo nginx -t 显示配置文件语法正确,你可以安全地重新加载或重启 Nginx 服务:

bash 复制代码
sudo systemctl reload nginx

或者

bash 复制代码
sudo systemctl restart nginx
相关推荐
EulerBlind5 分钟前
【MCP】为什么使用Streamable HTTP: 相比SSE的优势与实践指南
网络·网络协议·http
-Camellia007-11 分钟前
HTTP学习
网络协议·学习·http
半青年2 小时前
基于Qt开发的http/https客户端
java·c++·qt·网络协议·http·https·信息与通信
猫头虎3 小时前
极简远程革命:节点小宝 — 无公网IP的极速内网穿透远程解决方案
网络·网络协议·tcp/ip·ai编程·远程工作·内网·穿透
Waitccy4 小时前
HTTP 与 HTTPS 的深度剖析:差异、原理与应用场景
网络协议·http·https·php
ん贤5 小时前
GoWeb开发
开发语言·后端·tcp/ip·http·https·go·goweb
GOATLong5 小时前
Socket 编程 TCP
linux·服务器·开发语言·网络·c++·网络协议·tcp/ip
你好我是小美5 小时前
深入理解 HTTPS:从 TCP 到 HTTP 再到加密传输的完整流程
tcp/ip·http·https
Mr-Apple17 小时前
Decode rpc invocation failed: null -> DecodeableRpcInvocation
网络·网络协议·rpc
IpdataCloud17 小时前
IP 风险画像如何实现对恶意 IP 的有效拦截?
网络·网络协议·tcp/ip