给网站配置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
相关推荐
帽儿山的枪手7 小时前
程序员必掌握docker六种网络模式
网络协议·docker·容器
小码本码10 小时前
TCP/IP协议的三次握手和四次挥手
网络·网络协议·tcp/ip
皮卡兔子屋11 小时前
TCP传输---计算机网络
网络协议·tcp/ip·计算机网络
慢德11 小时前
HTTP长连接与短连接的前世今生
网络·https
JhonKI13 小时前
【从零实现Json-Rpc框架】- 入门准备篇
网络协议·rpc·json
开开心心就好13 小时前
高效PDF翻译解决方案:多引擎支持+格式零丢失
android·java·网络协议·tcp/ip·macos·智能手机·pdf
网络安全天地14 小时前
Wireshark网络抓包分析使用详解
websocket·网络协议·tcp/ip·http·网络安全·https·udp
凭君语未可14 小时前
详解TCP的三次握手
网络·网络协议·tcp/ip
智联视频超融合平台17 小时前
解锁应急管理新境界:AR眼镜与指挥平台的完美融合
物联网·网络协议·安全·ar·音视频·视频编解码