<-
Apache > HTTP Server > 文件 > 版本 2.4 > SSL/TLS

SSL/TLS 強力加密:如何操作

可用的語言:  en  |  fr 

本文旨在協助您入門並進行一些操作。強烈建議您在進行進階技術之前,閱讀其餘 SSL 文件並更深入了解該素材。

Support Apache!

另請參閱

top

基本設定範例

您的 SSL 設定至少需要包含下列指令。

LoadModule ssl_module modules/mod_ssl.so

Listen 443
<VirtualHost *:443>
    ServerName www.example.com
    SSLEngine on
    SSLCertificateFile "/path/to/www.example.com.cert"
    SSLCertificateKeyFile "/path/to/www.example.com.key"
</VirtualHost>
top

密碼組與強制執行強安全性

要如何建立僅接受強加密的 SSL 伺服器?

下列指令僅啟用最強大的密碼

SSLCipherSuite HIGH:!aNULL:!MD5

透過下列設定,您可以偏好特定的速度最佳化密碼(由 mod_ssl 選擇,前提是客戶端支援)

SSLCipherSuite RC4-SHA:AES128-SHA:HIGH:!aNULL:!MD5
SSLHonorCipherOrder on

要如何建立一般而言接受所有類型密碼的 SSL 伺服器,但需要強密碼才能存取特定 URL?

顯然,一個限制密碼為強變種的伺服器廣域 SSLCipherSuite 並非此處的答案。但是,mod_ssl 可以在 Location 區塊中重新設定,以提供每個目錄的解決方案,並且可以自動強制重新協商 SSL 參數以符合新的設定。這是可以執行的步驟

# be liberal in general
SSLCipherSuite ALL:!aNULL:RC4+RSA:+HIGH:+MEDIUM:+LOW:+EXP:+eNULL

<Location "/strong/area">
# but https://hostname/strong/area/ and below
# requires strong ciphers
SSLCipherSuite HIGH:!aNULL:!MD5
</Location>
top

OCSP 主釘

線上證書狀態通訊協定 (OCSP) 是一種判斷伺服器證書是否已撤銷的機制,而 OCSP 釘證是其一種特殊形式,其中,伺服器(例如 httpd 和 mod_ssl)會維護它證書的目前 OCSP 回應,並將它們傳送給與伺服器通訊的用戶端。大多數證書包含發證憑證頒發中心維護的 OCSP 應答器的地址,而 mod_ssl 可以與該應答器通訊取得簽署回應,此回應可傳送給與伺服器通訊的用戶端。

由於用戶端可以從伺服器取得證書撤銷狀態,而不需要用戶端與憑證頒發中心之間的額外連線,因此 OCSP 釘證是取得撤銷狀態的首選方式。消除用戶端與憑證頒發中心之間通訊的其他好處是,用戶端的瀏覽記錄不會暴露於憑證頒發中心,而且取得狀態更可靠,因為不依賴可能負載過重的憑證頒發中心伺服器。

由於伺服器取得的回應可在回應有效期間重複使用於使用相同證書的所有用戶端,因此伺服器的負擔很小。

在已適當設定一般 SSL 支援後,啟用 OCSP 釘證通常只需對 httpd 設定進行極小的修改,即新增這兩個指令

SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"

這些指令置於全域範圍(即,不在虛擬主機定義中),類似於其他全域 SSL 設定指令置入的位置,例如 httpd 的一般開放原始碼建置中的 conf/extra/httpd-ssl.conf、Ubuntu 或 Debian 綑綁版 httpd 中的 /etc/apache2/mods-enabled/ssl.conf 等。

SSLStaplingCache 指令(例如 logs/)上的路徑應該與 SSLSessionCache 指令上的路徑相符。這條路徑是相對於 ServerRoot

這個特殊的 SSLStaplingCache 指令需要 mod_socache_shmcb(來自指令引數前置的 shmcb),此模組通常已啟用於 SSLSessionCache,或者由 mod_ssl 以外的某個模組啟用。如果您使用 mod_socache_shmcb 以外的機制啟用 SSL 會話快取,請同樣對 SSLStaplingCache 使用該替代機制。例如

SSLSessionCache "dbm:logs/ssl_scache"
SSLStaplingCache "dbm:logs/ssl_stapling"

您可以使用 openssl 指令列程式來驗證伺服器是否傳送了 OCSP 回應

