如何在 Ubuntu 18.04 上为 Apache 创建自签名 SSL 证书

简介

TLS,即传输层安全,及其前身SSL,即安全套接字层,是用于将普通流量包装在受保护的加密包装中的网络协议。

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

在本指南中,您将学习如何为 Ubuntu 18.04 上的 Apache Web 服务器设置自签名 SSL 证书。

先决条件

要完成本教程,您需要:

  • 一个已配置有sudo权限和已启用防火墙的非root用户的 Ubuntu 18.04 服务器。您可以按照我们的《在 Ubuntu 18.04 上进行初始服务器设置》指南设置此类用户帐户。
  • 已安装 Apache Web 服务器。如果您想在服务器上安装完整的 LAMP(Linux、Apache、MySQL、PHP)堆栈,可以按照我们的《在 Ubuntu 18.04 上设置 LAMP》指南进行操作。如果您只需要 Apache Web 服务器,请跳过与 PHP 和 MySQL 相关的步骤。

完成先决条件后,继续下一步。

步骤 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 在创建的证书的位置。

如前所述,这些选项将创建一个密钥文件和一个证书。您将被要求关于服务器的一些问题,以便将信息嵌入证书中。

适当填写提示。最重要的一行是请求通用名称(例如服务器 FQDN 或您的名称)。您需要输入与您的服务器关联的域名或更可能是您服务器的公共 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]: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目录下的适当子目录中。

步骤 2 — 配置 Apache 使用 SSL

您已成功在/etc/ssl目录下创建了密钥和证书文件。现在,您需要修改 Apache 配置以利用这些文件。

您将通过对配置进行一些调整来完成此操作:

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

完成后,您将拥有一个安全的 SSL 配置。

创建具有强加密设置的 Apache 配置片段

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

/etc/apache2/conf-available 目录中创建一个新的片段。在本例中,我们将使用 nano 创建文件,并将文件命名为 ssl-params.conf,以明确其目的。可以使用您喜欢的文本编辑器:

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

为了安全地设置 Apache SSL,我们将采用 Cipherlist.eu 的建议。Cipherlist.eu 是一个有用且易于理解的资源,用于了解流行软件使用的加密设置。

为了您的目的,请完整复制提供的设置。不过,您需要做一个小小的修改,即禁用 Strict-Transport-Security 头部(HSTS)。

预加载 HSTS 可以提供增强的安全性,但如果意外启用或错误启用,可能会产生深远的后果。在本指南中,我们不会启用这些设置,但如果您确信理解了其影响,可以进行修改。

在决定之前,花点时间了解 HTTP 严格传输安全性(HSTS),特别是关于“预加载”功能。

现在将配置粘贴到 ssl-params.conf 文件中:

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM
# 需要 Apache 2.4.36 和 OpenSSL 1.1.1
SSLProtocol -all +TLSv1.3 +TLSv1.2
SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1
# 旧版本
# SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
# 暂时禁用预加载 HSTS。如果您理解其影响,可以使用包含“preload”指令的已注释的头部行。
# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# 需要 Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# 需要 Apache >= 2.4.11
SSLSessionTickets Off

完成后保存并关闭文件。如果您使用的是 nano,可以按 CTRL + X,然后输入 YENTER 来完成。

修改默认的 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>

        </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>

        </VirtualHost>
</IfModule>

完成后保存并关闭文件。

(推荐)修改 HTTP 主机文件以重定向到 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

输出应如下所示:

Available applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

您可以通过检查状态来查看当前设置:

sudo ufw status

如果之前只允许了常规的 HTTP 流量,您的输出结果将如下所示:

Status: 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
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Apache Full                ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Apache Full (v6)           ALLOW       Anywhere (v6)

您现在已成功允许 Apache 流量通过防火墙。

步骤 4 — 在 Apache 中启用更改

现在您已经进行了更改并调整了防火墙,您可以在 Apache 中启用 SSL 和 headers 模块,启用准备好 SSL 的虚拟主机,并重新启动 Apache。

使用 a2enmod 命令启用 mod_ssl,即 Apache 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

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

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

第一行是一条消息,告诉您未能可靠地确定服务器的完全合格域名,使用 127.0.1.1。要消除此消息,您可以在 /etc/apache2/apache2.conf 中将 ServerName 设置为服务器的域名或 IP 地址。这是可选的,因为该消息不会造成任何损害。

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

sudo systemctl restart apache2

您已经进行了更改,接下来将测试您的 SSL 服务器。

步骤 5 — 测试加密

