2021-05-12 14:32:11
RHCE 系列(八):在 Apache 上使用網路安全服務(NSS)實現 HTTPS
如果你是一個負責維護和確保 web 伺服器安全的系統管理員,你需要花費最大的精力確保伺服器中處理和通過的資料任何時候都受到保護。
RHCE 系列:第八部分 - 使用網路安全服務(NSS)為 Apache 通過 TLS 實現 HTTPS
為了在用戶端和伺服器之間提供更安全的連線,作為 HTTP 和 SSL(Secure Sockets Layer(安全通訊協定))或者最近稱為 TLS(Transport Layer Security(傳輸層安全))的組合,產生了 HTTPS 協定。
由於一些嚴重的安全漏洞,SSL 已經被更健壯的 TLS 替代。由於這個原因,在這篇文章中我們會解析如何通過 TLS 實現你 web 伺服器和用戶端之間的安全連線。
這裡假設你已經安裝並設定好了 Apache web 伺服器。如果還沒有,在進入下一步之前請閱讀下面站點中的文章。
安裝 OpenSSL 和一些工具包
首先,確保正在執行 Apache 並且允許 http 和 https 通過防火牆:
#systemctl start http
#systemctl enable http
# firewall-cmd --permanent –-add-service=http
# firewall-cmd --permanent –-add-service=https
然後安裝一些必需的軟體包:
#yum update &&yum install openssl mod_nss crypto-utils
重要:請注意如果你想使用 OpenSSL 庫而不是 NSS(Network Security Service(網路安全服務))實現 TLS,你可以在上面的命令中用 mod_ssl 替換 mod_nss(使用哪一個取決於你,但在這篇文章中我們會使用 NSS,因為它更加安全,比如說,它支援最新的加密標準,比如 PKCS #11)。
如果你使用 mod_nss,首先要解除安裝 mod_ssl,反之如此。
#yum remove mod_ssl
設定 NSS(網路安全服務)
安裝完 mod_nss 之後,會建立預設的組態檔 /etc/httpd/conf.d/nss.conf
。你應該確保所有 Listen 和 VirualHost 指令都指向 443 號埠(HTTPS 預設埠):
nss.conf – 組態檔
Listen443
VirtualHost _default_:443
然後重新啟動 Apache 並檢查是否載入了 mod_nss 模組:
# apachectl restart
# httpd -M |grep nss
在 Apache 中檢查 mod_nss 模組
檢查 Apache 是否載入 mod_nss 模組
下一步,在 /etc/httpd/conf.d/nss.conf
組態檔中做以下更改:
1、 指定 NSS 資料庫目錄。你可以使用預設的目錄或者新建一個。本文中我們使用預設的:
NSSCertificateDatabase/etc/httpd/alias
2、 通過儲存密碼到資料庫目錄中的 /etc/httpd/nss-db-password.conf
檔案來避免每次系統啟動時要手動輸入密碼:
NSSPassPhraseDialogfile:/etc/httpd/nss-db-password.conf
其中 /etc/httpd/nss-db-password.conf
只包含以下一行,其中 mypassword 是後面你為 NSS 資料庫設定的密碼:
internal:mypassword
另外,要設定該檔案的許可權和屬主為 0640 和 root:apache:
#chmod640/etc/httpd/nss-db-password.conf
#chgrp apache /etc/httpd/nss-db-password.conf
3、 由於 POODLE SSLv3 漏洞,紅帽建議停用 SSL 和 TLSv1.0 之前所有版本的 TLS(更多資訊可以檢視這裡)。
確保 NSSProtocol 指令的每個範例都類似下面一樣(如果你沒有託管其它虛擬主機,很可能只有一條):
NSSProtocolTLSv1.0,TLSv1.1
4、 由於這是一個自簽名證書,Apache 會拒絕重新啟動,並不會識別為有效發行人。由於這個原因,對於這種特殊情況我們還需要新增:
NSSEnforceValidCerts off
5、 雖然並不是嚴格要求,為 NSS 資料庫設定一個密碼同樣很重要:
# certutil -W -d /etc/httpd/alias
為 NSS 資料庫設定密碼
建立一個 Apache SSL 自簽名證書
下一步,我們會建立一個自簽名證書來讓我們的客戶機可以識別伺服器(請注意這個方法對於生產環境並不是最好的選擇;對於生產環境你應該考慮購買第三方可信證書機構驗證的證書,例如 DigiCert)。
我們用 genkey 命令為 box1 建立有效期為 365 天的 NSS 相容證書。完成這一步後:
# genkey --nss --days 365 box1
選擇 Next:
建立 Apache SSL 金鑰
你可以使用預設的金鑰大小(2048),然後再次選擇 Next:
選擇 Apache SSL 金鑰大小
等待系統生成隨機位元:
生成隨機金鑰位元
為了加快速度,會提示你在控制台輸入隨機字元,正如下面的截圖所示。請注意當沒有從鍵盤接收到輸入時進度條是如何停止的。然後,會讓你選擇:
-
是否傳送驗證簽名請求(CSR)到一個驗證機構(CA):選擇 No,因為這是一個自簽名證書。
-
為證書輸入資訊。
最後,會提示你輸入之前給 NSS 證書設定的密碼:
# genkey --nss --days 365 box1
Apache NSS 證書密碼
需要的話,你可以用以下命令列出現有的證書:
# certutil –L –d /etc/httpd/alias
列出 Apache NSS 證書
然後通過名字刪除(如果你真的需要刪除的,用你自己的證書名稱替換 box1):
# certutil -d /etc/httpd/alias-D -n "box1"
如果你需要繼續進行的話,請繼續閱讀。
測試 Apache SSL HTTPS 連線
最後,是時候測試到我們伺服器的安全連線了。當你用瀏覽器開啟 https://<web 伺服器 IP 或主機名>,你會看到著名的資訊 “This connection is untrusted”:
檢查 Apache SSL 連線
在上面的情況中,你可以點選新增例外(Add Exception) 然後確認安全例外(Confirm Security Exception) - 但先不要這麼做。讓我們首先來看看證書看它的資訊是否和我們之前輸入的相符(如截圖所示)。
要做到這點,點選上面的檢視(View...)-> 詳情(Details)索引標籤,當你從列表中選擇發行人你應該看到這個:
確認 Apache SSL 證書詳情
現在你可以繼續,確認例外(限於此次或永久),然後會通過 https 把你帶到你 web 伺服器的 DocumentRoot 目錄,在這裡你可以使用你瀏覽器自帶的開發者工具檢查連線詳情:
在火狐瀏覽器中,你可以通過在螢幕中右擊,然後從上下文選單中選擇檢查元素(Inspect Element)啟動開發者工具,尤其要看“網路(Network)”索引標籤:
檢查 Apache HTTPS 連線
請注意這和之前顯示的在驗證過程中輸入的資訊一致。還有一種方式通過使用命令列工具測試連線:
左圖(測試 SSLv3):
# openssl s_client -connect localhost:443-ssl3
右圖(測試 TLS):
# openssl s_client -connect localhost:443-tls1
測試 Apache SSL 和 TLS 連線
參考上面的截圖了解更詳細資訊。
總結
我想你已經知道,使用 HTTPS 會增加會在你站點中輸入個人資訊的訪客的信任(從使用者名稱和密碼到任何商業/銀行賬戶資訊)。
在那種情況下,你會希望獲得由可信驗證機構簽名的證書,正如我們之前解釋的(步驟和設定需要啟用例外的證書的步驟相同,傳送 CSR 到 CA 然後獲得返回的簽名證書);否則,就像我們的例子中一樣使用自簽名證書即可。
要獲取更多關於使用 NSS 的詳情,可以參考關於 mod-nss 的線上幫助。如果你有任何疑問或評論,請告訴我們。
via: http://www.tecmint.com/create-apache-https-self-signed-certificate-using-nss/
作者:Gabriel Cánepa 譯者:ictlyh 校對:wxy
本文永久更新連結地址:http://www.linuxidc.com/Linux/2015-12/125942.htm
相關文章