介绍
TLS,或运输层安全,及其前身 SSL,即安全接口层,是用于在受保护的加密包装中包装正常流量的Web协议。
使用这种技术,服务器可以安全地在服务器和客户端之间发送流量,而无需外部人员拦截消息的可能性,证书系统还帮助用户验证他们正在连接的网站的身份。
在本指南中,您将设置一个自签名的SSL证书,用于在CentOS 7服务器上使用Apache Web 服务器。
注意:**一个自签证书会加密服务器和任何客户端之间的通信,但是,由于它没有被包含在网页浏览器中的任何一个受信任的证书机构签署,用户无法使用该证书自动验证服务器的身份。
由于这种限制,自签证证书不适合为公众服务的生产环境,通常用于测试,或者用于确保单个用户或小组用户使用的非关键服务,这些服务可以通过替代通信渠道建立信任证书的有效性。
对于一个更为生产准备的证书解决方案,请查看 Let’s Encrypt,一个免费的证书授权机构. 你可以学习如何下载和配置一个 Let’s Encrypt 证书在你的 设置 Apache 使用 Let’s Encrypt 证书在 CentOS 7教程。
前提条件
在您开始使用本指南之前,有几个步骤必须先完成。
- 联合国 您需要访问带有) 运行来创建此账户 。
- 联合国 您还需要按照 CentOS 7 教程( https://andsky.com/tech/tutorials/how-to-install-the-apache-web-server-on-centos-7# step-1-installing-apache) 步骤1 中描述的安装 Apache 。 .
完成这些步骤后,您可以通过SSH作为非根用户帐户登录,并继续进行教程。
第1步:安装mod_ssl
为了设置自签证书,您必须首先确保在服务器上安装了支持SSL加密的Apache模块mod_ssl。
1sudo yum install mod_ssl
该模块将在安装过程中自动启用,Apache在重新启动后就可以开始使用SSL证书。
第2步:创建新证书
现在Apache已经准备好使用加密,您可以继续生成新的SSL证书。TLS/SSL通过使用公共证书和私钥的组合工作。SSL密钥在服务器上保密。它用于加密向客户发送的内容。SSL证书与任何要求内容的人公开共享。它可以用来解密由相关SSL密钥签署的内容。
可以用来保留公共证书的 /etc/ssl/certs
目录应该已经存在于服务器上。 您还需要创建一个 /etc/ssl/private
目录,以保留私钥文件。
1sudo mkdir /etc/ssl/private
2sudo chmod 700 /etc/ssl/private
现在,您可以通过键入单个命令创建一个自签名的密钥和证书对,使用OpenSSL:
1sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
您将被问到一系列问题. 在谈到这一点之前,让我们看看命令中发生了什么:
*开放 : 这是创建和管理OpenSSL证书,密钥等文件的基本命令行工具. *req : 此子命令指定您想要使用 X. 509 证书签名请求( CSR) 管理 。 "X.509"是SSL和TLS为其密钥和证书管理所遵循的公钥基础设施标准. 您想要创建一个新的 X. 509 证书, 因此您正在使用此子命令 。
- 联合国 ** -x509 :这进一步修改了上一个子命令,方法是告诉用户您想要制作一个自签名的证书,而不是像通常那样生成证书签名请求. *-节点 :这告诉 OpenSSL 跳过选项,以密码句保护您的证书. 您需要 Apache 才能在服务器启动时读取文件, 而无需用户干预 。 密码句可以防止这种情况发生,因为每次重启后你都必须输入密码. *天数 365 :此选项设定证书被视为有效的时间长度。 你在这里安排了一年 *-新ersa:2048 : 在此指定您想要同时生成新证书和新密钥 。 您没有在前一个步骤中创建签名证书所需的密钥, 因此您需要随证书一起创建 。 `rsa:2048'部分要求它制作长为2048比特的RSA密钥。 *- keyout :此行告诉 OpenSSL 将您正在创建的生成的私有密钥文件放在哪里 。
- 联合国 ** 退出 : 这告诉 OpenSSL 您正在创建的证书在哪里 。 .
如上所述,这些选项将创建一个密钥文件和证书,您将被问到一些关于您的服务器的问题,以便正确嵌入证书中的信息。
按适当的方式填写提示。
<$>[注] 注: 当您被要求常用名称(如服务器FQDN或您的名称)
时,重要的是输入您的域名或服务器的公共IP地址。
整个提示将看起来像这样的东西:
1[secondary_label Output]
2Country Name (2 letter code) [XX]:US
3State or Province Name (full name) []:Example
4Locality Name (eg, city) [Default City]:Example
5Organization Name (eg, company) [Default Company Ltd]:Example Inc
6Organizational Unit Name (eg, section) []:Example Dept
7Common Name (eg, your name or your server's hostname) []:your_domain_or_ip
8Email Address []:[email protected]
您创建的两个文件都将放置在 /etc/ssl
目录的相应子目录中。
当你使用OpenSSL时,你还应该创建一个强大的Diffie-Hellman组,用于与客户端谈判 完美向前保密。
您可以通过键入这样做:
1sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
这可能需要几分钟,但一旦完成,您将有一个强大的DH组在/etc/ssl/certs/dhparam.pem
,您可以在您的配置中使用。
步骤3 - 设置证书
您现在拥有完成界面所需的所有组件,接下来要做的是设置虚拟主机以显示新证书。
在 /etc/httpd/conf.d
目录中打开新文件:
1sudo vi /etc/httpd/conf.d/your_domain_or_ip.conf
插入以下最小 VirtualHost 配置:
1[label /etc/httpd/conf.d/your_domain_or_ip.conf]
2<VirtualHost *:443>
3 ServerName your_domain_or_ip
4 DocumentRoot /var/www/html
5 SSLEngine on
6 SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
7 SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
8</VirtualHost>
请确保更新服务器名称
行,以便您打算地址您的服务器. 它可以是主机名称,全域名称或IP地址. 确保您选择的任何东西都匹配您在制作证书时选择的通用名称
。
设置安全的 SSL 参数
接下来,您将添加一些额外的SSL选项,这将增加您的网站的安全性。 您将使用的选项是从 Cipherlist.eu的建议。 本网站旨在为流行的软件提供易于使用的加密设置。
<$>[注] 注: 在 Cipherlist.eu的默认建议设置提供强大的安全性。有时,这会以更大的客户端兼容性为代价。如果您需要支持较旧的客户端,有一个替代列表,可以通过点击标签的链接访问是的,给我一个与传统 / 旧软件一起工作的ciphersuite
。
您可以使用兼容性列表,而不是上述配置中的默认建议,在两个评论块之间。
您可能想要修改的配置有几个部分,首先,您可以将您偏好的 DNS 解析器添加到解析器
指令中,但如果您有其他偏好,您可以更改此指南。
最后,你应该花一会儿阅读在 HTTP 严格运输安全,或 HSTS,特别是关于 [). 重新加载 HSTS 提供了增加的安全性,但如果意外启用或不正确启用,可能会有深远的后果。 在本指南中,你不会提前加载设置,但如果你确定了解后果,你可以更改。
您将做的其他更改是删除+TLSv1.3
并评论SSLSessionTickets
和SSLOpenSSLConfCmd
指令,因为这些指令在带有CentOS 7的Apache版本中不可用。
在VirtualHost
块结束后插入网站的设置:
1[label /etc/httpd/conf.d/your_domain_or_ip.conf]
2
3 . . .
4</VirtualHost>
5. . .
6
7# Begin copied text
8# from https://cipherli.st/
9
10SSLCipherSuite EECDH+AESGCM:EDH+AESGCM
11# Requires Apache 2.4.36 & OpenSSL 1.1.1
12SSLProtocol -all +TLSv1.2
13# SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1
14# Older versions
15# SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
16SSLHonorCipherOrder On
17# Disable preloading HSTS for now. You can use the commented out header line that includes
18# the "preload" directive if you understand the implications.
19#Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
20Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains"
21# Requires Apache >= 2.4
22SSLCompression off
23SSLUseStapling on
24SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
25# Requires Apache >= 2.4.11
26# SSLSessionTickets Off
完成这些更改后,您可以保存和关闭文件。
创建从 HTTP 到 HTTPS 的重定向(可选)
目前,服务器将提供未加密的 HTTP 和加密的 HTTPS 流量. 为了更好的安全性,建议在大多数情况下自动将 HTTP 重定向到 HTTPS. 如果您不想要或需要此功能,您可以安全地跳过本节。
要将所有流量重定向到 SSL 加密,请在 /etc/httpd/conf.d 目录中创建并打开一个以
.conf 结束的文件:
1sudo vi /etc/httpd/conf.d/non-ssl.conf
内部,创建一个VirtualHost
块来匹配端口上的请求80。内部,使用ServerName
指令再次匹配您的域名或IP地址。然后,使用Redirect
来匹配任何请求,并将其发送到SSLVirtualHost
。
1[label /etc/httpd/conf.d/non-ssl.conf]
2<VirtualHost *:80>
3 ServerName your_domain_or_ip
4 Redirect "/" "https://your_domain_or_ip/"
5</VirtualHost>
保存并关闭此文件,当你完成。
步骤 4 — 应用 Apache 配置更改
到目前为止,您已经创建了一个SSL证书,并配置了您的Web服务器将其应用于您的网站. 为了应用所有这些更改,并开始使用您的SSL加密,您可以重新启动Apache服务器来重新加载其配置和模块。
首先,通过键入检查配置文件的语法错误:
1sudo apachectl configtest
只要输出以Syntax OK
结束,你可以安全地继续. 如果这不是你的输出的一部分,请检查你的文件的语法,然后再试一次:
1[secondary_label Output]
2. . .
3Syntax OK
重新启动 Apache 服务器以通过键入应用您的更改:
1sudo systemctl restart httpd.service
接下来,请确保 80 和 443 端口在您的防火墙中打开,如果您没有运行防火墙,您可以跳过。
如果你有一个运行的防火墙
,你可以通过键入打开这些端口:
1sudo firewall-cmd --add-service=http
2sudo firewall-cmd --add-service=https
3sudo firewall-cmd --runtime-to-permanent
如果你有一个运行的iptables
防火墙,你需要执行的命令取决于你当前的规则集。
1sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
2sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT
步骤5:测试加密
现在,您已经准备好测试您的SSL服务器了。
打开您的网页浏览器,然后输入https://
,然后输入您的服务器的域名或IP地址栏:
1https://your_domain_or_ip
由于您创建的证书不是由您的浏览器的可信证书机构之一签署的,您可能会看到一个可怕的警告,如下面的警告:
您只对您的证书的加密方面感兴趣,而不是第三方验证您的主机的真实性。 点击ADVANCED
,然后提供的链接可以继续到您的主机:
您应该被带到您的网站. 如果您在浏览器地址栏中查看,您会看到某些部分安全的迹象。这可能是上面有一个x
的锁或一个有呼声点的三角形。在这种情况下,这只是意味着证书无法验证。它仍然加密您的连接。
如果您将Apache配置为将HTTP请求重定向到HTTPS,您还可以检查重定向功能是否正确:
1http://your_domain_or_ip
如果这导致相同的图标,这意味着您的重定向工作正确。
结论
您已经配置了 Apache 服务器来处理 HTTP 和 HTTPS 请求,这将有助于您安全地与客户端通信,并避免外部人员能够读取您的流量。
如果您计划在公共网站上使用SSL,您可能应该从可信的证书机构购买SSL证书,以防止给每个访问者显示可怕的警告。