返回文章列表

網站加密技術演進與證書實作

本文探討網站加密技術的演進,從早期瀏覽器加密外掛到現代 SSL/TLS 協定,並解析不同證書型別及其應用場景。同時,文章提供 OpenSSL 工具的實作,涵蓋 RSA 和 EC 金鑰的生成、憑證簽署請求的建立以及私有 CA 的設定。此外,文章也介紹如何使用 Dogtag PKI 建立和管理私有 CA,以及如何在

網路安全 Web 開發

從早期瀏覽器加密外掛到現代根據 SSL/TLS 協定的加密機制,網站安全技術經歷了顯著的發展。如今,SSL/TLS 已成為網站安全的重要根本,其結合對稱式和非對稱式加密,在保障資料傳輸安全性的同時兼顧效能。不同型別的證書,如網域驗證(DV)和延伸驗證(EV),提供不同等級的身份驗證和安全性,滿足不同網站的需求。Let’s Encrypt 的出現降低了網站加密的門檻,但也帶來了新的安全挑戰。理解這些技術的演進和應用,對於構建安全的網站至關重要。

網站加密技術的演進與證書型別解析

在網際網路早期,安全加密技術的發展仍處於初期階段。一個名為 Fortify 的澳洲公司曾推出一款強加密外掛,供使用者安裝於 Netscape 瀏覽器上,使其能夠使用 128 位元加密。然而,由於當時美國法律限制,網站營運者仍無法在伺服器上使用強加密技術。如今,Fortify 的網站仍然存在,但該外掛已無實際用途。

SSL/TLS 工作原理

SSL/TLS 加密連線結合了對稱式與非對稱式加密機制。在實際資料傳輸過程中,為了確保效能,採用對稱式加密;而對稱式加密所需的私鑰則透過非對稱式加密機制進行安全交換。具體步驟如下:

  1. 首先,建立非對稱式加密連線,使用公開金鑰交換機制。
  2. 成功建立非對稱式連線後,雙方安全地交換用於對稱式加密的私鑰。
  3. 之後,所有資料傳輸均採用對稱式加密,以確保高效能的資料傳輸。

商業證書機構與證書型別

要在網站上實作 SSL/TLS,需要安裝安全證書。該證書具有兩個主要功能:

  1. 包含用於建立非對稱金鑰交換的公開金鑰。
  2. 可選地驗證網站身份,即進行身份驗證。

市面上有許多證書機構(CA),如 Thawte、Symantec、GoDaddy 和 Let’s Encrypt 等,提供不同等級的證書。以下以 GoDaddy 為例,說明不同證書型別的區別:

  • 網域驗證(DV):價格最低,僅驗證網域所有權,適用於只需加密的場合。
  • 延伸驗證(EV):最高等級的證書,需經過嚴格身份驗證,曾經在瀏覽器中顯示綠色高保證欄,但現已取消。

延伸驗證證書的有效性

儘管 EV 證書經過嚴格驗證,但其價值仍被質疑。例如,曾有安全研究人員成功為合法公司註冊偽造的 EV 證書。此外,錯誤資訊也可能透過 EV 證書驗證。因此,部分瀏覽器已不再特別標示 EV 證書。

Let’s Encrypt 的影響

Let’s Encrypt 為一非營利組織,旨在推廣網站加密。其特點是免費且自動化取得證書,無需繁瑣的手動操作。然而,這也帶來了潛在的安全問題:惡意使用者可輕易取得證書並建立看似合法的子網域,從而進行網路網路釣魚攻擊。

SSL/TLS 加密技術實作

在探討 SSL/TLS 加密技術之前,瞭解憑證供應商的重要性是至關重要的。選擇合適的憑證供應商需要進行充分的研究,因為即使是大品牌供應商也可能出現問題。幾年前,Google 從 Chrome 的受信任憑證授權單位列表中移除 Symantec,就是因為 Symantec 多次違反行業最佳實踐。

現在,讓我們來看看如何使用 OpenSSL 套件實作 SSL/TLS 加密。

建立金鑰、憑證簽署請求和憑證

無論使用哪種較新的 Linux 發行版,此過程都是相同的。OpenSSL 可能有點難以學習,因為它有很多子命令,每個子命令都有自己的選項和引數。

使用 RSA 金鑰建立自簽憑證

自簽憑證在只需要加密或用於測試目的時非常有用。自簽憑證不涉及身份驗證,因此絕不能在需要使用者信任的伺服器上使用。

假設需要測試新的網站設定,並且不想使用真正的金鑰和憑證。可以使用以下命令建立金鑰和自簽憑證:

openssl req -newkey rsa:2048 -nodes -keyout donnie-domain.key-x509 -days 365 -out donnie-domain.crt