现在是时候测试您的 SSL 服务器了。首先打开您的网络浏览器,然后在地址栏中输入 https://,后跟您服务器的域名或 IP:

https://server_domain_or_IP

由于您创建的证书未由浏览器信任的证书颁发机构签名,您可能会收到以下警告:

!Apache self-signed cert warning

这是预期的和正常的。我们只关心证书的加密方面,而不是主机真实性的第三方验证。点击 高级,然后点击提供的链接以继续访问您的主机:

!Apache self-signed override

您应该能够访问您的站点。在浏览器地址栏中,您将看到一个带有 “x” 的锁。这意味着无法验证证书。但它仍然加密您的连接。

如果您配置了 Apache 将 HTTP 重定向到 HTTPS,您还可以检查重定向是否正常工作:

http://server_domain_or_IP

如果结果显示相同的图标,这意味着您的重定向已经正确工作。

第六步 — 更改为永久重定向

如果你的重定向工作正常,并且确定只允许加密流量,你应该再次修改未加密的 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 服务器以使用强加密来处理客户端连接。这将允许你安全地提供请求,并防止外部方读取你的流量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/594237.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

流畅的Python阅读笔记

五一快乐的时光总是飞快了&#xff0c;不知多久没有拿起键盘写文章了&#xff0c;最近公司有Python的需求&#xff0c;想着复习下Python吧&#xff0c;然后就买了本Python的书籍 书名&#xff1a; 《流畅的Python》 下面是整理的一个阅读笔记&#xff0c;大家自行查阅&#xf…

Python 全栈系列241 GFGo Lite迭代

说明 随着整个算网开发逐渐深入&#xff0c;各个组件、微服务的数量、深度在不断增加。由于算网是个人项目&#xff0c;我一直按照MVP(Minimum Viable Product )的原则在推进。由于最初的时候对架构、算法和业务的理解并没有那么深刻&#xff0c;所以MVP的内容还是在不断变化&…

选择深度学习框架:TensorFlow 2 vs PyTorch

TensorFlow 2 vs PyTorch 选择深度学习框架&#xff1a;TensorFlow 2 vs PyTorchTensorFlow 2概述TensorFlow 2的优点TensorFlow 2的缺点 PyTorch概述PyTorch的优点PyTorch的缺点 选择建议对于选择困难症的人&#xff0c;我给你们的答案——PyTorch选择理由&#xff1a;结论&am…

数据结构(C):玩转链表

&#x1f37a;0.前言 言C之言&#xff0c;聊C之识&#xff0c;以C会友&#xff0c;共向远方。各位博友的各位你们好啊&#xff0c;这里是持续分享数据结构知识的小赵同学&#xff0c;今天要分享的数据结构知识是链表&#xff0c;在这一章&#xff0c;小赵将会向大家展开聊聊链表…

常用语音识别开源四大工具:Kaldi,PaddleSpeech,WeNet,EspNet

无论是基于成本效益还是社区支持&#xff0c;我都坚决认为开源才是推动一切应用的动力源泉。下面推荐语音识别开源工具&#xff1a;Kaldi&#xff0c;Paddle&#xff0c;WeNet&#xff0c;EspNet。 1、最成熟的Kaldi 一个广受欢迎的开源语音识别工具&#xff0c;由Daniel Pove…

Servlet框架

简介 Servlet是运行在web服务器或应用服务器上的程序&#xff0c;他是作为来自web浏览器或其他http客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。 使用Servlet可以手机来自网页表单的用户输入&#xff0c;呈现来自数据库或者其他源记录&#xff0c;还可以动态创…

IDEA访问不到静态资源

背景 我在resources下创建static文件夹&#xff0c;再创建front文件夹放前端资源&#xff0c;里面有index.html&#xff0c;游览器输入localhost:8011/front没反应。&#xff08;resources/static/front/index.html&#xff09; 解决办法 重启idea&#xff0c;清楚idea缓存&am…

设计模式之服务定位器模式

想象一下&#xff0c;你的Java应用是一座庞大的迷宫&#xff0c;里面藏着无数宝贵的服务宝藏&#xff0c;而你正需要一张精确的藏宝图来指引方向&#xff0c;迅速找到并利用这些宝藏。服务定位器模式&#xff0c;正是这样一张神奇的地图&#xff0c;它帮你动态定位并获取应用中…

stl容器 string类的基本操作

