Apache 2.4使用私有CA证书实现HTTPS加密访问

Posted 白-胖-子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache 2.4使用私有CA证书实现HTTPS加密访问相关的知识,希望对你有一定的参考价值。

HTTPS

  • HTTPS Hyper Text Transfer Protocol over SecureSocket Layer
  • HTTPS 是以安全为目标的 HTTP 通道
  • HTTPS 在HTTP 基础上加入 SSL
  • HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL
  • HTTPS 通过传输加密和身份认证保证了传输过程的安全性

HTTPS 会话的简化过程

  1. 客户端与服务器完成TCP三次同步握手
  2. 客户端发送可供选择的加密方式,并向服务器请求证书
  3. 服务器端发送证书以及选定的加密方式给客户端
  4. 客户端取得证书并进行证书验证,如果信任给其发证书的CA
    3.1 验证证书来源的合法性;用CA的公钥解密证书上数字签名
    3.2 验证证书的内容的合法性:完整性验证
    3.3 检查证书的有效期限
    3.4 检查证书是否被吊销
    3.5 证书中拥有者的名字,与访问的目标主机要一致
  5. 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
  6. 服务用此密钥加密用户请求的资源,响应给客户端

注意:SSL是基于IP地址实现,单IP的httpd主机,仅可以使用一个https虚拟主机

apache httpd 实现https

  • 需要启用mod_ssl模块
  • 把证书的三个文件仍进服务器
  • 修改配置文件的指明证书文件、私钥文件[和上级证书链]路径
  • 添加上级证书链指明上级证书颁发者有助于浏览器建立信任

1. 为服务器申请数字证书

1.1可以通过私建CA颁发证书实现

  • 创建私有CA
  • 在服务器创建证书签署请求
  • CA对http服务器签发证书

1.2可以生成自签名证书

make httpd.crt

2. 配置httpd支持使用ssl,及使用的证书

2.1安装mod_ssl模块包

yum -y install mod_ssl
  • 编译安装时如已启动ssl,则无需再装此模块

2.2 修改httpd对应的ssl.conf配置文件:

  • yum或包安装 /etc/httpd/conf.d/ssl.conf
  • 编译安装 /<安装目录>/conf/extra/httpd-ssl.conf
DocumentRoot
ServerName
SSLCertificateFile /path/file
SSLCertificateKeyFile /path/file
SSLCACertificateFile /path/file

3. 测试基于https访问相应的主机

openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]

实现默认访问https

  • 利用RewriteEngine重写请求可以实现将http请求转发至https
#注意: RewriteEngine指令需要开启mod_rewrite.so模块
[root@centos8 ~]#vim /etc/httpd/conf.d/test.conf
RewriteEngine on
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=302]

Apache 2.4.48实现https

安装mod_ssl包

mod_ssl
rpm -qi mod_ssl
Name        : mod_ssl
Epoch       : 1
Version     : 2.4.37
Release     : 30.module_el8.3.0+561+97fdbbcc
Architecture: x86_64
Install Date: Fri 28 May 2021 01:58:10 AM CST
Group       : System Environment/Daemons
Size        : 268326
License     : ASL 2.0
Signature   : RSA/SHA256, Wed 04 Nov 2020 12:00:55 PM CST, Key ID 05b555b38483c65d
Source RPM  : httpd-2.4.37-30.module_el8.3.0+561+97fdbbcc.src.rpm
Build Date  : Wed 04 Nov 2020 11:21:28 AM CST
Build Host  : x86-02.mbox.centos.org
Relocations : (not relocatable)
Packager    : CentOS Buildsys <bugs@centos.org>
Vendor      : CentOS
URL         : https://httpd.apache.org/
Summary     : SSL/TLS module for the Apache HTTP Server
Description :
The mod_ssl module provides strong cryptography for the Apache Web
server via the Secure Sockets Layer (SSL) and Transport Layer
Security (TLS) protocols.

查看生成的文件

rpm -ql mod_ssl
/etc/httpd/conf.d/ssl.conf
/etc/httpd/conf.modules.d/00-ssl.conf
/usr/lib/.build-id
/usr/lib/.build-id/e6/046e586d8d19fb92e3f8484a62203e841c3e2a
/usr/lib/systemd/system/httpd-init.service
/usr/lib/systemd/system/httpd.socket.d/10-listen443.conf
/usr/lib64/httpd/modules/mod_ssl.so
/usr/libexec/httpd-ssl-gencerts
/usr/libexec/httpd-ssl-pass-dialog
/usr/share/man/man8/httpd-init.service.8.gz
/var/cache/httpd/ssl