內容解密:

  • openssl:使用 OpenSSL 並以正常使用者許可權執行。
  • req:管理憑證簽署請求(CSR)的子命令。
  • -newkey rsa:2048:建立一個 2048 位的 RSA 金鑰對。
  • -nodes:不加密私鑰。
  • -keyout donnie-domain.key-x509:建立私鑰並命名為 donnie-domain.key-x509,用於自簽憑證。
  • -days 365:憑證的有效期為一年。
  • -out donnie-domain.crt:建立憑證並命名為 donnie-domain.crt

執行此命令後,需要輸入有關業務和伺服器的資訊。建立金鑰和憑證後,需要將它們移動到適當的位置並組態 Web 伺服器以找到它們。

加密私鑰

加密私鑰是一個可選步驟。如果加密私鑰,每次重新啟動 Web 伺服器時都需要輸入私鑰密碼。

openssl rsa -aes256 -in donnie-domain.key-x509 -out donnie-domain-encrypted.key-x509

內容解密:

  • rsa -aes256:使用 AES256 加密演算法加密 RSA 金鑰。
  • -in donnie-domain.key-x509:輸入未加密的私鑰。
  • -out donnie-domain-encrypted.key-x509:輸出加密後的私鑰。

使用橢圓曲線金鑰建立自簽憑證

RSA 金鑰有其缺點。可以使用橢圓曲線金鑰建立自簽憑證:

openssl req -new -x509 -nodes -newkey ec:<(openssl ecparam -name secp384r1) -keyout cert.key.x509

內容解密:

  • ec:<(openssl ecparam -name secp384r1):使用 secp384r1 名稱曲線演算法建立一個 384 位的橢圓曲線金鑰。

建立 RSA 金鑰和憑證簽署請求

通常,不會為導向公眾的伺服器使用自簽憑證。需要從商業 CA 取得憑證,以驗證伺服器擁有者的身份。

openssl req --out CSR.csr -new -newkey rsa:2048 -nodes -keyout server-privatekey.key

內容解密:

  • --out CSR.csr:建立 CSR 並命名為 CSR.csr
  • -new:新的請求。
  • -newkey rsa:2048:建立一個 2048 位的 RSA 金鑰對。
  • -nodes:不加密私鑰。
  • -keyout server-privatekey.key:建立私鑰並命名為 server-privatekey.key

這些步驟展示瞭如何使用 OpenSSL 建立和管理 SSL/TLS 加密所需的金鑰和憑證。正確組態和管理這些元件對於確保 Web 伺服器的安全至關重要。

建立數位憑證與私鑰:技術深度解析

在現代網路安全中,數位憑證與私鑰扮演著至關重要的角色。本文將探討如何使用 OpenSSL 工具建立 RSA 與 EC(橢圓曲線)私鑰及憑證簽署請求(CSR),並介紹如何設定私有憑證授權中心(CA)。

建立 RSA 私鑰與 CSR

RSA 演算法曾經是網路加密的主流選擇,但隨著技術的發展,EC 演算法因其更高的安全性和效率逐漸受到青睞。儘管如此,瞭解 RSA 的使用仍然十分重要。

RSA 私鑰與 CSR 生成

openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr

內容解密:

  • req:指示 OpenSSL 生成憑證簽署請求。
  • -new:表示建立新的 CSR。
  • -newkey rsa:2048:生成新的 RSA 私鑰,長度為 2048 位元。
  • -nodes:不對私鑰進行加密,方便使用但降低了安全性。
  • -keyout server.key:指定私鑰輸出的檔案名稱。
  • -out server.csr:指定 CSR 輸出的檔案名稱。

過程中會提示輸入組織資訊和 challenge password。Challenge password 是一個分享秘密,用於日後可能的憑證重新安裝。

建立 EC 私鑰與 CSR

相較於 RSA,EC 提供了更好的安全性和效能。建立 EC 私鑰和 CSR 需要兩個步驟:

Step 1: 生成 EC 私鑰

openssl genpkey -algorithm EC -out eckey.pem -pkeyopt ec_paramgen_curve:P-384 -pkeyopt ec_param_enc:named_curve

內容解密:

  • genpkey:OpenSSL 生成私鑰的指令。
  • -algorithm EC:指定使用 EC 演算法。
  • -out eckey.pem:輸出私鑰到 eckey.pem 檔案。
  • -pkeyopt ec_paramgen_curve:P-384:選擇 P-384 曲線,生成 384 位元的 EC 金鑰,提供與 2048 位元 RSA 相當的安全性。
  • -pkeyopt ec_param_enc:named_curve:使用命名曲線編碼。

Step 2: 生成 CSR

openssl req -new -key eckey.pem -out eckey.csr

