Apache httpd功能篇07 — https第三部分

概述

本章,您将学习到关于 https 的相关知识。

由于涉及到的内容较多,本章节的内容被划分为三部分的文档:

  • 第一部分 - https 的基础知识
  • 第二部分 - 手动模拟出 SSL 证书
  • 第三部分 - 在 Apache httpd 中进行配置

在 Apache httpd 中配置 SSL 证书

前面我们手动模拟了 SSL 证书签发的全过程,当申请者的 CSR 文件被 CA 机构签发后,Web 服务器的相关目录下通常存在三个文件:

  • 私钥文件
  • CSR 文件
  • 签发之后的证书文件

在实际的生产情况下,当我们向证书品牌商购买 SSL 证书后,可在网页的控制台中手动下载相关文件,包括:

  • 私钥文件 - 常以 .key 后缀结尾的文件
  • 证书文件 - 常以 .crt 后缀结尾的文件
  • 证书链文件 - 常以 .crt 后缀结尾的文件,文件名中常包含 chain 或 root 等单词

Q:为什么还要有一个证书链文件?

CA 机构通常不会直接使用根证书的私钥对用户的证书进行签发,这是因为:

  • 安全风险极高 - 如果把根证书的私钥拿出来每天给成千上万的用户签名,若根证书私钥泄露,所有签发的证书全部作废,整个信任体系直接崩塌
  • 难以维护 - 根证书的变更或轮换或吊销需要全球所有的操作系统和浏览器更新,成本巨大

为了解决上面的问题,CA 机构采用分层签发模式,即 "根证书" -> "中间证书" -> "用户的签发证书" 这样的层级结构。根证书的私钥被离线存储在最高安全级别的硬件加密模块中,极少使用。

浏览器仅内置根证书,并不预置中间证书,因此在 Web 服务器中必须配置证书链(中间证书),用以向浏览器展示完整的信任路径(Trust Path),即 "根证书" <---> "中间证书" <---> "用户的签发证书"。若 Web 服务器缺少证书链的配置,将导致浏览器因无完整的信任链而出现拒绝连接的情况。

具体操作

前提条件:

  • 在主配置文件 httpd.conf 中加载 SSL 模块 - LoadModule ssl_module modules/mod_ssl.so
  • 在主配置文件 httpd.conf 中加载扩展配置文件 - Include conf/extra/httpd-ssl.conf

首先使用 vim 命令的底线命令模式将 httpd-ssl.conf 文件中的内容全部注释掉:

Shell > vim /usr/local/apache2/conf/extra/httpd-ssl.conf

:1,$s/^/#/g

然后使用 vim 命令的插入模式追加内容:

# 如下是最重要的配置,生产环境下可能还需要其他的配置指令
Shell > vim /usr/local/apache2/conf/extra/httpd-ssl.conf
<VirtualHost 192.168.168.20:443>
     DocumentRoot "/usr/local/apache2/htdocs" 
     ServerName myhost.rockylinux.org
     SSLEngine on
     SSLProtocol all -SSLv2 -SSLv3
     SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
     SSLHonorCipherOrder on
     SSLCertificateFile /usr/local/apache2/web-ssl/httpd.crt
     SSLCertificateKeyFile /usr/local/apache2/web-ssl/httpd.key
     SSLCertificateChainFile /usr/local/apache2/web-ssl/root_bundle.crt
     ...
</VirtualHost>

VirtualHost 配置段中的重要指令说明:

  • DocumentRoot "/usr/local/apache2/htdocs" - 指定网页的根目录
  • ServerName myhost.rockylinux.org - 指定域名
  • SSLEngine on - 开启 SSL 功能
  • SSLProtocol all -SSLv2 -SSLv3 - 添加 SSL 协议支持的协议版本并禁用不安全的协议版本
  • SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM - 在 SSL 握手期间选择协商的加密套件
  • SSLHonorCipherOrder on - 是否让 Web 服务器决定使用哪个加密套件,生产环境下必须是 on 指令参数
  • SSLCertificateFile /usr/local/apache2/web-ssl/httpd.crt - 指定被 CA 机构签发的文件
  • SSLCertificateKeyFile /usr/local/apache2/web-ssl/httpd.key - 指定私钥文件路径
  • SSLCertificateChainFile /usr/local/apache2/web-ssl/root_bundle.crt - 指定证书链文件路径

VirtualHost 配置段中关于性能优化的次要指令说明(确认加载了 mod_socache_shmcb 模块):

  • SSLSessionCache shmcb:/usr/local/apache2/logs/ssl_gcache_data(512000) - 配置全局或进程 SSL 会话缓存的存储类型
  • SSLSessionCacheTimeout 300 - SSL 会话在会话缓存中过期前的秒数

VirtualHost 配置段中关于日志的次要指令说明:

  • ErrorLog "/usr/local/apache2/logs/ssl_error_log" - 指定 SSL 协议的错误日志
  • CustomLog "/usr/local/apache2/logs/ssl_access_log" combined - 指定访问日志的文件路径以及格式

重定向(80端口跳转到443端口)

在 httpd-ssl.conf 文件中配置重定向(80 端口跳转到 443 端口),在配置时请检查:

  1. 主配置文件 httpd.conf 没有加载 httpd-vhosts.conf 虚拟主机扩展配置文件
  2. IPv4/IPv6 的 80 端口和 443 端口的网页目录位置是否一致(即 DocumentRoot 指令的指令参数)
# 加载 mod_rewrite 模块
Shell > vim /usr/local/apache2/conf/httpd.conf
...
LoadModule rewrite_module modules/mod_rewrite.so
...

# 再写一个 VirtualHost 配置段
Shell > vim /usr/local/apache2/conf/extra/httpd-ssl.conf
...
<VirtualHost 192.168.168.20:80>
     ServerName myhost.rockylinux.org
     RewriteEngine On
     RewriteCond %{HTTPS} off
     RewriteRule ^(.*)$ https://%{SERVER_NAME}/$1 [L,R=301]
</VirtualHost>

httpd-ssl.conf 文件内容的完整示例

如下所示(两个配置段无先后顺序要求):

<VirtualHost 192.168.168.20:80>
     ServerName myhost.rockylinux.org
     RewriteEngine On
     RewriteCond %{HTTPS} off
     RewriteRule ^(.*)$ https://%{SERVER_NAME}/$1 [L,R=301]
</VirtualHost>

<VirtualHost 192.168.168.20:443>
     DocumentRoot "/usr/local/apache2/htdocs" 
     ServerName myhost.rockylinux.org
     SSLEngine on
     SSLProtocol all -SSLv2 -SSLv3
     SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
     SSLHonorCipherOrder on
     SSLCertificateFile /usr/local/apache2/web-ssl/httpd.crt
     SSLCertificateKeyFile /usr/local/apache2/web-ssl/httpd.key
     SSLCertificateChainFile /usr/local/apache2/web-ssl/root_bundle.crt
     SSLSessionCache shmcb:/usr/local/apache2/logs/ssl_gcache_data(512000)
     SSLSessionCacheTimeout 300
     ErrorLog "/usr/local/apache2/logs/ssl_error_log"
     CustomLog "/usr/local/apache2/logs/ssl_access_log" combined
</VirtualHost>

配置完成后,使用 apachectl 命令的 -t 选项对配置文件的语法进行检查:

Shell > /usr/local/apache2/bin/apachectl -t
Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