CentOS 7环境下Apache服务器443端口SSL连接报错如何解决?
报错原因
你遇到的SSL报错核心原因是443端口上运行的仍然是普通HTTP协议的服务,没有启用HTTPS/SSL能力,客户端发起SSL握手请求后,收到的是普通HTTP响应,无法完成SSL协议解析,才会抛出SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol错误。具体可拆解为3个配置缺失:
- 未安装启用Apache的SSL模块
mod_ssl,Apache本身不具备处理HTTPS请求的能力 - 仅修改了虚拟主机的监听端口为443,没有添加SSL引擎开启、证书配置等HTTPS必填参数
- 直接将
Listen 80改为Listen 443,本质是让Apache用HTTP协议监听443端口,而非HTTPS协议
解决步骤
- 安装SSL模块
首先安装Apache的SSL扩展模块,安装完成后会自动生成默认SSL配置文件,无需手动加载模块:
sudo yum install mod_ssl -y
安装完成后打开/etc/httpd/conf/httpd.conf,删除你之前手动修改的Listen 443配置,避免和mod_ssl自带的端口监听规则冲突。
- 准备SSL证书
如果是测试环境可以直接生成自签名证书,生产环境建议使用权威CA签发的证书:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/pki/tls/private/apache.key -out /etc/pki/tls/certs/apache.crt
执行命令后按照提示填写相关信息即可。
- 完善虚拟主机配置
修改你的443端口虚拟主机配置,补充SSL相关参数,完整示例如下:
<VirtualHost *:443> # 开启SSL引擎 SSLEngine on # 配置证书和私钥路径 SSLCertificateFile /etc/pki/tls/certs/apache.crt SSLCertificateKeyFile /etc/pki/tls/private/apache.key # 保留你原来的虚拟主机配置 ServerName my_dns DocumentRoot /你的站点根目录路径 <Directory /你的站点根目录路径> AllowOverride All Require all granted </Directory> </VirtualHost>
- 开放防火墙端口
你之前未配置firewalld,需要放行HTTPS默认的443端口:
sudo firewall-cmd --add-service=https --permanent sudo firewall-cmd --reload
- 验证配置并重启服务
先检查Apache配置语法是否正确:
sudo apachectl configtest
返回Syntax OK后重启服务生效:
sudo systemctl restart httpd
- 验证HTTPS访问
如果使用自签名证书,访问时需要添加跳过证书校验的参数:
wget https://my_dns --no-check-certificate
内容的提问来源于stack exchange,提问作者Tristan Tran
相关产品推荐
相关产品推荐

