专栏首页云计算教程系列如何在Ubuntu 16.04中为Apache创建自签名SSL证书
原创

如何在Ubuntu 16.04中为Apache创建自签名SSL证书

介绍

TLS或传输层安全性及其前身SSL(代表安全套接字层)是用于将正常流量包装在受保护的加密包装中的Web协议。

使用这种技术,服务器可以在服务器和客户端之间安全地发送流量,而不会被外部各方拦截。证书系统还可以帮助用户验证他们正在连接的站点的身份。

在本指南中,我们将向您展示如何设置自签名SSL证书,以便在Ubuntu 16.04服务器上与Apache Web服务器一起使用。

SSL证书:如何设置此证书取决于你是否拥有可解析该服务器的域名。

注意:自签名证书将加密服务器与任何客户端之间的通信。但是,由于Web浏览器不包含任何受信任的证书颁发机构的签名,因此用户无法使用该证书自动验证服务器的身份。

如果您没有与服务器关联的域名以及加密Web界面不面向用户的实例,则可能需要使用自签名证书。如果你这样做有一个域名,在很多情况下,最好使用CA签名的证书。

先决条件

在开始之前,您应该为非root用户配置sudo权限。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器

您还需要安装Apache Web服务器。

完成先决条件后,请继续以下操作。

第1步:创建SSL证书

TLS / SSL通过使用公共证书和私钥的组合来工作。SSL密钥在服务器上保密。它用于加密发送给客户端的内容。SSL证书与请求内容的任何人公开共享。它可用于解密由关联的SSL密钥签名的内容。

我们可以在一个命令中使用OpenSSL创建自签名的密钥和证书对:

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

您将被问到一系列问题。在我们讨论之前,让我们看看我们发出的命令中发生了什么:

  • openssl:这是用于创建和管理OpenSSL证书,密钥和其他文件的基本命令行工具。
  • req:此子命令指定我们要使用X.509证书签名请求(CSR)管理。“X.509”是SSL和TLS为其密钥和证书管理所遵循的公钥基础结构标准。我们想要创建一个新的X.509证书,所以我们使用这个子命令。
  • -x509:这个命令通过告诉实用程序我们要创建自签名证书而不是生成证书签名请求来进一步修改上一个子命令,而这也是经常会发生的情况。
  • -nodes:这告诉OpenSSL跳过用密码来保护我们的证书的选项。我们需要Apache在服务器启动时就能够在没有用户干预的情况下读取文件。但是密码短语会阻止这种情况发生,因为我们必须在每次重启后输入密码。
  • -days 365:在此选项设置的时间长度期间,该证书被视为是有效的。我们在这里设置了一年。
  • -newkey rsa:2048:这指定我们要同时生成新证书和新密钥。我们没有创建在上一步中签署证书所需的密钥,因此我们需要将其与证书一起创建。该rsa:2048部分告诉它制作一个2048位长的RSA密钥。
  • -keyout:这一行告诉OpenSSL在哪里放置我们正在创建的已生成的私钥文件。
  • -out:这告诉OpenSSL在哪里放置我们正在创建的证书。

如上所述,这些选项将创建密钥文件和证书。我们将询问有关我们服务器的一些问题,以便将信息正确地嵌入到证书中。

适当填写提示。 最重要的一行是请求的那一行Common Name (e.g. server FQDN or YOUR name)。您需要输入与服务器关联的域名,或者是您服务器的公共IP地址,而这是更有可能的。

整个提示将如下所示:

Output
Country 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组,用于与客户协商Perfect Forward Secrecy

我们可以通过键入以下内容来执

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

这可能需要几分钟,但一旦完成,您将在/etc/ssl/certs/dhparam.pem中拥有一个强大的DH组,我们可以在我们的配置中使用它。

第2步:配置Apache以使用SSL

我们在/etc/ssl目录下创建了密钥和证书文件。现在我们只需要修改我们的Apache配置就可以利用它们。

我们将对配置进行一些调整:

  1. 我们将创建一个配置代码段来指定强大的默认SSL设置。
  2. 我们将修改包含的SSL Apache Virtual Host文件以指向我们生成的SSL证书。
  3. (推荐)我们将修改未加密的虚拟主机文件,以自动将请求重定向到加密的虚拟主机。

完成后,我们应该有一个安全的SSL配置。

使用强加密设置创建Apache配置代码段

首先,我们将创建一个Apache配置代码段来定义一些SSL设置。这将为Apache设置一个强大的SSL密码套件,并启用一些有助于保证我们的服务器安全的高级功能。我们将设置的参数可被任何可以启用SSL的虚拟主机使用。

/etc/apache2/conf-available目录中创建一个新代码段。我们将文件命名为ssl-params.conf来明确我们的目的:

sudo nano /etc/apache2/conf-available/ssl-params.conf

要安全地设置Apache SSL,我们将使用Remy van ElstCipherli.st站点上的建议。此站点旨在为流行软件提供易于使用的加密设置。您可以在此处阅读有关Apache选择的更多信息。

链接到上述网站的建议设置提供了强大的安全性。有时,这是以更高的客户端兼容性为代价的。如果您需要支持较旧的客户端,可以通过单击标记为“是的,给我一个与旧版/旧版软件一起使用的密码套件”的页面上的链接来访问该列表。该列表可以替换下面复制的项目。

您使用哪种配置的选择在很大程度上取决于您需要支持的内容。它们都将提供很大的安全性。

根据我们的目的,我们可以完整地复制提供的设置。然后只做两个小的改动。

SSLOpenSSLConfCmd DHParameters指令设置为指向我们之前生成的Diffie-Hellman文件。另外,请花点时间阅读HTTP严格传输安全性或HSTS,特别是有关“预加载”功能的信息。预加载HSTS可提高安全性,但如果意外启用或启用错误,可能会产生深远的影响。在本指南中,我们不会预加载设置,但如果您确定了解其含义,则可以对其进行修改:

# 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 
SSLSessionTickets Off
SSLUseStapling on 
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
​
SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"

完成后保存并关闭文件。

修改默认Apache SSL虚拟主机文件

接下来,让我们修改/etc/apache2/sites-available/default-ssl.conf默认的Apache SSL虚拟主机文件。如果您使用的是其他服务器块文件,请在下面的命令中替换它的名称。

在我们继续之前,让我们备份原始的SSL虚拟主机文件:

sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak

现在,打开SSL虚拟主机文件进行调整:

sudo nano /etc/apache2/sites-available/default-ssl.conf

在内部,删除了大部分注释后,默认情况下,虚拟主机文件应该如下所示:

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost
​
                DocumentRoot /var/www/html
​
                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined
​
                SSLEngine on
​
                SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
​
                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>
​
                # BrowserMatch "MSIE [2-6]" \
                #               nokeepalive ssl-unclean-shutdown \
                #               downgrade-1.0 force-response-1.0
​
        </VirtualHost>
</IfModule>

我们将对文件进行一些小的调整。我们将在虚拟主机文件(ServerAdmin电子邮件地址,ServerName等)中设置我们想要调整的正常事项,调整SSL指令以指向我们的证书和密钥文件,并取消注释一为旧浏览器提供兼容性的部分。

进行这些更改后,您的服务器块应类似于:

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin your_email@example.com
                ServerName server_domain_or_IP
​
                DocumentRoot /var/www/html
​
                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined
​
                SSLEngine on
​
                SSLCertificateFile      /etc/ssl/certs/apache-selfsigned.crt
                SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
​
                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>
​
                BrowserMatch "MSIE [2-6]" \
                               nokeepalive ssl-unclean-shutdown \
                               downgrade-1.0 force-response-1.0
​
        </VirtualHost>
</IfModule>

完成后保存并关闭文件。

(推荐)修改未加密的虚拟主机文件以重定向到HTTPS

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

要调整未加密的虚拟主机文件以将所有流量重定向为SSL加密,我们可以打开该/etc/apache2/sites-available/000-default.conf文件:

sudo nano /etc/apache2/sites-available/000-default.conf

VirtualHost配置块中,我们只需要添加一个Redirect指令,将所有流量指向站点的SSL版本:

<VirtualHost *:80>
        . . .
​
        Redirect "/" "https://your_domain_or_IP/"
​
        . . .
</VirtualHost>

完成后保存并关闭文件。

第3步:调整防火墙

如果你启用了ufw防火墙,则必须按照先决条件指南的建议,调整设置以允许SSL流量。幸运的是,Apache 在安装时用ufw注册了一些配置文件。

我们可以通过键入来查看可用的配置文件

sudo ufw app list

您应该看到如下列表:

Output
Available applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

您可以键入以下内容来查看当前设置:

sudo ufw status

如果您之前只允许常规HTTP流量,则输出可能如下所示:

OutputStatus: active
​
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Apache                     ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Apache (v6)                ALLOW       Anywhere (v6)

为了进一步允许HTTPS流量,我们可以允许运行“Apache Full”配置文件,然后删除冗余的“Apache”配置文件限额:

sudo ufw allow 'Apache Full'
sudo ufw delete allow 'Apache'

您的状态现在应该如下所示:

sudo ufw status
Output
Status: active
​
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Apache Full                ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Apache Full (v6)           ALLOW       Anywhere (v6)

第4步:启用Apache中的更改

现在我们已经进行了更改并调整了防火墙,我们可以在Apache中启用SSL和头模块,启用我们的SSL就绪虚拟主机,然后重新启动Apache。