$ openssl s_client -connect www.example.com:443 -status -servername www.example.com
...
OCSP response: 
======================================
OCSP Response Data:
    OCSP Response Status: successful (0x0)
    Response Type: Basic OCSP Response
...
    Cert Status: Good
...

以下各節重點說明需要進一步修改設定的最常見情況。另請參閱 mod_ssl 參考手冊。

如果伺服器使用的不只少數 SSL 證書

OCSP 回應儲存在 SSL 訂書針緩存中。儘管這些回應一般只有幾百位元組到幾千位元組大小,但 mod_ssl 支援最大大約 10K 位元組大小的 OCSP 回應。如果認證書多於幾個,則訂書針緩存大小(於上述範例中為 32768 位元組)可能需要增加。如果在儲存回應時發生錯誤,則會記錄下錯誤訊息 AH01929。

如果該認證書未指派至 OCSP 回應器,或必須使用其他位址

請參閱 SSLStaplingForceURL 指令。

您可以使用 openssl 指令行程式,如下,確認伺服器認證書是否指派至 OCSP 回應器

$ openssl x509 -in ./www.example.com.crt -text | grep 'OCSP.*http'
OCSP - URI:http://ocsp.example.com

如果提供 OCSP URI,且網站伺服器能直接與它通訊而不需要使用代理,則不需要進行設定。請注意,控制來自網站伺服器外部連線的防火牆規則可能需要調整。

如果未提供 OCSP URI,請聯絡您的憑證管理中心以確定是否有一個可用的;如果有,請使用 SSLStaplingForceURL 在使用該認證書的虛擬主機中設定。

如果設定了多個已啟用 SSL 的虛擬主機,且必須針對某些虛擬主機停用 OCSP 訂書針

對應應停用 OCSP Stapling 的虛擬主機增加 SSLUseStapling Off

如果 OCSP 回應器緩慢或不可靠

可以使用多項指令處理逾時和錯誤。請參閱 SSLStaplingFakeTryLaterSSLStaplingResponderTimeoutSSLStaplingReturnResponderErrors 指令文件。

如果 mod_ssl 記錄錯誤 AH02217

AH02217: ssl_stapling_init_cert: Can't retrieve issuer certificate!

若要支援在使用特定伺服器認證書時進行 OCSP 訂書針,必須設定該認證書的認證書串。如果未在啟用 SSL 時設定,則在啟用訂書針時會發出 AH02217 錯誤,而且不會為使用該認證書的客戶端提供 OCSP 回應。

請參閱 SSLCertificateChainFileSSLCertificateFile 以取得設定認證書串的說明。

top

客戶端驗證和存取控制

我如何才能強制客戶端使用認證書進行驗證?

當你了解所有使用者(例如:公司內部網路通常會這樣做),則可以要求普通憑證驗證。你需要做的就是建立自己的 CA 憑證 (ca.crt) 簽署的客戶端憑證,然後與該憑證驗證客戶端。

# require a client certificate which has to be directly
# signed by our CA certificate in ca.crt
SSLVerifyClient require
SSLVerifyDepth 1
SSLCACertificateFile "conf/ssl.crt/ca.crt"

我如何才能強制客戶端對特定 URL 使用認證書進行驗證,但仍允許任意客戶端存取伺服器其他部分?

若要強制客戶端使用特定網址的憑證驗證,可以使用 mod_ssl 的每個目錄重新設定功能。

SSLVerifyClient none
SSLCACertificateFile "conf/ssl.crt/ca.crt"

<Location "/secure/area">
SSLVerifyClient require
SSLVerifyDepth 1
</Location>

我如何才能只允許具有認證書的客戶端存取特定 URL,但允許所有客戶端存取伺服器其他部分?

這樣做的方法是確認客戶端憑證的某些部分與你的預期相符。一般來說,表示是確認識別名稱 (DN) 的全部或部分內容,以查看是否包含一些已知的字串。有兩種方法可以執行這項工作,一種是使用 mod_auth_basic,另一種則是使用 SSLRequire

若憑證完全任意,或者其 DN 沒有共用欄位(通常為組織等),一般就會需要使用 mod_auth_basic 方法。在這種情況下,你應該建立包含所有允許的客戶端的密碼資料庫,如下所示

SSLVerifyClient      none
SSLCACertificateFile "conf/ssl.crt/ca.crt"
SSLCACertificatePath "conf/ssl.crt"