內容解密:

使用先前生成的 EC 私鑰 eckey.pem 簽署新的 CSR,並輸出到 eckey.csr

建立內部使用的私有 CA

對於組織內部使用,購買商業憑證可能不切實際或成本過高。建立私有 CA 成為一個可行的替代方案。

Dogtag PKI 簡介

Dogtag PKI 提供了一個更為友好的介面來管理私有 CA,相較於直接使用 OpenSSL,其設定和使用都更加簡便。

設定 Dogtag CA 的前置作業

  1. 設定 FQDN:確保伺服器具有完全合格的網域名稱(FQDN)。
  2. DNS 設定:在本地 DNS 伺服器中建立 Dogtag 伺服器的記錄,或在其 /etc/hosts 檔案中新增相應條目。

在 AlmaLinux 9 或 Ubuntu 22.04 上安裝 Dogtag 憑證系統

在開始之前,請先準備好兩個 Linux 虛擬機器(VM),其中一個將用於安裝 Dogtag 伺服器,另一個則用於透過桌面環境存取 Dogtag 的網頁介面。

步驟1:設定伺服器虛擬機器的 FQDN

首先,在伺服器虛擬機器上設定一個完整的網域名稱(FQDN)。以 donnie-ca.local 為例,您可以使用以下指令:

sudo hostnamectl set-hostname donnie-ca.local

步驟2:編輯 /etc/hosts 檔案

接下來,編輯 /etc/hosts 檔案,新增一行包含您的虛擬機器 IP 位址和 FQDN 的記錄。例如:

192.168.0.53 donnie-ca.local

步驟3:增加檔案描述符限制

為了避免在執行 Directory Server 安裝程式時出現警告訊息,需要增加系統允許開啟的檔案描述符數量。編輯 /etc/security/limits.conf 檔案,在檔案末尾新增以下兩行:

root hard nofile 4096
root soft nofile 4096

步驟4:重新啟動虛擬機器

重新啟動虛擬機器,以使新的主機名稱和檔案描述符限制生效。

sudo shutdown -r now

步驟5:安裝 LDAP 伺服器和 Dogtag 軟體套件

Dogtag 將其憑證和使用者資訊儲存在 LDAP 資料函式庫中。因此,需要安裝 LDAP 伺服器軟體套件和 Dogtag 軟體套件。

在 AlmaLinux 9 上:

sudo dnf install 389-ds-base pki-ca

在 Ubuntu 22.04 上:

sudo apt install 389-ds-base dogtag-pki

步驟6:建立 LDAP Directory Server (DS) 例項

建立一個名為 instance.inf 的檔案於 root 使用者的家目錄中:

sudo vim /root/instance.inf

檔案內容如下所示,請根據您的需求修改 root_passwordsuffix

# /root/instance.inf
[general]
config_version = 2
[slapd]
root_password = TurkeyLips
[backend-userroot]
sample_entries = yes
suffix = dc=donnie-ca,dc=local

使用 dscreate 工具根據 instance.inf 檔案建立 Directory Server 例項:

sudo dscreate from-file /root/instance.inf

步驟7:建立憑證授權中心(CA)

執行以下指令以建立 CA:

sudo pkispawn

依照提示進行設定,大部分選項可直接接受預設值。當詢問是否開始安裝時,輸入 Yes。在 Directory Server 部分,輸入之前建立 DS 例項時所使用的密碼。

建立完成後,確保 Dogtag 服務能夠自動啟動:

sudo systemctl enable pki-tomcatd.target
sudo shutdown -r now

步驟8:清理與安全措施

安裝完成後,可以刪除包含密碼的 instance.inf 檔案:

sudo shred -u -z /root/instance.inf

步驟9:開啟防火牆埠

需要在防火牆上開啟 8443/tcp 埠,以便能夠存取 Dogtag 的網頁介面。

在 AlmaLinux 上:

sudo firewall-cmd --permanent --add-port=8443/tcp
sudo firewall-cmd --reload

在 Ubuntu 上(假設使用 Uncomplicated Firewall):

sudo ufw allow 8443/tcp

存取 Dogtag 網頁介面

  1. 在另一個具備桌面環境的 Linux 虛擬機器上,編輯 /etc/hosts 檔案,新增與伺服器虛擬機器相同的 FQDN 對應記錄。
  2. 開啟 Firefox 瀏覽器並導航至 Dogtag 控制台,網址格式為 https://您的FQDN:8443
  3. 由於使用的是自我簽署憑證,您將收到憑證無效的警告。暫時新增例外規則以繼續。

使用者憑證請求流程

  1. 使用者使用 openssl 建立金鑰和憑證簽署請求(CSR)。
  2. 使用者在 Dogtag 的 SSL End User Services 頁面提交 CSR 以請求憑證。
  3. 管理員在 Agent Services 頁面審核並核發憑證。