将配置文件和mod_ssl.so部署到程序目录

  • yum安装的mod_ssl文件自动部署到了不同文件夹,
  • 如果程序是编译安装,需要将对应文件拷贝至编译安装目录
  • 在编译时如果已配置开启ssl功能,则只需修改配置文件即可

生成证书文件

  • 在企业内部我们可以使用私有CA颁发证书
  • 为sunmy.Sun.co 生成证书文件
 sunmy 证书创建成功 
证书生成完成
**************************************生成证书文件如下**************************************
证书存放目录: /sunmy
证书文件列表: sunmy.crt sunmy.csr sunmy.key

在httpd安装目录下创建ssl连接的证书文件夹

  • 生产中需要将每个项目网站的证书和私钥存在对应的文件夹中
[root@C8-192 ~]# cp -av /sunmy /apps/httpd24/ssl/
'/sunmy' -> '/apps/httpd24/ssl/sunmy'
'/sunmy/sunmy.key' -> '/apps/httpd24/ssl/sunmy/sunmy.key'
'/sunmy/sunmy.csr' -> '/apps/httpd24/ssl/sunmy/sunmy.csr'
'/sunmy/sunmy.crt' -> '/apps/httpd24/ssl/sunmy/sunmy.crt'

编辑配置httpd_ssl.conf配置文件

vim /apps/httpd24/conf/extra/httpd-ssl.conf
  • 添加https虚拟主机
## SSL Virtual Host Context
##
<VirtualHost *:443>
ServerName sunmy.sun.co ## 项目网站域名
DocumentRoot "/webDB/vhosts/sunmy" ## 项目网站目录
<Directory "/webDB/vhosts/sunmy"> ## 对目录授权,否则无法访问
Options None
AllowOverride None
Require all granted
</Directory>
SSLCertificateFile "/apps/httpd24/ssl/sunmy/sunmy.crt" ## 证书文件
SSLCertificateKeyFile "/apps/httpd24/ssl/sunmy/sunmy.key"## 私钥
SSLEngine on ## 开启ssl引擎
<FilesMatch "\\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/apps/httpd24/cgi-bin">
SSLOptions +StdEnvVars                                                                                           
</Directory>
</VirtualHost>

重新加载配置文件并重启服务后生效

systemctl daemon-reload && systemctl restart httpd

访问网站做测试

[root@C8-192 ~]# curl sunmy.sun.co
<h1>I am SunMY</h1>
[root@C8-192 ~]# curl -k https://sunmy.sun.co
<h1>I am SunMY</h1>


httpd-ssl.conf内容

[root@C8-192 ~]# grep -Ev "^ *#|^$" /apps/httpd24/conf/extra/httpd-ssl.conf 
Listen 443
SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
SSLHonorCipherOrder on 
SSLProtocol all -SSLv3
SSLProxyProtocol all -SSLv3
SSLPassPhraseDialog  builtin
<VirtualHost *:443>
ServerName sunmy.sun.co
DocumentRoot "/webDB/vhosts/sunmy"
<Directory "/webDB/vhosts/sunmy">
Options None
AllowOverride None
Require all granted
</Directory>
SSLCertificateFile "/apps/httpd24/ssl/sunmy/sunmy.crt"
SSLCertificateKeyFile "/apps/httpd24/ssl/sunmy/sunmy.key"
SSLEngine on
<FilesMatch "\\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/apps/httpd24/cgi-bin">
SSLOptions +StdEnvVars                                                                                           
</Directory>
</VirtualHost>
<VirtualHost _default_:443>
DocumentRoot "/apps/httpd24/sunmy"
ServerName sunmy.sun.co
<directory /webDB/vhosts/sunmy>
require all granted
</directory>
SSLEngine on
SSLCertificateFile "/apps/httpd24/ssl/sunmy/sunmy.crt"
SSLCertificateKeyFile "/apps/httpd24/ssl/sunmy/sunmy.key" 
<FilesMatch "\\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/apps/httpd24/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-5]" \\
         nokeepalive ssl-unclean-shutdown \\
         downgrade-1.0 force-response-1.0
CustomLog "/apps/httpd24/logs/ssl_request_log" \\
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \\"%r\\" %b"
</VirtualHost>                        

以上是关于Apache 2.4使用私有CA证书实现HTTPS加密访问的主要内容,如果未能解决你的问题,请参考以下文章

apache配置CA证书通过https通信

建立私有CA实现证书申请版本

树莓派/Debian Apache2 配置自建 CA 实现 HTTPS(SSL) 服务

实验:建立私有CA,并实现颁发证书(20190123 下午第一节)

创建私有CA

使用 OpenSSL 创建私有 CA:3 用户证书