> Apache2.2 中文手册 > SSL/TLS 加密:如何...

SSL/TLS高强度加密:如何...?

这个问题的解决方案是简单而且直接的,只是为了给读者做做练习。

-- 标准教科书

由于SSL、HTTP、Apache三者共同对请求进行处理,这使得在支持SSL的web服务器上实现特殊的安全制约变得不那么简单。本节介绍了普通情况下的解决方案,作为找出最终方案的第一步。采用这些方案以前,先要尽量地去理解,不了解其限制和相关性就贸然使用是最糟糕的了。

SSL/TLS 加密:如何...

仅使用SSLv2的服务器
  • 仅接受高强度加密请求的服务器
  • 以服务器为网关的加密
  • 更强的针对目录的加密需求
  • 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>

    SSL/TLS 加密:如何...

    简单的基于证书的客户认证
  • 选择性的基于证书的客户认证
  • 特殊的基于证书的客户认证
  • intranet和internet的认证
  • mod_ssl提供的针对目录的重配置功能:

    httpd.conf

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

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

    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>