Linux 服務部署:自簽 CA 證書構建 HTTPS 及動態 Web 集成
一、HTTPS基礎原理
HTTPS是HTTP協議基于SSL/TLS協議的加密版本,核心差異及握手過程如下:
-
HTTP與HTTPS對比
協議 傳輸方式 端口 核心特點 HTTP 明文傳輸 80 無加密,安全性低 HTTPS 數據加密(SSL/TLS) 443 數據加密、身份驗證,安全性高 -
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
對應IP192.168.100.10
):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]
段)
查看缺少那些文件沒有
# 配置文件關鍵內容如下
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私鑰和自簽名證書
-
生成CA私鑰(權限嚴格限制,
umask 077
確保僅root可讀寫):(umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem)
-
生成CA自簽名證書(
-x509
指定自簽名格式):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)”,以下是各字段的輸入和含義:
Country Name (2 letter code) [XX]:CN
- 國家/地區代碼(2 個字母),輸入
CN
表示“中國”。
- 國家/地區代碼(2 個字母),輸入
State or Province Name (full name) []:HB
- 省/州名稱,輸入
HB
通常代表“湖北省”。
- 省/州名稱,輸入
Locality Name (eg, city) [Default City]:WH
- 城市名稱,輸入
WH
通常代表“武漢市”。
- 城市名稱,輸入
Organization Name (eg, company) [Default Company Ltd]:LQ
- 組織/公司名稱,這里填寫自定義名稱
LQ
。
- 組織/公司名稱,這里填寫自定義名稱
Organizational Unit Name (eg, section) []:linux
- 部門/單位名稱,輸入
linux
表示該 CA 屬于 Linux 相關部門。
- 部門/單位名稱,輸入
Common Name (eg, your name or your server's hostname) []:ca.example.com
- 通用名稱(核心字段),通常是 CA 服務器的域名,這里設置為
ca.example.com
(符合 CA 服務器的命名規范)。
- 通用名稱(核心字段),通常是 CA 服務器的域名,這里設置為
Email Address []:root@example.com
- 聯系郵箱,填寫
root@example.com
作為證書管理員的聯系方式。
- 聯系郵箱,填寫
- 創建CA必要文件:
touch /etc/pki/CA/index.txt # 證書數據庫 echo 01 > /etc/pki/CA/serial # 初始序列號(從01開始)
三、Web服務器證書申請與簽名
Web服務器(如Apache)需向CA申請證書,步驟如下:
1. Web服務器生成私鑰和CSR(證書簽名請求)
-
創建存放證書的目錄:
mkdir /etc/httpd/ssl # Apache證書目錄
-
生成Web服務器私鑰:
(umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key)
-
生成CSR文件(需與CA信息匹配,主機名填
web.example.com
):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證書
-
Web服務器發送CSR給CA:
scp /etc/httpd/ssl/httpd.csr root@ca.example.com:/etc/pki/CA/ # 傳輸CSR
-
在主機CA上 對簽署請求進行數字簽名,并指明所生成的Web證書的存放路徑:
openssl ca -in /etc/pki/CA/httpd.csr -out /etc/pki/CA/httpd.crt -days 365
3. Web服務器獲取簽名證書
scp root@ca.example.com:/etc/pki/CA/httpd.crt /etc/httpd/ssl/ # 下載簽名后的證書
四、Apache部署HTTPS站點
通過mod_ssl
模塊配置Apache支持HTTPS:
1. 安裝mod_ssl
yum -y install mod_ssl # 安裝SSL模塊
2. 配置SSL證書路徑
修改/etc/httpd/conf.d/ssl.conf
,指定證書和私鑰路徑:
# 編輯配置文件
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
,添加虛擬主機配置:
# 編輯虛擬主機配置文件
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 # 啟用SSLSSLCertificateFile /etc/httpd/ssl/httpd.crt # 證書路徑SSLCertificateKeyFile /etc/httpd/ssl/httpd.key # 私鑰路徑
</VirtualHost>
# 保存退出后重啟Apache
systemctl restart httpd
4. 客戶端信任CA根證書
-
下載CA根證書到客戶端:
scp root@192.168.100.10:/etc/pki/CA/cacert.pem . # 從CA服務器下載
-
導入瀏覽器(以火狐為例):
設置 → 首選項 → 高級 → 證書 → 查看證書 → 導入 → 選擇cacert.pem
→ 勾選“信任使用此CA標識的網站” → 確認。
-
訪問驗證:
瀏覽器訪問https://hrz2.example.com
,顯示安全連接。
五、集成Python動態Web內容
通過mod_wsgi
模塊部署Python動態內容:
1. 安裝依賴
yum -y install httpd mod_wsgi # 安裝Apache和WSGI模塊
2. 部署動態內容
-
創建存放Python腳本的目錄:
mkdir /var/www/wsgi # 存放Python腳本 # 將Python動態腳本(如webapp.py)上傳至該目錄
-
配置虛擬主機:
修改/etc/httpd/conf.d/httpd-vhosts.conf
,添加HTTP虛擬主機(80端口):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
解析:
vim /var/named/example.com.zone
# 添加以下內容
py IN A 192.168.100.20 # 解析到Web服務器IP
# 保存退出后重啟DNS
systemctl restart named
4. 驗證
瀏覽器訪問 http://py.example.com
,查看動態內容是否正常加載。