Linux 服务部署:自签 CA 证书构建 HTTPS 及动态 Web 集成

Linux 服务部署:自签 CA 证书构建 HTTPS 及动态 Web 集成

一、HTTPS基础原理

HTTPS是HTTP协议基于SSL/TLS协议的加密版本,核心差异及握手过程如下:

  1. HTTP与HTTPS对比

    协议 传输方式 端口 核心特点
    HTTP 明文传输 80 无加密,安全性低
    HTTPS 数据加密(SSL/TLS) 443 数据加密、身份验证,安全性高
  2. SSL/TLS握手过程(简化)

    • 客户端(Client)动作

      第一步ClientHello:发送支持的SSL/TLS版本、加密算法,生成随机数random_c(32字节)。

      第三步ClientKeyExchange:用服务器公钥加密预处理密钥pre_master,发送给服务器。

    • 服务器(Server)动作

      第二步ServerHello:确定版本和加密算法,生成随机数random_s(32字节);发送证书(含公钥)。

      第四步用私钥解密pre_master,结合random_c+random_s+pre_master生成会话密钥,用于后续数据加密传输。

openssl: 命令的选项

-x509 :生成自签名证书格式,专用于创建私有CA

-new :生成新证书的签署请求

-key :生成请求时用到的私钥文件路径

-out :生成后的文件存放路径,如果是自签名操作,将直接生成签署过的证书

-days :证书有效期 默认是365天

二、CA(证书颁发机构)配置

CA是用于颁发和管理数字证书的机构,私有CA配置步骤如下:

1. 前提准备
  • 在DNS服务器的正向解析文件中添加CA域名解析(如ca.example.com对应IP 192.168.100.10):

    bash 复制代码
    vim /var/named/example.com.zone
    # 添加以下内容
    ca      IN      A       192.168.100.10
    # 保存退出后重启DNS服务
    systemctl restart named
2. CA核心配置文件(/etc/pki/tls/openssl.cnf[CA_default] 段)

查看缺少那些文件没有

