介绍
TLS或传输层安全,它的前身 SSL,它代表安全套接字层,是Web协议用来包裹在一个受保护,加密封装正常通行。 使用此技术,服务器可以在服务器和客户端之间安全地发送流量,而不会有外部各方拦截消息的可能性。证书系统还帮助用户验证他们正在连接的站点的身份。 在本指南中,我们将向您展示如何设置一个自签名的SSL证书,以便与CentOS 7服务器上的Nginx Web服务器配合使用。 注:自签名证书将在您的服务器和所有客户端之间的通信进行加密。但是,由于它未由Web浏览器中包含的任何受信任的证书颁发机构签名,因此用户无法使用该证书自动验证服务器的身份。 如果您没有与服务器关联的域名,并且对于加密的Web界面不是面向用户的情况,自签名证书可能是适当的。 如果您有一个域名,在很多情况下,最好使用CA签发的证书。 要了解如何建立一个免费的受信任的证书,按照指南上 与在CentOS 7咱们加密证书设置Nginx 。先决条件
首先,你应该有一个配置非root用户sudo
权限。 你可以学习如何按照我们建立这样一个用户帐户
为CentOS 7初始服务器设置 。 当你准备好开始,作为
sudo
用户登录您的服务器。
第1步:安装Nginx并调整防火墙
在我们开始之前,我们应该确保Nginx Web服务器安装在我们的机器上。 虽然Nginx的不是CentOS的默认软件仓库, 它存在于存储库中的EPEL(对于企业版Linux额外的软件包)。我们可以启用EPEL存储库,通过键入以下命令让我们的服务器访问Nginx软件包:sudo yum install epel-release
接下来,我们可以通过键入以下命令来安装Nginx:
sudo yum install nginx
键入以下命令启动Nginx服务:
sudo systemctl start nginx
键入以下内容以检查服务是否已启动并正在运行:
systemctl status nginx
Output● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2017-01-06 17:27:50 UTC; 28s ago
. . .
Jan 06 17:27:50 centos-512mb-nyc3-01 systemd[1]: Started The nginx HTTP and reverse proxy server.
你还需要启用Nginx,所以它在服务器启动时启动:
sudo systemctl enable nginx
OutputCreated symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
接下来,我们需要确保我们不阻止访问端口80和443与防火墙。如果您没有使用防火墙,可以跳到下一部分。 如果你有一个
firewalld防火墙的运行,你可以打开通过键入以下端口:
sudo firewall-cmd --add-service=http
sudo firewall-cmd --add-service=https
sudo firewall-cmd --runtime-to-permanent
如果有一个
iptables防火墙运行,你需要运行的命令是高度依赖于当前的规则集。对于基本规则集,您可以键入以下内容来添加HTTP和HTTPS访问权限:
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浏览器访问默认的Nginx页面。
第2步:创建SSL证书
TLS / SSL通过使用公共证书和私钥的组合工作。 SSL密钥在服务器上保密。它用于加密发送到客户端的内容。 SSL证书与请求内容的任何人公开共享。它可以用于解密由关联的SSL密钥签名的内容。 将/etc/ssl/certs
目录,它可以用来举办公证书,应该已经存在于服务器上。 让我们创建一个
/etc/ssl/private
目录为好,保存私钥文件。由于此密钥的保密性对于安全性至关重要,因此我们将锁定权限以防止未经授权的访问:
sudo mkdir /etc/ssl/private
sudo chmod 700 /etc/ssl/private
现在,我们可以通过在单个命令中使用OpenSSL创建一个自签名密钥和证书对:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
你会被问到一系列的问题。在我们讨论之前,让我们来看看我们发出的命令发生了什么:
- OpenSSL的 :这是用于创建和管理OpenSSL的证书,密钥和其他文件的基本命令行工具。
- REQ:此子命令指定我们要使用X.509证书签名请求(CSR)的管理。 “X.509”是SSL和TLS遵循的用于其密钥和证书管理的公钥基础结构标准。我们要创建一个新的X.509证书,所以我们使用这个子命令。
- -x509:这进一步告诉我们要进行的,而不是生成一个证书签名请求的自签名证书的工具修改以前的子命令,因为通常会发生。
- -nodes:这告诉OpenSSL的跳到使用密码保护我们的证书的选项。我们需要Nginx能够在服务器启动时读取文件,无需用户干预。口令将防止这种情况发生,因为我们必须在每次重新启动后输入。
- -days 365:此选项设置的证书将被视为有效的时间长度。我们在这里设置了一年。
- -newkey RSA:2048:指定我们要生成新的证书,并在同一时间一个新的密钥。 我们没有创建在上一步中签署证书所需的密钥,因此我们需要与证书一起创建。 在
rsa:2048
部分告诉它做的RSA密钥是2048位。 - -keyout:这行告诉OpenSSL的在什么地方,我们正在创建的生成私钥文件。
- -out :这告诉OpenSSL的在什么地方,我们正在创建的证书。
Common Name (eg server FQDN or YOUR name)
。
您需要输入与您的服务器关联的域名或您的服务器的公共IP地址。 整个提示将如下所示:
OutputCountry Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:admin@your_domain.com
两者所创建的文件将被放置在适当的子目录
/etc/ssl
目录。 当我们使用OpenSSL,我们也应该建立一个强大的Diffie-Hellman组,这是在谈判中使用
完全正向保密与客户。 我们可以通过键入:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
这可能需要几分钟,但是当它这样做,你将有一个强大的DH组
/etc/ssl/certs/dhparam.pem
,我们可以在我们的配置中使用。
第3步:配置Nginx使用SSL
CentOS中的默认Nginx配置是非结构化的,默认的HTTP服务器块位于主配置文件中。 Nginx的将检查结尾的文件.conf
在
/etc/nginx/conf.d
额外的配置目录。 我们将在此目录中创建一个新文件,以配置使用我们生成的证书文件提供内容的服务器块。然后,我们可以选择配置默认服务器块,将HTTP请求重定向到HTTPS。
创建TLS / SSL服务器块
创建并打开一个名为ssl.conf
的
/etc/nginx/conf.d
目录:
sudo vi /etc/nginx/conf.d/ssl.conf
在内部,通过打开开始
server
块。 默认情况下,TLS / SSL连接使用端口443,所以应该是我们
listen
端口。 该
server_name
应设置为您生成的证书时使用的通用Nameservers的域名或IP地址。 接下来,使用
ssl_certificate
,
ssl_certificate_key
和
ssl_dhparam
指令设置我们生成的SSL文件的位置:
/etc/nginx/conf.d/ssl.conf
server {
listen 443 http2 ssl;
listen [::]:443 http2 ssl;
server_name server_IP_address;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
}
接下来,我们将添加一些额外的SSL选项,以增加我们网站的安全性。我们将使用的选项与建议
Remy van Elst 的
Cipherli.st网站。 此网站旨在为流行软件提供易于使用的加密设置。 您可以通过阅读了解他对Nginx的选择决定
于nginx的强大的SSL安全 。
注意:默认建议在设置
Cipherli.st提供强有力的安全保障。有时,这是以增加客户端兼容性为代价的。如果您需要支持较旧的客户端,还有一个备用列表,可以通过单击标记为“是,给我一个与旧版软件一起使用的密码集”的链接来访问。 可以使用兼容性列表而不是上述配置中的默认建议在两个注释块之间。选择使用哪个配置很大程度上取决于您需要支持哪些配置。 您可能希望修改一些配置。首先,您可以将您的首选DNS解析器上游请求的
resolver
指令。我们在本指南中使用了Google,但如果您有其他偏好设定,可以变更这项设定。 最后,你应该花点时间读上了
HTTP严格传输安全,或HSTS ,特别是有关
“预紧力”的功能 。预加载HSTS提供了更高的安全性,但如果意外启用或启用不正确,可能会产生深远的影响。在本指南中,我们不会预加载设置,但如果您确信您了解其中的含义,您可以修改。
/etc/nginx/conf.d/ssl.conf
server {
listen 443 http2 ssl;
listen [::]:443 http2 ssl;
server_name server_IP_address;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
########################################################################
# from https://cipherli.st/ #
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html #
########################################################################
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now. You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
##################################
# END https://cipherli.st/ BLOCK #
##################################
}
因为我们使用自签名证书,所以不会使用SSLStapling。 Nginx将简单地输出警告,禁用我们的自签名证书的Stapling,并继续正确操作。 最后,添加您的网站的Nginx配置的其余部分。这将根据您的需要而有所不同。我们将仅复制默认位置块中使用的一些伪指令,它将设置文档根目录和一些错误页面:
/etc/nginx/conf.d/ssl.conf
server {
listen 443 http2 ssl;
listen [::]:443 http2 ssl;
server_name server_IP_address;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
########################################################################
# from https://cipherli.st/ #
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html #
########################################################################
. . .
##################################
# END https://cipherli.st/ BLOCK #
##################################
root /usr/share/nginx/html;
location / {
}
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
完成后,保存并退出。这将配置Nginx使用我们生成的SSL证书来加密流量。指定的SSL选项可确保仅使用最安全的协议和密码。请注意,此示例配置仅服务于默认的Nginx页面,因此您可能需要修改它以满足您的需要。
(可选)创建从HTTP重定向到HTTPS
使用我们当前的配置,Nginx以端口443上的请求响应加密内容,但对端口80上的请求以未加密的内容进行响应。这意味着我们的站点提供加密,但不强制其使用。这在一些使用情况下可能是好的,但通常最好要求加密。当机密数据(如密码)可能在浏览器和服务器之间传输时,这一点尤其重要。 值得庆幸的是,默认的Nginx的配置文件,使我们能够轻松地在添加文件添加指令到默认的80端口服务器块/etc/nginx/default.d
目录。 创建一个名为新文件
ssl-redirect.conf
并打开它使用此命令编辑:
sudo vi /etc/nginx/default.d/ssl-redirect.conf
然后粘贴在这行:
/etc/nginx/default.d/ssl-redirect.conf
return 301 https://$host$request_uri/;
保存并在完成后关闭文件。这将配置端口80(默认)服务器块上的HTTP,以将传入请求重定向到我们配置的HTTPS服务器块。
第4步:启用Nginx中的更改
现在我们已经进行了更改,我们可以重新启动Nginx来实现我们的新配置。 首先,我们应该检查以确保我们的文件中没有语法错误。我们可以通过键入:sudo nginx -t
如果一切都成功,你会得到一个如下所示的结果:
Outputnginx: [warn] "ssl_stapling" ignored, issuer certificate not found
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
请注意开始时的警告。如前所述,此特定设置会发出警告,因为我们的自签名证书不能使用SSLStapling。这是预期的,我们的服务器仍然可以正确加密连接。 如果您的输出与上述匹配,则您的配置文件没有语法错误。我们可以安全地重新启动Nginx来实现我们的更改:
sudo systemctl restart nginx
Nginx进程将重新启动,实施我们配置的SSL设置。
第5步:测试加密
现在,我们准备测试我们的SSL服务器。 打开Web浏览器并输入https://
,后跟服务器的域名或IP到地址栏:
https://server_domain_or_IP
因为我们创建的证书不是由您的浏览器的可信证书颁发机构签名的,因此您可能会看到类似下面的警告:
这是预期和正常的。我们只对我们的证书的加密方面感兴趣,而不是第三方验证我们的主机的真实性。点击“ADVANCED”,然后提供的链接继续到您的主机:
您应该被带到您的网站。如果您在浏览器地址栏中看到,您将看到一些部分安全的指示。这可能是一个带有“x”的锁,或带有感叹号的三角形。在这种情况下,这只是意味着无法验证证书。它仍在加密您的连接。 如果您配置Nginx将HTTP请求重定向到HTTPS,您还可以检查重定向功能是否正确:
http://server_domain_or_IP
如果这导致相同的图标,这意味着您的重定向工作正常。