# 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
- 词汇和索引
- 词汇表
- 指令索引
- 指令速查
- 模块索引
- 站点导航