bash 复制代码
# 配置文件关键内容如下
dir             = /etc/pki/CA           # CA根目录
certs           = $dir/certs            # 已颁发证书存储目录
database        = $dir/index.txt        # 证书跟踪数据库
new_certs_dir   = $dir/newcerts         # 新证书临时目录
certificate     = $dir/cacert.pem       # CA根证书路径
serial          = $dir/serial           # 证书序列号文件
private_key     = $dir/private/cakey.pem # CA私钥路径(需保密)
RANDFILE        = $dir/private/.rand    # 指定随机数生成器的种子文件路径
3. 生成CA私钥和自签名证书
  1. 生成CA私钥 (权限严格限制,umask 077确保仅root可读写):

    bash 复制代码
    (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem)
  2. 生成CA自签名证书-x509指定自签名格式):

    bash 复制代码
    openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
    • openssl req`**:OpenSSL 中用于处理证书请求(CSR)的子命令。
    • -new:生成新的证书请求。
  • -x509:直接生成自签名证书(通常用于根 CA,因为根证书无需其他机构签名)。

    • -key :指定用于签名的私钥路径(这里是 CA 的私钥 cakey.pem)。
    • -out :指定输出的证书文件路径(生成的 CA 根证书 cacert.pem)。
    • -days 365:设置证书有效期为 365 天(1 年)。

    证书信息(DN 字段)填写详情

    证书需要包含标识身份的"可分辨名称(Distinguished Name, DN)",以下是各字段的输入和含义:

    1. Country Name (2 letter code) [XX]:CN
      • 国家/地区代码(2 个字母),输入 CN 表示"中国"。
    2. State or Province Name (full name) []:HB
      • 省/州名称,输入 HB 通常代表"湖北省"。
    3. Locality Name (eg, city) [Default City]:WH
      • 城市名称,输入 WH 通常代表"武汉市"。
    4. Organization Name (eg, company) [Default Company Ltd]:LQ
      • 组织/公司名称,这里填写自定义名称 LQ
    5. Organizational Unit Name (eg, section) []:linux
      • 部门/单位名称,输入 linux 表示该 CA 属于 Linux 相关部门。
    6. Common Name (eg, your name or your server's hostname) []:ca.example.com
      • 通用名称(核心字段),通常是 CA 服务器的域名,这里设置为 ca.example.com(符合 CA 服务器的命名规范)。
    7. Email Address []:root@example.com
      • 联系邮箱,填写 root@example.com 作为证书管理员的联系方式。
  1. 创建CA必要文件

    bash 复制代码
    touch /etc/pki/CA/index.txt  # 证书数据库
    echo 01 > /etc/pki/CA/serial  # 初始序列号(从01开始)

三、Web服务器证书申请与签名

Web服务器(如Apache)需向CA申请证书,步骤如下:

1. Web服务器生成私钥和CSR(证书签名请求)
  1. 创建存放证书的目录

    bash 复制代码
    mkdir /etc/httpd/ssl  # Apache证书目录
  2. 生成Web服务器私钥

    bash 复制代码
    (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key)
  3. 生成CSR文件 (需与CA信息匹配,主机名填web.example.com):

    bash 复制代码
    openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
    • DN字段示例:国家(CN)、省份(HB)、城市(WH)、组织(LQ)、部门(linux)、主机名(hrz2.example.com)、邮箱(root@example.com)。
2. CA签名Web证书
  1. Web服务器发送CSR给CA

    bash 复制代码
    scp /etc/httpd/ssl/httpd.csr root@ca.example.com:/etc/pki/CA/  # 传输CSR
  2. 在主机CA上 对签署请求进行数字签名,并指明所生成的Web证书的存放路径

    bash 复制代码
    openssl ca -in /etc/pki/CA/httpd.csr -out /etc/pki/CA/httpd.crt -days 365
3. Web服务器获取签名证书
bash 复制代码
scp root@ca.example.com:/etc/pki/CA/httpd.crt /etc/httpd/ssl/  # 下载签名后的证书

四、Apache部署HTTPS站点

通过mod_ssl模块配置Apache支持HTTPS:

1. 安装mod_ssl
bash 复制代码
yum -y install mod_ssl  # 安装SSL模块
2. 配置SSL证书路径

修改/etc/httpd/conf.d/ssl.conf,指定证书和私钥路径:

bash 复制代码
# 编辑配置文件
vim /etc/httpd/conf.d/ssl.conf
# 修改以下两行
SSLCertificateFile /etc/httpd/ssl/httpd.crt  # Web服务器证书
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key  # Web服务器私钥
3. 配置HTTPS虚拟主机

创建/etc/httpd/conf.d/httpd-vhosts.conf,添加虚拟主机配置:

bash 复制代码
# 编辑虚拟主机配置文件
vim /etc/httpd/conf.d/httpd-vhosts.conf
# 添加以下内容
<VirtualHost 192.168.100.20:443>
    DocumentRoot "/var/www/html/test"  # 网站根目录
    ServerName hrz2.example.com  # 绑定域名
    SSLEngine on  # 启用SSL
    SSLCertificateFile /etc/httpd/ssl/httpd.crt  # 证书路径
    SSLCertificateKeyFile /etc/httpd/ssl/httpd.key  # 私钥路径
</VirtualHost>
# 保存退出后重启Apache
systemctl restart httpd
4. 客户端信任CA根证书
  1. 下载CA根证书到客户端

    bash 复制代码
    scp root@192.168.100.10:/etc/pki/CA/cacert.pem .  # 从CA服务器下载
  2. 导入浏览器 (以火狐为例):

    设置 → 首选项 → 高级 → 证书 → 查看证书 → 导入 → 选择cacert.pem → 勾选"信任使用此CA标识的网站" → 确认。


  3. 访问验证

    浏览器访问 https://hrz2.example.com,显示安全连接。

五、集成Python动态Web内容

通过mod_wsgi模块部署Python动态内容:

1. 安装依赖
bash 复制代码
yum -y install httpd mod_wsgi  # 安装Apache和WSGI模块
2. 部署动态内容
  1. 创建存放Python脚本的目录

    bash 复制代码
    mkdir /var/www/wsgi  # 存放Python脚本
    # 将Python动态脚本(如webapp.py)上传至该目录
  2. 配置虚拟主机

    修改/etc/httpd/conf.d/httpd-vhosts.conf,添加HTTP虚拟主机(80端口):

    bash 复制代码
    vim /etc/httpd/conf.d/httpd-vhosts.conf
    # 添加以下内容
    <VirtualHost 192.168.100.20:80>
        DocumentRoot "/var/www/wsgi"
        WSGIScriptAlias  /  "/var/www/wsgi/webapp.py"  # 绑定Python脚本
        ServerName py.example.com  # 动态站点域名
    </VirtualHost>
3. DNS解析配置

在DNS服务器添加py.example.com解析:

bash 复制代码
vim /var/named/example.com.zone
# 添加以下内容
py      IN      A       192.168.100.20  # 解析到Web服务器IP
# 保存退出后重启DNS
systemctl restart named
4. 验证

浏览器访问 http://py.example.com,查看动态内容是否正常加载。

相关推荐
文心快码BaiduComate2 分钟前
WAVE SUMMIT深度学习开发者大会2025举行 文心大模型X1.1发布
前端·后端·程序员
babytiger2 分钟前
python 通过selenium调用chrome浏览器
前端·chrome
passer9819 分钟前
基于webpack的场景解决
前端·webpack
Lynnxiaowen18 分钟前
今天继续昨天的正则表达式进行学习
linux·运维·学习·正则表达式·云计算·bash
奶昔不会射手22 分钟前
css3之grid布局
前端·css·css3
举个栗子dhy26 分钟前
解决在父元素上同时使用 onMouseEnter和 onMouseLeave时导致下拉菜单无法正常展开或者提前收起问题
前端·javascript·react.js
努力学习的小廉29 分钟前
深入了解linux系统—— POSIX信号量
linux·运维·服务器
Coding_Doggy32 分钟前
苍穹外卖前端Day1 | vue基础、Axios、路由vue-router、状态管理vuex、TypeScript
前端
前端与小赵32 分钟前
vue3和vue2生命周期的区别
前端·javascript·vue.js