Linux

如何在 Linux 中為需要 CA 根密鑰的多個域創建 ssl 證書

  • July 9, 2018

我有郵件伺服器。可能有託管在其上的域。我正在其上部署 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.comtwo.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.certexample2.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

引用自:https://serverfault.com/questions/574974