<Directory "/usr/local/apache2/htdocs/secure/area">
    SSLVerifyClient      require
    SSLVerifyDepth       5
    SSLOptions           +FakeBasicAuth
    SSLRequireSSL
    AuthName             "Snake Oil Authentication"
    AuthType             Basic
    AuthBasicProvider    file
    AuthUserFile         "/usr/local/apache2/conf/httpd.passwd"
    Require              valid-user
</Directory>

在此範例中所使用的密碼是 DES 加密的字串「password」。有關詳細資訊,請參閱 SSLOptions 文件。

httpd.passwd

/C=DE/L=Munich/O=Snake Oil, Ltd./OU=Staff/CN=Foo:xxj31ZMTZzkVA
/C=US/L=S.F./O=Snake Oil, Ltd./OU=CA/CN=Bar:xxj31ZMTZzkVA
/C=US/L=L.A./O=Snake Oil, Ltd./OU=Dev/CN=Quux:xxj31ZMTZzkVA

當你的客戶端全部都是共用階層的一部分,而這個階層編碼到 DN 中,你可以使用 SSLRequire 更容易地比對它們,如下所示

SSLVerifyClient      none
SSLCACertificateFile "conf/ssl.crt/ca.crt"
SSLCACertificatePath "conf/ssl.crt"

<Directory "/usr/local/apache2/htdocs/secure/area">
  SSLVerifyClient      require
  SSLVerifyDepth       5
  SSLOptions           +FakeBasicAuth
  SSLRequireSSL
  SSLRequire       %{SSL_CLIENT_S_DN_O}  eq "Snake Oil, Ltd." \
               and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"}
</Directory>

對於來自網路的客戶端,我要如何要求對於某個 Intranet 網站的部分內容進行 HTTPS 使用強密碼,以及基本驗證或客戶端憑證?我仍然想要允許 Intranet 上的客戶端使用普通 HTTP 存取。

這些範例假設 Intranet 上的客戶端在範圍 192.168.1.0/24 中擁有 IP,而且你要允許網路存取的 Intranet 網站部分內容是/usr/local/apache2/htdocs/subarea。此設定應該出現在 HTTPS 虛擬主機的外部,以套用至 HTTPS 和 HTTP。

SSLCACertificateFile "conf/ssl.crt/company-ca.crt"

<Directory "/usr/local/apache2/htdocs">
    #   Outside the subarea only Intranet access is granted
    Require              ip 192.168.1.0/24
</Directory>

<Directory "/usr/local/apache2/htdocs/subarea">
    #   Inside the subarea any Intranet access is allowed
    #   but from the Internet only HTTPS + Strong-Cipher + Password
    #   or the alternative HTTPS + Strong-Cipher + Client-Certificate
    
    #   If HTTPS is used, make sure a strong cipher is used.
    #   Additionally allow client certs as alternative to basic auth.
    SSLVerifyClient      optional
    SSLVerifyDepth       1
    SSLOptions           +FakeBasicAuth +StrictRequire
    SSLRequire           %{SSL_CIPHER_USEKEYSIZE} >= 128
    
    #   Force clients from the Internet to use HTTPS
    RewriteEngine        on
    RewriteCond          "%{REMOTE_ADDR}" "!^192\.168\.1\.[0-9]+$"
    RewriteCond          "%{HTTPS}" "!=on"
    RewriteRule          "." "-" [F]
    
    #   Allow Network Access and/or Basic Auth
    Satisfy              any
    
    #   Network Access Control
    Require              ip 192.168.1.0/24
    
    #   HTTP Basic Authentication
    AuthType             basic
    AuthName             "Protected Intranet Area"
    AuthBasicProvider    file
    AuthUserFile         "conf/protected.passwd"
    Require              valid-user
</Directory>
top

記錄

LogLevel 設定到較高的追蹤層級後,mod_ssl 可將詳細冗長的除錯資訊記錄至錯誤記錄中。另一方面,如果伺服器負載很高,等級 info 可能已經太冗長。請記住,你可以針對每個模組設定 LogLevel,以符合你的需求。

可用的語言:  en  |  fr 

top

評論

其他
這裡不是問答區段。請將放置於此處的意見,指出關於改善文件或伺服器的建議,如果已實施或被認為無效/離題,我們的版主可能會將其移除。任何有關如何管理 Apache HTTP Server 的問題,都應在 Libera.chat 的 IRC 頻道 #httpd 中提出,或寄送電子郵件至我們的郵件列表