给网站配置上HTTPS加密访问(Centos7+Apache+SSL证书)

叙话

今天给一个网站配置了ssl证书,过程中踩到很多坑,前前后后耗时6个小时才查明问题,在此记录下,以作后续参考。

准备

已有网站 http://www.example.com,给其配置ssl证书,使得访问 https://www.example.com。

SSL证书申请

SSL证书申请方式,网上有很多免费的个人证书直接申请。也可自己使用工具手动生成,但会产生 “未授权访问被拒绝,或者安全性设置已到期 / :ERR_CERT_AUTHORITY_INVALID ”,不建议使用。

一般申请到的证书,会给你三个文件。先将以上文件全部上传到服务器。

上传到任何目录均可,不限制,可按照文中来,后续修改

*.cer   上传到 /etc/pki/tls/certs/目录   文件名:www.explame.com.cer

*.crt    上传到 /etc/pki/tls/certs/ 目录 www.explame.com.crt

*.key   上传到/etc/pki/tls/private/目录 www.explame.com.key

很失败的,我第一个坑踩到了证书文件上,后面讲下具体原由。

编译安装mod_ssl.so

之前的环境是yum安装的httpd方式,编译安装的请搜索编译安装mod_ssl.so方法。

yum安装方式:

yum install mod_ssl

安装完毕后,默认会给你生成一堆配置及mod_ssl.so 且已加载。

/etc/httpd/conf.d/ssl.conf SSL默认配置文件

网上很多教程都会教你在当前这个默认文件里修改配置使用,其实这个文件完全可以不用修改的,忽略他,在你本身存在的网站配置上修改也一样起效。这个坑,很多人容易踩。

增加配置

原本配置

<VirtualHost *:80>
    ServerName default
    DocumentRoot "/var/WEB/default/wwwroot"
    ServerAlias www.example.com www.local116.com
    ErrorLog "/var/WEB/default/log/error.log"
    CustomLog "/var/WEB/default/log/access.log" common
</VirtualHost>

追加配置

<VirtualHost *:443>
    ServerName www.example.com:443
    DocumentRoot "/var/WEB/default/wwwroot"
    ServerAlias www.example.com www.local116.com 
    ErrorLog "/var/WEB/default/log/error.log"
    CustomLog "/var/WEB/default/log/access.log" common
    SSLEngine on
    SSLCertificateFile "/etc/pki/tls/certs/www.example.com.crt"
    SSLCertificateKeyFile "/etc/pki/tls/private/www.example.com.key"
</VirtualHost>


###详解配置###
<VirtualHost *:443>  主要是443的匹配作用,决定该网站接收端口


ServerName www.example.com:443 域名后面的:443 可有可无

ServerAlias 这里配置的所有域名都将可以使用https访问,前提是证书支持这些域名

SSLEngine on 开启SSL
SSLCertificateFile 配置证书文件
SSLCertificateKeyFile 配置证书秘钥文件

配置追加完毕后,重启httpd(很重要)。

方式一:

httpd -k stop

httpd -k start (无错误及其他任何信息提示,以为是启动成功了,访问网页发现是决绝访问,查看进程之后发现httpd根本没有启动)

方式二:

systemctl restart httpd.service 

查看错误发现基本是找不到什么具体错误的

经过反反复复测试,改删配置才搞清出问题。

CRT - CRT应该是certificate的三个字母,其实还是证书的意思,常见于*NIX系统,有可能是PEM编码,也有可能是DER编码,大多数应该是PEM编码,相信你已经知道怎么辨别.

CER - 还是certificate,还是证书,常见于Windows系统,同样的,可能是PEM编码,也可能是DER编码,大多数应该是DER编码.

KEY - 通常用来存放一个公钥或者私钥,并非X.509证书,编码同样的,可能是PEM,也可能是DER.

因为当前使用的centos(LINUX系),使用的证书并不是.crt还是csr。

意识到配置中的证书文件选择错了,将其修改过来。

<VirtualHost *:443>
    ServerName www.example.com:443
    DocumentRoot "/var/WEB/default/wwwroot"
    ServerAlias www.example.com www.local116.com 
    ErrorLog "/var/WEB/default/log/error.log"
    CustomLog "/var/WEB/default/log/access.log" common
    SSLEngine on
    SSLCertificateFile "/etc/pki/tls/certs/www.example.com.csr" #此处修改为csr文件
    SSLCertificateKeyFile "/etc/pki/tls/private/www.example.com.key"
</VirtualHost>

再次重新启动httpd

systemctl restart httpd.service

此次终于启动成功,还有很多问题,譬如配置证书,http可以访问,https无法访问文件(404)大多都是因为证书引起的,必须确认访问的域名配置的域名以及申请证书的域名是一致的。

443端口监听失败

注意,默认ssl.conf里面已经配置监听443端口的操作。不能再httpd.conf或者其他虚拟主机.conf里面增加监听,否则也会引起无法启动httpd。

ssl.conf

Listen 443 https

遇到一些用户说,将apache httpd升级到2.4之后需要修改这个配置。

Listen 127.0.0.1:443 https

给其增加IP绑定,我测试发现并不是必须的,ssl.conf是不需要改一个字符的。

当前版本: Apache/2.4.6 (CentOS)

如果遇到问题,可以尝试修改此处,测试是否得以解决。

查看相关日志

systemctl status httpd.service -l

tail /var/log/messages

如果发现是关于443的问题,检查后台是否有其他程序监听443。

netstat -nao|grep 443

或者检查所有被httpd引入的文件是否出现多个监听端口(Listen 443),如有修改后一般问题则解决。

可以使用httpd -S 查看当前httpd加载的文件配置,逐个进行排查。

总结

检查以下问题,保证无误,基本能解决问题。

  1. 证书申请的域名以及证书的文件无误
  2. 不同服务器加载的证书文件不同,根据不同服务器选择不同证书文件,且文件位置存在该文件。
  3. 保证所有被httpd加载的配置文件不能包含多个监听同一端口指令。如:Listen 443
  4. 保证无其他程序占用443及80等自行监听的虚拟主机端口。netstat 检测
  5. 网页无法显示完整,查看网页源码发现,如网页中出现http链接,由于https安全机制限制,则需要将其链接更改为https即可,如:https://example.com,另外可更改使用 //example.com,将自动识别当前协议,自动加载。

本文引用:

那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等) 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算

安装和配置Drupal 8

Drupal 8是流行的Drupal内容管理系统的最新版本。本指南演示了如何在运行Debian或Ubuntu的Linode上安装Drupal 8。

2652
来自专栏闻道于事

前后端分离之JWT用户认证(转)

在前后端分离开发时为什么需要用户认证呢?原因是由于HTTP协定是不储存状态的(stateless),这意味着当我们透过帐号密码验证一个使用者时,当下一个requ...

1981
来自专栏技术博文

ssh(安全外壳协议)

SSH 为Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础...

32211
来自专栏WindCoder

JSON Web Token(JWT)教程:一个基于Laravel和AngularJS的例子

这是一篇介绍JSON Web Token(JWT)的文章,虽然可能用到的例子和Laravel和AngularJS有关,但知道了原理便能写出适用于自己的。同时,由...

3511
来自专栏小夜博客

LNMP环境配置SSL证书最简单教程

99713
来自专栏技术博文

ssh password and passphrase

ssh password and passphrase 1、ssh-keygen -t rsa     采用默认路径,输入passphrase。  2、scp ...

3996
来自专栏阮一峰的网络日志

HTTPS 升级指南

上一篇文章我介绍了 HTTP/2 协议 ,它只有在 HTTPS 环境才会生效。 为了升级到 HTTP/2 协议,必须先启用 HTTPS。如果你不了解 HTTPS...

3355
来自专栏我就是马云飞

RxJava2 实战(1) - 后台执行耗时操作,实时通知 UI 更新

最近刚好也在学习rxjava2,So,一起学习咯。 前言 接触RxJava2已经很久了,也看了网上的很多文章,发现基本都是在对RxJava的基本思想介绍之后,再...

4388
来自专栏散尽浮华

Pupet自动化管理环境部署记录

废话不多说了,下面记录下Puppet在Centos下的部署过程: puppet是什么 puppet是一种基于ruby语言开发的Lnux、Unix、windows...

2236
来自专栏耕耘实录

Linux环境中,GitHub的配置使用极简教程

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

1131

扫码关注云+社区

领取腾讯云代金券