圖表翻譯:

此圖示說明瞭使用者請求憑證的流程,包括建立 CSR、提交請求以及管理員核發憑證的步驟。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 網站加密技術演進與證書實作

package "安全架構" {
    package "網路安全" {
        component [防火牆] as firewall
        component [WAF] as waf
        component [DDoS 防護] as ddos
    }

    package "身份認證" {
        component [OAuth 2.0] as oauth
        component [JWT Token] as jwt
        component [MFA] as mfa
    }

    package "資料安全" {
        component [加密傳輸 TLS] as tls
        component [資料加密] as encrypt
        component [金鑰管理] as kms
    }

    package "監控審計" {
        component [日誌收集] as log
        component [威脅偵測] as threat
        component [合規審計] as audit
    }
}

firewall --> waf : 過濾流量
waf --> oauth : 驗證身份
oauth --> jwt : 簽發憑證
jwt --> tls : 加密傳輸
tls --> encrypt : 資料保護
log --> threat : 異常分析
threat --> audit : 報告生成

@enduml

圖表翻譯: 此圖示顯示了使用者如何請求憑證的流程,從建立 CSR 到取得核發的憑證。

將 CA 新增至作業系統與瀏覽器信任儲存區

為了避免使用者收到關於網站使用不受信任憑證的警告,需要將私有的 CA 憑證匯出並匯入至瀏覽器的信任儲存區。

  1. 從 Dogtag 伺服器匯出 CA 憑證。
  2. 將匯出的憑證匯入至使用者的瀏覽器信任儲存區中。

如此一來,使用者在存取使用由該 CA 核發的憑證的網站時,便不會再收到關於憑證不受信任的警告訊息。

加強Apache SSL/TLS設定的安全

在安裝網頁伺服器時,預設的設定並不夠安全,因此需要進行強化。其中一個方法是停用較弱的SSL/TLS加密演算法。雖然這裡以Apache為例,但這些原則也適用於其他網頁伺服器。

OpenSSL與Apache網頁伺服器

在1990年代,Netscape的工程師發明瞭SSL協定。第一個發行的版本是SSL版本2(SSLv2),後來由於安全性問題而被SSLv3取代。接著,微軟堅持將下一版本重新命名為傳輸層安全性(TLS)版本1(TLSv1)。目前的版本是TLSv1.3,大多數Linux發行版都支援這個版本。

在Ubuntu上強化Apache SSL/TLS

步驟1:安裝Apache和mod_ssl

首先,在Ubuntu 22.04虛擬機器上安裝Apache:

sudo apt install apache2

這也會安裝mod_ssl套件,其中包含SSL/TLS實作所需的函式庫和設定檔。

步驟2:啟用預設SSL網站和SSL模組

執行以下命令以啟用預設SSL網站和SSL模組:

sudo a2ensite default-ssl.conf
sudo a2enmod ssl
sudo systemctl restart apache2

步驟3:設定掃描器虛擬機器

在第二個Ubuntu虛擬機器上安裝sslscan套件:

sudo apt install sslscan

然後,使用以下命令掃描安裝了Apache的Ubuntu虛擬機器的SSL/TLS設定:

sslscan 192.168.0.3

檢查支援的演算法和協定版本。

步驟4:修改SSL/TLS設定

編輯/etc/apache2/mods-enabled/ssl.conf檔案,將以下行:

SSLProtocol all -SSLv3

修改為:

SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1

然而,根據前文,應修改為停用舊版協定,但務必確認正確的設定。重新啟動Apache服務以套用變更:

sudo systemctl restart apache2

再次掃描虛擬機器以驗證變更。

在RHEL 9/AlmaLinux 9上強化Apache SSL/TLS

步驟1:安裝Apache和mod_ssl

在AlmaLinux 9虛擬機器上安裝Apache和mod_ssl:

sudo dnf install httpd mod_ssl
sudo systemctl enable --now httpd

步驟2:開啟防火牆的443埠

執行以下命令以開啟防火牆的443埠:

sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

步驟3:掃描Apache虛擬機器的SSL/TLS設定

從掃描器虛擬機器掃描Apache虛擬機器的SSL/TLS設定:

sslscan 192.168.0.160

步驟4:檢視系統範圍的加密設定

在Apache虛擬機器上,檢視系統範圍的加密設定的狀態:

sudo update-crypto-policies --show
內容解密:

上述程式展示瞭如何強化Apache網頁伺服器的SSL/TLS設定,包括停用舊版協定和使用sslscan工具進行掃描。透過這些步驟,可以顯著提升網頁伺服器的安全性。