阿里云轻量级应用服务器CentOS系统Apache配置Https

记录一下给Hexo博客配置https域名过程中踩的各种坑。

1、申请证书

SSL的证书基本可以分为申请的和自己创建的,阿里云上面有免费的可以申请,本着多一事不如少一事的原则(其实是太菜了),果断选择阿里云的SSL证书申请。

▼点击SSL证书(应用安全)

▼选择免费的那个。

▼填写一些申请的信息。

▼然后需要进行信息验证,一般都是DNS验证,如果是在阿里云购买的域名,会自动添加DNS解析验证,其他的就需要到域名管理里面手动添加了。

▼提交成功之后耐心等待一下,很快就会申请通过。

2、安装Apache和openssl

2.1 安装Apache

由于是在apache服务器上面搭建的博客,所以我的服务器已经安装好了apache,输入下列命令可以查看apache的版本信息。

1
2
httpd -v
# 输入该命令查看apache的版本信息

如果没有安装apache的话,可以选择手动下载安装包安装或者是使用yum进行安装,不同的安装方式生成的文件目录会有一些不太一样,这对后面的SSL证书配置有着很大的影响。

1
2
yum install httpd
# 使用yum安装apache,这样安装的httpd的默认目录是在/etc/httpd文件夹里面

接着再安装一些必要的工具和扩展

1
yum -y install gcc* make* apr apr-util pcre apr-devel apr-util-devel  pcre-devel
1
yum -y install httpd-manual mod_ssl mod_perl mod_auth_mysql

2.2 安装openssl

接着是使用yum安装openssl模块。如果有特殊需求的,可以到官网下载openssl自行编译,在这里只需要使用yum进行安装即可。

1
yum install openssl openssl-devel

查看openssl版本

1
openssl version -a

确认安装好apache和openssl之后,我们进入下一步。

3、上传证书到服务器

阿里云那边的证书申请好之后,我们下载证书到自己的电脑里面,解压可以得到类似这样子的三个文件。

图中的是默认的名字,改不改都可以,不要搞混了就行,接下来我们把它们上传到服务器中的apache的安装目录下面,给他们专门新建一个cert文件夹。

首先我们在服务器中给他新建一个目录

1
mkdir /etc/httpd/cert

然后把本机的证书上传到服务器,我们可以直接使用scp命令上传文件,也可以使用Xshell中的Xftp来传输,还有其他的各种方式也都可以,反正传上去了就行。

我这里使用scp命令为例:

1
2
3
4
# scp命令的最基本用法是:
scp fileLocation username@hostIP: DestinationLocation
# 以在桌面传送一个文件到/etc/httpd/cert目录为例(此时我是在桌面直接打开gitbash)
scp 1692315_tiny777.com.key root@47.107.188.168:/etc/httpd/cert

4、开启443端口

https默认是使用443端口进行监听,虽然阿里云默认是开启了443端口的,但是为了保险起见,我们还是确认一下。

点开阿里云的控制台,点击轻量级应用服务器。如下图所示:

5、配置ssl

5.1 启用ssl模块支持

这里就是比较坑的地方了,阿里云的帮助文档说的可能是别的方式安装的apache服务器,和我的情况不太一样。但是思路却还是正确的。

这两步,第一步的主要作用是开启apache的ssl模块支持,第二步则是Include代码ssl的配置文件使其生效。

使用yum安装的apache有一些不太一样,相对应的配置文件都在/etc/httpd/conf.modules.d这个目录下面,我们接下来主要会用到的就是这个00-ssl.conf00-base.conf文件。

打开00-ssl.conf就能看到对应阿里云教程里面的第一步操作,启用ssl模块支持。

接下来我们在/etc/httpd/conf/httpd.conf这个文件里面,可以找到这一行(在56行左右的位置)

1
Include conf.modules.d/*.conf

这一行代码的意思就是Include了整个conf.modules.d文件夹里面的所有conf后缀的文件,这个00-ssl.conf文件当然也不例外。

5.2 配置ssl

完成上面的两步操作之后,我们就要配置ssl的配置文件了。我们再看阿里云的文档。

1
2
3
4
5
6
7
8
9
10
11
# 添加 SSL 协议支持协议,去掉不安全的协议
SSLProtocol all -SSLv2 -SSLv3
# 修改加密套件如下
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
# 证书公钥配置
SSLCertificateFile cert/a_public.crt
# 证书私钥配置
SSLCertificateKeyFile cert/a.key
# 证书链配置,如果该属性开头有 '#'字符,请删除掉
SSLCertificateChainFile cert/a_chain.crt

还是一样的问题,路径不太正确,我们这里找到的文件路径是/etc/httpd/conf.d/ssl.conf

在更改配置文件之前,为了保险起见,咱们先备份一下,以备不时之需。

1
cp ssl.conf ssl.conf.bak

这里再给出我自己的ssl.conf文件和大家交流一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Listen 443
<VirtualHost *:443>

DocumentRoot "/var/www/html"
ServerName tiny777.com
ServerAlias www.tiny777.com


SSLEngine on

SSLProtocol all -SSLv2 -SSLv3

SSLCertificateFile /etc/httpd/cert/1692315_tiny777.com_public.crt

SSLCertificateKeyFile /etc/httpd/cert/1692315_tiny777.com.key

SSLCertificateChainFile /etc/httpd/cert/1692315_tiny777.com_chain.crt

DirectoryIndex index.html index.htm index.php
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>

理论上这个时候重启apache服务已经可以输入https加上我们的域名来开启https访问了,但是这个时候的https和http相互独立,默认是访问http的域名,我们需要开启http域名自动跳转到https域名。

5.3 自动跳转到https

保险起见,我们坚持一下自动跳转需要用到的rewrite模块是否开启了,还是在之前说的/etc/httpd/conf.d/00-base.conf文件里面查找一下rewrite模块,确定已经启用。

1
LoadModule rewrite_module modules/mod_rewrite.so

接下来我们定位到这个目录

1
cd /etc/httpd/conf

更改httpd.conf文件,在最后面加入这几行代码:

1
2
3
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]

最后我们重启apache服务,就能开启域名的https访问了。

1
systemctl restart httpd.service

最终效果如下: