如何在 Linux 中為需要 CA 根密鑰的多個域創建 ssl 證書
我有郵件伺服器。可能有託管在其上的域。我正在其上部署 ssl 證書。我希望當使用者使用 https 瀏覽器訪問郵件帳戶時應該顯示證書是可信的(在 Chrome 中它應該在地址欄中顯示綠色 https 而不是紅色)。
我發現:
我必須先創建 CA 證書。
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -days 1024 -out rootCA.pem
將其複製到使用者的工作站上。
然後使用以下命令創建密鑰文件。
openssl genrsa -out device.key 2048
和 csr 文件使用該密鑰文件使用命令:
openssl req -new -key device.key -out device.csr
完成後,簽署 CSR,這需要 CA 根密鑰。
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 500
使用上述方法,我只能為單個域創建證書。
如何為多個域創建它。
基於名稱的 SSL 虛擬主機
如果您在單個 IP 地址上使用多個基於名稱的虛擬主機和 SSL,則會出現此問題。在 SSL 握手完成之前,Web 伺服器不知道請求主機的名稱,因為 HTTP 請求標頭是加密內容的一部分。
實際上,像 Apache 這樣的 Web 伺服器將允許您配置基於名稱的 SSL 虛擬主機,但它總是使用第一個列出的虛擬主機(在選定的 IP 地址和埠上)的配置來設置加密層。有關詳細資訊,請參閱https://wiki.apache.org/httpd/NameBasedSSLVHosts。
如果多個虛擬主機位於同一個域中,您可以使用一個證書使用萬用字元證書,例如
*.example.com
,它適用於one.example.com
和two.example.com
。具有 SNI 的基於名稱的 SSL 虛擬主機
解決方案是 SSL 協議的擴展,稱為伺服器名稱指示 (SNI),它允許客戶端在其 SSL 握手的第一條消息中包含請求的主機名。有關詳細資訊,請參閱https://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI。
Apache 需要使用 OpenSSL 建構(
enable-tlsext
啟用 TLS 擴展選項;OpenSSL 0.9.8k 及更高版本預設啟用此功能)要檢查您的 Apache 安裝是否支持 SNI,請執行以下步驟:
在以下位置為 SSL 啟用 NameVirtualHost
/etc/apache2/ports.conf
:<IfModule mod_ssl.c> NameVirtualHost *:443 Listen 443 </IfModule>
在中創建兩個 SSL VirtualHosts
/etc/apache2/sites-available/default-ssl
<VirtualHost *:443> ServerName www.example1.com DocumentRoot /var/www/example1 SSLEngine on SSLCertificateFile /etc/apache2/example1.com.cert SSLCertificateKeyFile /etc/apache2/example1.com.key </VirtualHost> <VirtualHost *:443> ServerName www.example2.com DocumentRoot /var/www/example2 SSLEngine on SSLCertificateFile /etc/apache2/example2.com.cert SSLCertificateKeyFile /etc/apache2/example2.com.key </VirtualHost>
啟用 mod_ssl:
# a2enmod ssl
啟用 SSL 站點:
# a2ensite default-ssl
重啟阿帕奇:
# /etc/init.d/apache2 restart
現在,如果您跟踪 Apache 錯誤日誌並看到以下消息,這意味著 SNI 是內置的。
[warn] Init: Name-based SSL virtual hosts only work for clients with \ TLS server name indication support (RFC 4366)
否則,您將看到 Apache 啟動一條消息,例如
You should not use name-based virtual hosts in conjunction with SSL!!
現在,如果您簽署了您的兩個證書
example1.com.cert
並example2.com.cert
使用您的 CA 證書,將其添加到瀏覽器的受信任列表中並且您的瀏覽器支持 SNI,那麼您應該能夠訪問https://www.example1.com
並且https://www.example2.com
不會受到瀏覽器的任何投訴。使用 GnuTLS 的基於名稱的 SSL 虛擬主機
GnuTLS 是傳輸層安全的 LGPL 許可實現,是 SSL 的繼任者。使用 GnuTLS,您可以創建對多個域和萬用字元域有效的單個證書,如下所示:
DNS Name: example1.com DNS Name: *.example1.com DNS Name: example2.com DNS Name: *.example2.com DNS Name: example3.com DNS Name: *.example3.com
有關使用 GnuTLS 的詳細指南,請參閱https://help.ubuntu.com/community/GnuTLS。