VPS在CentOS7系统用Apache配置自签名SSL

注意:此文章因为年代久远,内容正确性不能得到保障,更何况当时这玩意儿我也是跟着别的不知道什么教程做的,真的不懂Apache,只懂NGINX。留作个存档当做我好久开始写Blog的记录吧,别读了。

引言

在VPS上搭建WordPress、Seafile的时候,使用http协议明文传输使得信息不安全,但国际认证的SSL又需要购买,为此,我们可以利用Apache创建自签名的SSL证书。

注意:以下建立在已经安装Apache下的VPS前提上。

安装Mod SSL

1
sudo yum install mod_ssl

创建SSL证书

①创建新目录存储秘钥

1
sudo mkdir /etc/ssl/private

②修改权限使得只能被root用户修改

1
sudo chmod 700 /etc/ssl/private

③创建RSA加密的SSL密钥和证书文件OpenSSL(1)

1
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

期间会提示你按照以下格式输入信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
Country Name (2 letter code) [XX]:US

State or Province Name (full name) []:Example

Locality Name (eg, city) [Default City]:Example

Organization Name (eg, company) [Default Company Ltd]:Example Inc

Organizational Unit Name (eg, section) []:Example Dept

Common Name (eg, your name or your server’s hostname) []:example.com

Email Address []:webmaster@example.com

如果你不希望输入某个信息,只需输入“.”那么这一项便会设置为默认设置。

④创建DH组

1
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

⑤将文件附加到自签名证书末尾

1
cat /etc/ssl/certs/dhparam.pem | sudo tee -a /etc/ssl/certs/apache-selfsigned.crt

设置证书

使用root权限在文本编辑器中打开Apache的SSL配置文件:

1
sudo vim /etc/httpd/conf.d/ssl.conf

vim文本编辑器使用方法:

i开始编辑,esc进入末行模式,末行模式下:x保存并退出,:q不保存退出。

也可以使用nano编辑器,即将命令中的vim改成nano

1
sudo nano /etc/httpd/conf.d/ssl.conf

编辑成功后Ctrl+X保存并退出

nano编辑器看起来比vim容易得多。

调整VirtualHost命令

找到以<VirtualHost _default_:443>开头的部分

取消SeverName行并替换www.example.com为您的域名或服务器IP地址

1
2
3
4
5
6
7
\<VirtualHost _default_:443\>

. . .

DocumentRoot “/var/www/example.com/public_html”

ServerName http://www.example.com:443

接下来,找到SSLProtocolSSLCipherSuite行,然后删除它们或将它们注释掉。我们暂时粘贴的配置将提供比CentOS Apache所包含的默认设置更安全的设置:

1
2
3
4
5
6
7
. . .

\# SSLProtocol all -SSLv2

. . .

\# SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA

找到SSLCertificateFileSSLCertificateKeyFile行并将它们更改为我们在/etc/httpd/ssl以下目录中创建的目录:

1
2
3
SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt

SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

我们现在已完成实际VirtualHost块内的更改。下一个更改将发生在</VirtualHost>同一文件中的结束标记之后。

设置安全SSL参数

按照如下方式复制命令参数:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
. . .

</VirtualHost>

. . .



\# Begin copied text

\# from https://cipherli.st/

\# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html



SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH

SSLProtocol All -SSLv2 -SSLv3

SSLHonorCipherOrder On

\# Disable preloading HSTS for now. You can use the commented out header line that includes

\# the “preload” directive if you understand the implications.

\#Header always set Strict-Transport-Security “max-age=63072000; includeSubdomains; preload”

Header always set Strict-Transport-Security “max-age=63072000; includeSubdomains”

Header always set X-Frame-Options DENY

Header always set X-Content-Type-Options nosniff

\# Requires Apache >= 2.4

SSLCompression off

SSLUseStapling on

SSLStaplingCache “shmcb:logs/stapling-cache(150000)”

\# Requires Apache >= 2.4.11

\# SSLSessionTickets Off

全部修改好后保存并关闭。

修改虚机文件以重定向到HTTPS(可选项)

现在,服务器将提供未加密的HTTP和加密的HTTPS流量。为了更好的安全性,建议在大多数情况下自动将HTTP重定向到HTTPS。如果您不想要或不需要此功能,可以安全地跳过本节。

要将所有流量重定向为SSL加密,请创建并打开以目录结尾.conf/etc/httpd/conf.d文件:

1
sudo vi /etc/httpd/conf.d/non-ssl.conf

在内部,创建一个VirtualHost块以匹配端口80上的请求。在内部,使用该ServerName指令再次匹配您的域名或IP地址。然后,使用Redirect匹配任何请求并将它们发送到SSL VirtualHost。确保包含尾部斜杠:

1
2
3
4
5
6
7
<VirtualHost *:80>

ServerName [http://www.example.com](http://www.example.com/)

Redirect “/” “https://www.example.com/&#8221;

</VirtualHost>

完成后保存并关闭此文件。

激活证书

到目前为止,您已创建SSL证书并配置Web服务器以将其应用于您的站点。要应用所有这些更改并开始使用SSL加密,您可以重新启动Apache服务器以重新加载其配置和模块。

首先,键入以下命令检查配置文件中是否存在语法错误

1
sudo apachectl configtest

只要输出结束Syntax OK,您就可以继续使用。如果这不是输出的一部分,请检查文件的语法,然后重试:

1
2
3
4
5
Output

. . .

Syntax OK

键入以下内容,重新启动Apache服务器以应用更改:

1
sudo systemctl restart httpd.service

接下来,确保防火墙中的端口80和443已打开。如果您没有运行防火墙,则可以跳过。

或者之前参照《VPS按照OwnCloud以及SS的实录》安装了OwnCloud,那么代表已经打开了firewalld防火墙,则也可以跳过。

如果您正在运行firewalld防火墙,则可以通过键入以下命令打开这些端口:

1
2
3
4
5
sudo firewall-cmd –add-service=http

sudo firewall-cmd –add-service=https

sudo firewall-cmd –runtime-to-permanent

如果运行iptables防火墙,则需要运行的命令高度依赖于当前的规则集。对于基本规则集,您可以通过键入以下内容来添加HTTP和HTTPS访问:

1
2
3
sudo iptables -I INPUT -p tcp -m tcp –dport 80 -j ACCEPT

sudo iptables -I INPUT -p tcp -m tcp –dport 443 -j ACCEPT

在您的Web浏览器中,尝试访问您的域名或IP https://以查看您的新证书。

写在后面

Web浏览器可能会警告该站点的安全证书不受信任。由于我们创建的证书未由浏览器信任的证书颁发机构签名,因此浏览器无法验证尝试连接的服务器的身份。这是因为我们创建了一个自签名证书而不是受信任的CA签名证书

在浏览器的身份验证中添加例外后,你将被允许进入新安全的站点。

如果你创建的是公共网站而不是自娱自乐的网盘或者博客,那么请向受信任的证书颁发机构购买SSL证书。容易获得的途径之一是腾讯的免费SSL。

在使用自签名证书之前,应该考虑清楚。