简介
TLS,即传输层安全协议,及其前身SSL,安全套接字层,是为了将正常流量放置在受保护的加密包装中而创建的安全协议。
这些协议允许远程方安全地发送流量,而不会被中间人拦截和阅读。它们还通过由证书颁发机构建立服务器的受信任和真实性,对互联网上的域和服务器的身份进行验证,起着重要作用。
在本指南中,我们将介绍如何在 Ubuntu 14.04 服务器上为 Apache 创建自签名 SSL 证书,这将允许您加密到服务器的流量。虽然这不提供服务器身份的第三方验证的好处,但它满足了那些只想安全传输信息的要求。
先决条件
在开始之前,您应该已经处理了一些配置。
在本指南中,我们将作为具有 sudo 特权的非 root 用户操作。您可以按照我们的 Ubuntu 14.04 初始服务器设置指南中的步骤 1-4 设置一个用户。
您还需要已安装 Apache。如果您还没有安装,可以通过以下命令快速解决:
sudo apt-get update sudo apt-get install apache2
步骤一 — 激活 SSL 模块
实际上,SSL 支持已经包含在 Ubuntu 14.04 Apache 包中。我们只需要启用它以利用系统上的 SSL。
通过输入以下命令来启用模块:
sudo a2enmod ssl
启用 SSL 后,您需要重新启动 Web 服务器以使更改生效:
sudo service apache2 restart
有了这个,我们的 Web 服务器现在可以处理 SSL,如果我们配置它来这样做。
步骤二 — 创建自签名 SSL 证书
让我们首先在 Apache 配置层次结构中创建一个子目录,以放置我们将要创建的证书文件:
sudo mkdir /etc/apache2/ssl
现在我们有一个位置来放置我们的密钥和证书,我们可以通过输入以下命令一次性创建它们:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt
让我们详细了解一下这意味着什么。
- openssl:这是由 OpenSSL 提供的基本命令行工具,用于创建和管理证书、密钥、签名请求等。
- req:这指定了 X.509 证书签名请求(CSR)管理的子命令。X.509 是 SSL 遵循的公钥基础设施标准,用于其密钥和证书管理。由于我们想要创建一个新的 X.509 证书,这就是我们想要的。
- -x509:此选项指定我们要创建自签名证书文件,而不是生成证书请求。
- -nodes:此选项告诉 OpenSSL 我们不希望用密码保护我们的密钥文件。使用密码保护的密钥文件会妨碍 Apache 自动启动,因为我们每次服务重新启动时都必须输入密码。
- -days 365:这指定我们正在创建的证书将在一年内有效。
- -newkey rsa:2048:此选项将同时创建证书请求和新的私钥。这是必要的,因为我们没有提前创建私钥。
rsa:2048
告诉 OpenSSL 生成一个长度为 2048 位的 RSA 密钥。 - -keyout:此参数为正在创建的私钥文件命名输出文件。
- -out:此选项为我们正在生成的证书命名输出文件。
当您按下"ENTER"键时,将会询问您一些问题。
最重要的项目是要求的一行,即“Common Name (e.g. server FQDN or YOUR name)”。您应该输入要与证书关联的域名,或者如果您没有域名,则输入服务器的公共 IP 地址。
问题部分看起来像这样:
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]:Your Company
Organizational Unit Name (eg, section) []:Department of Kittens
Common Name (e.g. server FQDN or YOUR name) []:your_domain.com
Email Address []:your_email@domain.com
密钥和证书将被创建并放置在您的 /etc/apache2/ssl
目录中。
第三步 — 配置 Apache 使用 SSL
现在我们已经准备好了证书和密钥,我们可以配置 Apache 在虚拟主机文件中使用这些文件。你可以在这里了解更多关于如何设置 Apache 虚拟主机的信息。
我们不再基于 sites-available
子目录中的 000-default.conf
文件来配置我们的配置文件,而是基于包含一些默认 SSL 配置的 default-ssl.conf
文件来配置。
现在以 root 权限打开文件:
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 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown </VirtualHost> </IfModule>
这可能看起来有点复杂,但幸运的是,我们不需要担心这里的大多数选项。
我们想要设置我们为虚拟主机配置的常规内容(ServerAdmin、ServerName、ServerAlias、DocumentRoot 等),以及更改 Apache 查找 SSL 证书和密钥的位置。
最终,它将看起来像这样。红色条目是从原始文件修改的部分:
<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin <span class="highlight">admin@example.com</span> <span class="highlight">ServerName your_domain.com</span> <span class="highlight">ServerAlias www.your_domain.com</span> DocumentRoot <span class="highlight">/var/www/html</span> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile <span class="highlight">/etc/apache2/ssl/apache.crt</span> SSLCertificateKeyFile <span class="highlight">/etc/apache2/ssl/apache.key</span> <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 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown </VirtualHost> </IfModule>
完成后保存并退出文件。
第四步 — 激活 SSL 虚拟主机
现在我们已经配置了启用 SSL 的虚拟主机,我们需要启用它。
我们可以通过输入以下命令来实现:
sudo a2ensite default-ssl.conf
然后我们需要重新启动 Apache 来加载我们的新虚拟主机文件:
sudo service apache2 restart
这将启用你的新虚拟主机,它将使用你创建的 SSL 证书来提供加密内容。
第五步 — 测试你的设置
现在你已经准备好了一切,你可以通过在指定 https://
协议后访问你服务器的域名或公共 IP 地址来测试你的配置,就像这样:
https://<span class="highlight">server_domain_name_or_IP</span>
你会收到一个警告,告诉你的浏览器无法验证你的服务器的身份,因为它没有被它信任的证书颁发机构签名。
这是预期的,因为我们自签了我们的证书。虽然我们的证书不会为我们的用户验证我们的服务器,因为它没有与受信任的证书颁发机构进行交互,但它仍然能够加密通信。
由于这是预期的,你可以点击“仍然继续”按钮或你的浏览器中类似的选项。
现在你将被带到你为 SSL 虚拟主机配置的 DocumentRoot
中的内容。这次你的流量是加密的。你可以通过点击菜单栏中的锁图标来检查这一点:
!apache ssl encrypted
你可以看到中间的绿色部分显示连接是加密的。
结论
您现在应该已经在您的网站上启用了 SSL。这将有助于保护访问者和您的网站之间的通信,但它会警告每个用户浏览器无法验证证书的有效性。
如果您计划启动一个公共网站并需要 SSL,最好从受信任的证书颁发机构购买 SSL 证书。
如果您想了解更多关于如何配置 Apache 的信息,请点击这里。查看此链接以获取更多有关如何保护您的 Linux 服务器的想法。