RHCE 系列(八):在 Apache 上使用網路安全服務(NSS)實現 HTTPS
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 – 配置文件
Listen 443
VirtualHost _default_:443
然後重啟 Apache 並檢查是否載入了 mod_nss 模塊:
# apachectl restart
# httpd -M | grep nss
檢查 Apache 是否載入 mod_nss 模塊
下一步,在 /etc/httpd/conf.d/nss.conf
配置文件中做以下更改:
1、 指定 NSS 資料庫目錄。你可以使用默認的目錄或者新建一個。本文中我們使用默認的:
NSSCertificateDatabase /etc/httpd/alias
2、 通過保存密碼到資料庫目錄中的 /etc/httpd/nss-db-password.conf
文件來避免每次系統啟動時要手動輸入密碼:
NSSPassPhraseDialog file:/etc/httpd/nss-db-password.conf
其中 /etc/httpd/nss-db-password.conf
只包含以下一行,其中 mypassword 是後面你為 NSS 資料庫設置的密碼:
internal:mypassword
另外,要設置該文件的許可權和屬主為 0640 和 root:apache:
# chmod 640 /etc/httpd/nss-db-password.conf
# chgrp apache /etc/httpd/nss-db-password.conf
3、 由於 POODLE SSLv3 漏洞,紅帽建議停用 SSL 和 TLSv1.0 之前所有版本的 TLS(更多信息可以查看這裡)。
確保 NSSProtocol 指令的每個實例都類似下面一樣(如果你沒有託管其它虛擬主機,很可能只有一條):
NSSProtocol TLSv1.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 連接
在上面的情況中,你可以點擊 添加例外 然後 確認安全例外 - 但先不要這麼做。讓我們首先來看看證書看它的信息是否和我們之前輸入的相符(如截圖所示)。
要做到這點,點擊上面的 視圖 -> 詳情 選項卡,當你從列表中選擇發行人你應該看到這個:
確認 Apache SSL 證書詳情
現在你可以繼續,確認例外(限於此次或永久),然後會通過 https 把你帶到你 web 伺服器的 DocumentRoot 目錄,在這裡你可以使用你瀏覽器自帶的開發者工具檢查連接詳情:
在火狐瀏覽器中,你可以通過在屏幕中右擊,然後從上下文菜單中選擇 檢查元素 啟動開發者工具,尤其要看「 網路 」選項卡:
檢查 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
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive