商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 系统应用 > Linux服务器如何配置SSL证书 Nginx/Apache开启HTTPS全过程【教程】

Linux服务器如何配置SSL证书 Nginx/Apache开启HTTPS全过程【教程】

  发布于2026-05-21 阅读(0)

扫一扫,手机访问

服务器配置HTTPS,听起来就是改几行配置的事,但真动起手来,不少人都会卡在几个意想不到的地方。服务启动失败、配置测试通过但页面打不开、浏览器提示“不安全”…… 这些问题背后,往往不是配置语法写错了,而是几个关键的“依赖项”没到位。

说到底,HTTPS配置失败的核心原因可以归结为三点:Web服务器本身的SSL模块是否就绪、证书文件的路径和权限是否正确、以及从HTTP到HTTPS的跳转逻辑是否形成了闭环。下面,我们就按照实际排查问题的顺序,把这几个“坑”一个个填平。

Linux服务器如何配置SSL证书 Nginx/Apache开启HTTPS全过程【教程】

第一步:确认SSL模块已就位

这是最基础,也最容易被忽略的一步。没装SSL模块就去配置HTTPS,就像没装方向盘就去开车——系统根本不会响应你的指令。

Nginx:检查编译参数

Nginx对SSL的支持是通过编译时加入 --with-http_ssl_module 参数实现的。虽然像Ubuntu的 nginx-full 这类包默认就带了,但如果你用的是CentOS的RPM包或者自己源码编译的,那就得留个心眼。

怎么确认?很简单,运行下面这条命令:

nginx -V 2>&1 | grep -o with-http_ssl_module

如果终端有 with-http_ssl_module 的输出,恭喜你,模块是存在的。如果什么都没返回,那就意味着当前的Nginx根本不支持SSL。这时候,你光用 apt install nginx-fullyum install nginx 重装是没用的,这并不会自动补上模块。唯一的办法是重新编译:

./configure --with-http_ssl_module && make && cp objs/nginx /usr/sbin/nginx

一个小提示:nginx -v(小写v)只显示版本号,想看完整的编译参数,必须用 nginx -V(大写V)。

Apache:动态启用模块

Apache的机制不同,它通过动态加载模块来支持SSL。所以,光在配置里写 SSLEngine on 是没用的,必须确保 ssl 模块已经被启用。否则,apache2ctl configtest 可能检查不出问题,但重启服务时就会静默失败,日志里只会留下一句含糊的 Failed to start The Apache HTTP Server

启用模块的命令很简单:

a2enmod ssl rewrite

这里把 rewrite 模块也一并启用了,因为后续做HTTP到HTTPS的自动跳转时会用到它。

另外,别忘了检查 /etc/apache2/ports.conf 这个文件,确保里面有一行 Listen 443。如果没有这行,Apache根本不会监听443端口,后面的虚拟主机配置得再漂亮也是白搭。

第二步:处理好证书与配置

模块就位后,接下来就是证书和核心配置了。这里最容易出错的,是路径、权限和配置块的结构。

证书路径与权限:别用相对路径

无论是Nginx还是Apache,在配置文件里指定证书和私钥时,必须使用绝对路径。写相对路径是新手常犯的错误,会导致服务找不到文件。

以Apache为例:

SSLCertificateFile /etc/ssl/certs/example.com.crt
SSLCertificateKeyFile /etc/ssl/private/example.com.key

权限问题同样关键。证书文件(.crt或.pem)的属主应该是 root:root,权限设置为 644 或更严格即可。而私钥文件(.key)的权限必须是 600,确保只有所有者能读取,这是基本的安全要求。

配置块必须独立且清晰

一个常见的误区是试图在同一个配置块里同时处理HTTP(80端口)和HTTPS(443端口)的流量。这通常会导致服务启动报错。

对于Nginx,HTTPS必须拥有自己独立的 server 块:

server {
    listen 443 ssl http2; # 独立监听443端口
    server_name example.com;
    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/private.key;
    # ... 其他配置
}

server {
    listen 80; # 独立的HTTP块,只负责跳转
    server_name example.com;
    return 301 https://$host$request_uri;
}

对于Apache,逻辑类似,HTTPS配置必须放在独立的 块中:


    ServerName example.com
    # 这里只做跳转,不要出现任何SSL指令
    RewriteEngine On
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]



    ServerName example.com
    SSLEngine on
    SSLCertificateFile /path/to/certificate.crt
    SSLCertificateKeyFile /path/to/private.key
    # ... 其他配置

关于证书链:确保浏览器不报“不安全”的关键在于提供完整的证书链。对于Nginx,通常需要将域名证书和中间证书合并到一个.pem文件中,然后指定给 ssl_certificate。对于新版Apache,直接将包含完整证书链的文件路径赋给 SSLCertificateFile 即可。

第三步:打通网络与系统关卡

配置全都写对了,服务也显示运行正常,但用浏览器访问 https:// 就是打不开?问题很可能出在更底层的网络或安全策略上。

1. 防火墙与安全组

这是云服务器用户最容易踩的坑。阿里云、腾讯云等厂商的“安全组”规则,相当于云平台层面的防火墙,默认很可能不放行443端口。

  • 服务器:务必登录云厂商的控制台,找到你的实例对应的安全组,添加入方向规则,允许TCP协议的443端口。
  • 本地防火墙
    • Ubuntu/Debian: sudo ufw allow 443/tcp
    • CentOS/RHEL/Fedora: sudo firewall-cmd --permanent --add-port=443/tcp && sudo firewall-cmd --reload

2. SELinux(主要针对RHEL/CentOS)

如果服务器启用了SELinux,即使所有路径和权限看起来都对,Web服务进程也可能被禁止读取证书文件或连接网络端口。日志里可能会出现 Permission denied 的错误。

可以尝试临时放宽策略来测试:

  • Apache: sudo setsebool -P httpd_can_network_connect 1
  • Nginx: sudo setsebool -P nginx_can_network_connect 1

说到底,HTTPS配置的难点往往不在于语法本身,而在于模块、权限、端口这些“看不见的依赖”。一个良好的习惯是,每次修改配置后,都按顺序做以下检查:先用 nginx -tapache2ctl configtest 验证配置语法;然后用 systemctl restart 重启服务并立刻用 systemctl status 查看运行状态;最后再用浏览器或 curl 命令实际测试访问。别只相信配置重载成功的那句提示,多看一眼状态和日志,能省下大量排查的时间。

本文转载于:https://www.php.cn/faq/2450951.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注