# SSL/TLS高強度加密:如何...?
> 這個問題的解決方案是簡單而且直接的,只是為了給讀者做做練習。
>
> -- <cite class="calibre63">標準教科書</cite>
由于SSL、HTTP、Apache三者共同對請求進行處理,這使得在支持SSL的web服務器上實現特殊的安全制約變得不那么簡單。本節介紹了普通情況下的解決方案,作為找出最終方案的第一步。采用這些方案以前,先要盡量地去理解,不了解其限制和相關性就貿然使用是最糟糕的了。
## 加密方案和強制性高等級安全
* [僅使用SSLv2的服務器](#calibre_link-140)
* [僅接受高強度加密請求的服務器](#calibre_link-141)
* [以服務器為網關的加密](#calibre_link-142)
* [更強的針對目錄的加密需求](#calibre_link-143)
### 如何建立一個僅使用SSLv2的服務器?
可以這樣建立一個僅使用SSLv2協議及其密碼算法的服務器:
### httpd.conf
```
SSLProtocol -all +SSLv2
SSLCipherSuite SSLv2:+HIGH:+MEDIUM:+LOW:+EXP
```
### 如何建立一個僅接受高強度加密請求的SSL服務器?
如下設置為僅使用最強的七種密碼算法:
### httpd.conf
```
SSLProtocol all
SSLCipherSuite HIGH:MEDIUM
```
### 如何建立一個僅接受高強度加密請求的SSL服務器,而又允許對外瀏覽器使用更強的加密?
這個功能被稱為以服務器為網關的加密(Server Gated Cryptography[SGC]),在隨mod_ssl發布的`README.GlobalID`文檔中有詳細說明。簡單地說就是:服務器擁有一個由來自Verisign的一個特殊的CA證書簽發的服務器身份證,從而在對外瀏覽器上實現高強度加密。其過程如下:瀏覽器使用對外密碼進行連接,服務器返回其全局ID身份證,瀏覽器校驗后在后繼HTTP通訊產生之前提升其密碼組。現在的問題是:如何允許這樣的提升,而又強制性地使用高強度加密。換句話說就是:瀏覽器必須在開始連接時就使用高強度加密,或者提升到高強度加密,但是維持對外密碼是不允許的。以下巧妙地解決了這個問題:
### httpd.conf
```
# 允許在初始握手階段使用所有的密碼,以允許對外服務器通過SGC功能提升密碼組
SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
<Directory /usr/local/apache2/htdocs>
# 但是最終會拒絕所有沒有提升密碼組的瀏覽器
SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 128
</Directory>
```
### 如何建立接受所有類型密碼的SSL服務器,但對特定的URL實施高強度加密?
顯然,不能使用服務器全局設置`SSLCipherSuite`,它會限制密碼為強類型。但是,mod_ssl允許重配置針對目錄的密碼組,并自動進行一個帶有服從新配置的SSL參數的重協商。因此,其解決方案成了:
```
# 在一般情況下的處理是寬松的
SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
<Location /strong/area>
# 但對于 https://hostname/strong/area/ 及其以下的內容要求高強度密碼
SSLCipherSuite HIGH:MEDIUM
</Location>
```
## 客戶認證和訪問控制
* [簡單的基于證書的客戶認證](#calibre_link-145)
* [選擇性的基于證書的客戶認證](#calibre_link-146)
* [特殊的基于證書的客戶認證](#calibre_link-147)
* [intranet和internet的認證](#calibre_link-148)
### 在知道所有客戶的情況下,如何實現基于證書的客戶認證?
如果你了解你的用戶群體(比如:一個封閉的用戶組),正如在一個Intranet中,則可以使用一般的證書認證。所有要做的事情只是,建立由你自己的CA證書簽發的客戶證書`ca.crt` ,并依此證書校驗客戶。
### httpd.conf
```
# 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`提供的針對目錄的重配置功能:
### httpd.conf
```
SSLVerifyClient none
SSLCACertificateFile conf/ssl.crt/ca.crt
<Location /secure/area>
SSLVerifyClient require
SSLVerifyDepth 1
</Location>
```
### 如何針對某些URL對特定的客戶實施基于證書的認證,而同時又允許任何客戶訪問服務器其余部分?
其關鍵在于對客戶證書的各個組成部分進行驗證,一般就是指驗證 Distinguished Name (DN) 的全部或部分。有基于`mod_auth_basic`和基于`SSLRequire`類型的兩種方法以驗證。第一種方法適合用于客戶完全屬于不同類型,并為_所有_客戶建立了密碼數據庫的情形;第二種方法適用于客戶都屬于一個被編碼寫入DN的公共分級的一部分的情形,因為匹配客戶會更容易。
第一種方法:
### httpd.conf
```
SSLVerifyClient none
<Directory /usr/local/apache2/htdocs/secure/area>
SSLVerifyClient require
SSLVerifyDepth 5
SSLCACertificateFile conf/ssl.crt/ca.crt
SSLCACertificatePath conf/ssl.crt
SSLOptions +FakeBasicAuth
SSLRequireSSL
AuthName "Snake Oil Authentication"
AuthType Basic
AuthBasicProvider file
AuthUserFile /usr/local/apache2/conf/httpd.passwd
require valid-user
</Directory>
```
### 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
```
第二種方法:
### httpd.conf
```
SSLVerifyClient none
<Directory /usr/local/apache2/htdocs/secure/area>
SSLVerifyClient require
SSLVerifyDepth 5
SSLCACertificateFile conf/ssl.crt/ca.crt
SSLCACertificatePath conf/ssl.crt
SSLOptions +FakeBasicAuth
SSLRequireSSL
SSLRequire %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \
and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"}
</Directory>
```
### 如何要求來自Internet的客戶使用強密碼的HTTPS,并對其訪問Intranet站點的子區域實施或者基本的或者客戶證書的認證,而同時又允許Intranet的客戶進行普通的HTTP訪問?
假設Intranet客戶的IP地址是192.160.1.0/24,Intranet站點子區域的URL是`/subarea` ,則可以在HTTPS虛擬主機以外這樣配置(以同時作用于HTTPS和HTTP):
### httpd.conf
```
SSLCACertificateFile conf/ssl.crt/company-ca.crt
<Directory /usr/local/apache2/htdocs>
# subarea以外的區域只允許來自Intranet的訪問
Order deny,allow
Deny from all
Allow from 192.168.1.0/24
</Directory>
<Directory /usr/local/apache2/htdocs/subarea>
# 在subarea以內,允許所有來自Intranet的訪問,
# 但對來自Internet的訪問,僅允許HTTPS+Strong-Cipher+Password
# 或者HTTPS+Strong-Cipher+Client-Certificate
# 如果使用了HTTPS,則確保使用高強度加密
# 同時允許客戶以基本認證的形式認證
SSLVerifyClient optional
SSLVerifyDepth 1
SSLOptions +FakeBasicAuth +StrictRequire
SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 128
# 強制來自Internet的客戶使用HTTPS
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.[0-9]+$
RewriteCond %{HTTPS} !=on
RewriteRule .* - [F]
# 允許網絡訪問和基本認證
Satisfy any
# 控制網絡訪問
Order deny,allow
Deny from all
Allow 192.168.1.0/24
# HTTP基本認證
AuthType basic
AuthName "Protected Intranet Area"
AuthBasicProvider file
AuthUserFile conf/protected.passwd
Require valid-user
</Directory>
```
- Apache HTTP Server Version 2.2 文檔 [最后更新:2006年3月21日]
- 版本說明
- 從1.3升級到2.0
- 從2.0升級到2.2
- Apache 2.2 新特性概述
- Apache 2.0 新特性概述
- The Apache License, Version 2.0
- 參考手冊
- 編譯與安裝
- 啟動Apache
- 停止和重啟
- 配置文件
- 配置段(容器)
- 緩沖指南
- 服務器全局配置
- 日志文件
- 從URL到文件系統的映射
- 安全方面的提示
- 動態共享對象(DSO)支持
- 內容協商
- 自定義錯誤響應
- 地址和端口的綁定(Binding)
- 多路處理模塊
- Apache的環境變量
- Apache處理器的使用
- 過濾器(Filter)
- suEXEC支持
- 性能方面的提示
- URL重寫指南
- Apache虛擬主機文檔
- 基于主機名的虛擬主機
- 基于IP地址的虛擬主機
- 大批量虛擬主機的動態配置
- 虛擬主機示例
- 深入研究虛擬主機的匹配
- 文件描述符限制
- 關于DNS和Apache
- 常見問題
- 經常問到的問題
- Apache的SSL/TLS加密
- SSL/TLS高強度加密:緒論
- SSL/TLS高強度加密:兼容性
- SSL/TLS高強度加密:如何...?
- SSL/TLS Strong Encryption: FAQ
- 如何.../指南
- 認證、授權、訪問控制
- CGI動態頁面
- 服務器端包含入門
- .htaccess文件
- 用戶網站目錄
- 針對特定平臺的說明
- 在Microsoft Windows中使用Apache
- 在Microsoft Windows上編譯Apache
- Using Apache With Novell NetWare
- Running a High-Performance Web Server on HPUX
- The Apache EBCDIC Port
- 服務器和支持程序
- httpd - Apache超文本傳輸協議服務器
- ab - Apache HTTP服務器性能測試工具
- apachectl - Apache HTTP服務器控制接口
- apxs - Apache 擴展工具
- configure - 配置源代碼樹
- dbmmanage - 管理DBM格式的用戶認證文件
- htcacheclean - 清理磁盤緩沖區
- htdbm - 操作DBM密碼數據庫
- htdigest - 管理用于摘要認證的用戶文件
- httxt2dbm - 生成RewriteMap指令使用的dbm文件
- htpasswd - 管理用于基本認證的用戶文件
- logresolve - 解析Apache日志中的IP地址為主機名
- rotatelogs - 滾動Apache日志的管道日志程序
- suexec - 在執行外部程序之前切換用戶
- 其他程序
- 雜項文檔
- 與Apache相關的標準
- Apache模塊
- 描述模塊的術語
- 描述指令的術語
- Apache核心(Core)特性
- Apache MPM 公共指令
- Apache MPM beos
- Apache MPM event
- Apache MPM netware
- Apache MPM os2
- Apache MPM prefork
- Apache MPM winnt
- Apache MPM worker
- Apache模塊 mod_actions
- Apache模塊 mod_alias
- Apache模塊 mod_asis
- Apache模塊 mod_auth_basic
- Apache模塊 mod_auth_digest
- Apache模塊 mod_authn_alias
- Apache模塊 mod_authn_anon
- Apache模塊 mod_authn_dbd
- Apache模塊 mod_authn_dbm
- Apache模塊 mod_authn_default
- Apache模塊 mod_authn_file
- Apache模塊 mod_authnz_ldap
- Apache模塊 mod_authz_dbm
- Apache模塊 mod_authz_default
- Apache模塊 mod_authz_groupfile
- Apache模塊 mod_authz_host
- Apache模塊 mod_authz_owner
- Apache模塊 mod_authz_user
- Apache模塊 mod_autoindex
- Apache模塊 mod_cache
- Apache模塊 mod_cern_meta
- Apache模塊 mod_cgi
- Apache模塊 mod_cgid
- Apache模塊 mod_charset_lite
- Apache模塊 mod_dav
- Apache模塊 mod_dav_fs
- Apache模塊 mod_dav_lock
- Apache模塊 mod_dbd
- Apache模塊 mod_deflate
- Apache模塊 mod_dir
- Apache模塊 mod_disk_cache
- Apache模塊 mod_dumpio
- Apache模塊 mod_echo
- Apache模塊 mod_env
- Apache模塊 mod_example
- Apache模塊 mod_expires
- Apache模塊 mod_ext_filter
- Apache模塊 mod_file_cache
- Apache模塊 mod_filter
- Apache模塊 mod_headers
- Apache模塊 mod_ident
- Apache模塊 mod_imagemap
- Apache模塊 mod_include
- Apache模塊 mod_info
- Apache模塊 mod_isapi
- Apache模塊 mod_ldap
- Apache模塊 mod_log_config
- Apache模塊 mod_log_forensic
- Apache模塊 mod_logio
- Apache模塊 mod_mem_cache
- Apache模塊 mod_mime
- Apache模塊 mod_mime_magic
- Apache模塊 mod_negotiation
- Apache模塊 mod_nw_ssl
- Apache模塊 mod_proxy
- Apache模塊 mod_proxy_ajp
- Apache模塊 mod_proxy_balancer
- Apache模塊 mod_proxy_connect
- Apache模塊 mod_proxy_ftp
- Apache模塊 mod_proxy_http
- Apache模塊 mod_rewrite
- Apache模塊 mod_setenvif
- Apache模塊 mod_so
- Apache模塊 mod_speling
- Apache模塊 mod_ssl
- Apache模塊 mod_status
- Apache模塊 mod_suexec
- Apache模塊 mod_unique_id
- Apache模塊 mod_userdir
- Apache模塊 mod_usertrack
- Apache模塊 mod_version
- Apache模塊 mod_vhost_alias
- Developer Documentation for Apache 2.0
- Apache 1.3 API notes
- Debugging Memory Allocation in APR
- Documenting Apache 2.0
- Apache 2.0 Hook Functions
- Converting Modules from Apache 1.3 to Apache 2.0
- Request Processing in Apache 2.0
- How filters work in Apache 2.0
- Apache 2.0 Thread Safety Issues
- 詞匯和索引
- 詞匯表
- 指令索引
- 指令速查
- 模塊索引
- 站點導航