我们可以使用以下a2enmod命令启用Apache SSL中模块mod_ssl,以及SSL代码段中的某些设置所需的mod_headers,:

sudo a2enmod ssl
sudo a2enmod headers

接下来,我们可以使用以下a2ensite命令启用SSL虚拟主机:

sudo a2ensite default-ssl

我们还需要启用我们的ssl-params.conf文件,读入我们设置的值:

sudo a2enconf ssl-params

此时,我们的站点和必要的模块已启用。我们应该检查以确保我们的文件中没有语法错误。我们可以通过键入以下内容来执

sudo apache2ctl configtest

如果一切顺利,您将得到如下结果:

Output
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK

第一行只是一条告诉您该ServerName指令未全局设置的消息。如果要删除该消息,可以在/etc/apache2/apache2.conf中设置ServerName服务器的域名或IP地址。这是可选的所以该消息不会造成任何伤害。

如果输出中包含输出Syntax OK,则配置文件没有语法错误。我们可以安全地重启Apache以实现我们的更改:

sudo systemctl restart apache2

第5步:测试加密

现在,我们已准备好测试我们的SSL服务器。

打开Web浏览器,然后在服务器的域名或IP中键入地址栏https://

https://server_domain_or_IP

由于我们创建的证书未由您的某个浏览器的受信任证书颁发机构签名,因此您可能会看到一个可怕的警告,如下所示:

这是预期和正常的。我们只对证书的加密方面感兴趣,而不是对主机真实性的第三方验证感兴趣。单击“高级”,然后提供链接以继续进入您的主机:

你应该被带到你的网站。如果你在浏览器地址栏中查看,你会看到一个带有“x”的锁。在这种情况下,这只意味着无法验证证书。它仍在加密您的连接。

如果您将Apache配置为将HTTP重定向到HTTPS,则还可以检查重定向是否正常运行:

http://server_domain_or_IP

如果这导致相同的图标,这意味着您的重定向工作正常。

第6步:更改为永久重定向

如果重定向工作正常并且您确定只想允许加密流量,则应再次修改未加密的Apache虚拟主机以使重定向永久化。

再次打开服务器块配置文件:

sudo nano /etc/apache2/sites-available/000-default.conf

找到我们之前添加的Redirect行。添加permanent到该行,将重定向从302临时重定向更改为301永久重定向:

<VirtualHost *:80>
        . . .
​
        Redirect permanent "/" "https://your_domain_or_IP/"
​
        . . .
</VirtualHost>

保存并关闭文件。

检查配置是否存在语法错误:

sudo apache2ctl configtest

准备好后,重新启动Apache以使重定向永久化:

sudo systemctl restart apache2

结论

您已将Apache服务器配置为对客户端连接使用强加密。这样您就可以安全地处理请求,并阻止外部人员阅读您的流量。

更多Ubuntu教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Create a Self-Signed SSL Certificate for Apache in Ubuntu 16.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何在CentOs 6.4 上使用uWSGI+Nginx部署Flask Web服务器

    Armin Ronacher的Flask是过去几年中为Python创建的Web应用程序框架领域中发生过的最伟大的事情之一。

    藕丝空间
  • 如何在Debian 9上安装MongoDB

    Debian 9的官方软件包存储库包含稍微过时的MongoDB版本,这意味着我们将从官方的MongoDB repo安装。

    藕丝空间
  • 如何在Ubuntu 14.04上创建和使用MongoDB备份

    今天许多现代Web应用程序开发人员都选择在他们的项目中使用NoSQL数据库,而MongoDB通常是他们的首选。如果您在生产场景中使用MongoDB,则定期创建备...

    藕丝空间
  • 专访两届图灵奖得主、七大ACM/IEEE院士:人工智能先驱在想什么、做什么?

    2015年10月28日,以“人工智能,无限可能”为主题的 第十七届“二十一世纪的计算”大型国际学术研讨会在北京召开,包括近两年的图灵奖得主Leslie Lamp...

    CSDN技术头条
  • Python写一个贪吃蛇小游戏

    萌海无涯
  • 【网摘】身在腾讯:浪潮之巅的惶惑与自救

    沈唁
  • 开启mysql远程访问的权限

    用户1409099
  • 5.31 VR扫描:ARM、英特尔接连发布全新处理器

    VRPinea
  • ReasonML——新的前端强类型语言简介

    从有前端到现在,JavaScript 语言一直都是实现前端逻辑的首选。但是,由于 JavaScript 是一个弱类型语言,很难进行相关的类型检测。因此在构建大型...

    黄Java
  • 《selenium2 python 自动化测试实战》(17)——几个cookies操作

    用户2149234

扫码关注云+社区

领取腾讯云代金券