Apache HTTP Server 版本 2.4
您的 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>
下列指令僅啟用最強大的密碼
SSLCipherSuite HIGH:!aNULL:!MD5
透過下列設定,您可以偏好特定的速度最佳化密碼(由 mod_ssl 選擇,前提是客戶端支援)
SSLCipherSuite RC4-SHA:AES128-SHA:HIGH:!aNULL:!MD5 SSLHonorCipherOrder on
顯然,一個限制密碼為強變種的伺服器廣域 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>
線上證書狀態通訊協定 (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
以外的機制啟用 SSL 會話快取,請同樣對 mod_socache_shmcb
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
OCSP 回應儲存在 SSL 訂書針緩存中。儘管這些回應一般只有幾百位元組到幾千位元組大小,但 mod_ssl 支援最大大約 10K 位元組大小的 OCSP 回應。如果認證書多於幾個,則訂書針緩存大小(於上述範例中為 32768 位元組)可能需要增加。如果在儲存回應時發生錯誤,則會記錄下錯誤訊息 AH01929。
請參閱 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
在使用該認證書的虛擬主機中設定。
對應應停用 OCSP Stapling 的虛擬主機增加 SSLUseStapling Off
。
可以使用多項指令處理逾時和錯誤。請參閱 SSLStaplingFakeTryLater
、SSLStaplingResponderTimeout
和 SSLStaplingReturnResponderErrors
指令文件。
AH02217: ssl_stapling_init_cert: Can't retrieve issuer certificate!
若要支援在使用特定伺服器認證書時進行 OCSP 訂書針,必須設定該認證書的認證書串。如果未在啟用 SSL 時設定,則在啟用訂書針時會發出 AH02217 錯誤,而且不會為使用該認證書的客戶端提供 OCSP 回應。
請參閱 SSLCertificateChainFile
和 SSLCertificateFile
以取得設定認證書串的說明。
當你了解所有使用者(例如:公司內部網路通常會這樣做),則可以要求普通憑證驗證。你需要做的就是建立自己的 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"
若要強制客戶端使用特定網址的憑證驗證,可以使用 mod_ssl
的每個目錄重新設定功能。
SSLVerifyClient none SSLCACertificateFile "conf/ssl.crt/ca.crt" <Location "/secure/area"> SSLVerifyClient require SSLVerifyDepth 1 </Location>
這樣做的方法是確認客戶端憑證的某些部分與你的預期相符。一般來說,表示是確認識別名稱 (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
文件。
/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 上的客戶端在範圍 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>