目录 一.string类的构造 二.string类的输出 1.传统字符串输出 2.通过迭代器进行输出 ​编辑 3.C11标准的范围for输出加auto推导类型 三.string类的各种迭代器 begin(&#xff09;和end() 利用迭代器遍历输出 利用迭代器修改字符串的字符 rbgin()和rend() 利用迭代器遍…

[论文阅读]Adversarial Autoencoders(aae)和代码

In this paper, we propose the “adversarial autoencoder” (AAE), which is a probabilistic autoencoder that uses the recently proposed generative adversarial networks (GAN) to perform variational inference by matching the aggregated posterior of the hidden …

【人工智能基础】RNN实验

一、RNN特性 权重共享 wordi weight bais 持久记忆单元 wordi weightword baisword hi weighth baish 二、公式化表达 ht</sub f(ht - 1, xt) ht tanh(Whhht - 1 Wxhxt) yt Whyht 三、RNN网络正弦波波形预测 环境准备 import numpy as np import torch …

服务器端优化-Redis内存划分和内存配置

6、服务器端优化-Redis内存划分和内存配置 当Redis内存不足时&#xff0c;可能导致Key频繁被删除、响应时间变长、QPS不稳定等问题。当内存使用率达到90%以上时就需要我们警惕&#xff0c;并快速定位到内存占用的原因。 有关碎片问题分析 Redis底层分配并不是这个key有多大&…

PG 全页写

1.什么是全页写 修改一个块的时候&#xff0c;把块读到内存中&#xff0c;commit后,WAL写进程会触发写&#xff0c;把修改的块写到WAL日志文件&#xff0c;如果再往这个块中插入一条数据&#xff0c;数据缓冲区里面的块有两条数据了&#xff0c;再次commit后&#xff0c;PG会把…

图像处理--空域滤波增强(原理)

一、均值滤波 线性滤波算法&#xff0c;采用的主要是邻域平均法。基本思想是使用几个像素灰度的某种平均值来代替一个原来像素的灰度值。可以新建一个MN的窗口以为中心&#xff0c;这个窗口S就是的邻域。假设新的新的像素灰度值为&#xff0c;则计算公式为 1.1 简单平均法 就是…

在excel中,alt+13和alt+10都是什么字符?

1.回车符与换行符 Alt13是回车符&#xff0c;Alt10是换行符。 2.用在microsoft word中 在microsoft office中&#xff0c;回车符 和 换行符 对文本来讲都有换行的作用&#xff0c;但它们并不是同一种符号。下图是在word中两种字符的显示&#xff0c; 当使用 回车符 进行文本…

Ubuntu MATE系统下WPS显示错位

系统&#xff1a;Ubuntu MATE 22.04和24.04&#xff0c;在显示器设置200%放大的情况下&#xff0c;显示错位。 显示器配置&#xff1a; WPS显示错位&#xff1a; 这个问题当前没有找到好的解决方式。 因为4K显示屏设置4K分辨率&#xff0c;图标&#xff0c;字体太小&#xff…

TCP(TCP客户端、服务器如何通信)

一、TCP介绍 TCP的特点&#xff1a; 面向连接的协议&#xff1a;TCP是一种可靠的、面向连接的协议&#xff0c;在通信之前需要建立连接&#xff0c;以确保数据的可靠传输。这意味着在传输数据之前&#xff0c;发送方和接收方之间需要建立一条可靠的连接通道。流式协议&#x…

Spring Cloud架构进化实操:Eureka、Apollo、OpenFeign、Ribbon、Zuul组件

文章目录 前言一、引出二、服务注册与发现2.1 创建Eureka注册中心2.1.1 引入pom依赖2.1.2 配置yaml2.1.3 启动服务21.4 测试访问 2.2 创建服务提供者2.2.1 配置yaml2.2.2 启动服务2.2.3 测试访问 2.3 创建服务消费者2.3.1 服务提供者接口2.3.2 服务消费者调用接口 三、负载均衡…

Docker的私有仓库部署-Harbor

目录 一. Docker原生私有仓库 Registry 1. Registry 的介绍 2. Registry 的部署过程 二. Registry 的升级——Habor 1. Harbor 简介 2. Harbor 特性 3. Harbor 的构成 4. Harbor 部署 4.1 部署 Docker-Compose 服务 4.2 部署 Harbor 服务 4.2.1 下载或上传 Harbor…

18_Scala面向对象编程trait

文章目录 trait1.定义trait2.向类中混入特质2.1没有父类2.2有父类 3.动态混入3.1动态混入查询功能到公司业务中 4.父类&#xff0c;子类&#xff0c;特质初始化优先级5.Scala功能执行顺序6.常用API trait –特质的学习需要类比Java中的接口&#xff0c;源码编译之后就是interf…