• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 操作方法

    本文档旨在帮助您入门,并使一些工作正常进行。强烈建议您阅读其余的SSL文档,并在继续学习高级技术之前对材料进行更深入的了解。

    基本配置示例

    您的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>
    

    密码套件和加强安全性

    • 如何创建仅接受强加密的SSL服务器?
    • 如何创建一个SSL服务器,该服务器通常接受所有类型的密码,但是需要强密码才能访问特定的URL?

    如何创建仅接受强加密的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>
    

    OCSP装订

    联机证书状态协议(OCSP)是一种用于确定服务器证书是否已被吊销的机制,而OCSP装订是一种特殊形式,其中服务器(例如httpd和mod_ssl)维护其证书的当前OCSP响应。并将它们发送给与服务器通信的客户端。大多数证书包含由签发的证书颁发机构维护的OCSP响应者的地址,并且mod_ssl可以与该响应者进行通信,以获得可以发送给与服务器进行通信的客户端的签名响应。

    因为客户端可以从服务器获取证书吊销状态,而无需从客户端到证书颁发机构的额外连接,所以OCSP装订是获取吊销状态的首选方法。消除客户端与证书颁发机构之间的通信的其他好处是,客户端浏览历史记录不会暴露给证书颁发机构,并且通过不依赖可能负载较重的证书颁发机构服务器来获取状态更加可靠。

    由于服务器获得的响应可以在响应有效期间被使用相同证书的所有客户端重用,因此服务器的开销很小。

    正确配置了常规SSL支持后,启用OCSP装订通常只需要对httpd配置进行非常小的修改—这两个指令的附加内容:

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

    这些指令位于放置其他全局SSL配置指令的任何地方的全局范围内(即,不在虚拟主机定义之内),例如,conf/extra/httpd-ssl.conf用于httpd的常规开源构建,/etc/apache2/mods-enabled/ssl.conf用于Ubuntu或Debian捆绑的httpd的in 等等。

    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参考手册。

    如果服务器使用了多个SSL证书

    OCSP响应存储在SSL装订缓存中。尽管响应的大小通常为几百到几千个字节,但mod_ssl支持OCSP响应,最大大小约为1万个字节。如果证书不止几个,则可能需要增加装订缓存大小(在上面的示例中为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,并且Web服务器无需使用代理即可直接与其通信,则不需要进行配置。请注意,可能需要调整控制来自Web服务器的出站连接的防火墙规则。

    如果没有提供OCSP URI,请与您的证书颁发机构联系以确定是否可用。如果是这样,请SSLStaplingForceURL在使用证书的虚拟主机中对其进行配置。

    如果配置了多个启用SSL的虚拟主机,并且某些主机应禁用OCSP装订

    添加SSLUseStapling Off到应禁用OCSP装订的虚拟主机。

    如果OCSP响应程序速度慢或不可靠

    有几种指令可用于处理超时和错误。请参考该文档SSLStaplingFakeTryLaterSSLStaplingResponderTimeoutSSLStaplingReturnResponderErrors指令。

    如果mod_ssl记录错误AH02217

    AH02217: ssl_stapling_init_cert: Can't retrieve issuer certificate!
    

    为了在使用特定服务器证书时支持OCSP装订,必须配置该证书的证书链。如果未将其配置为启用SSL的一部分,则在启用装订时将发出AH02217错误,并且不会为使用证书的客户端提供OCSP响应。

    请参阅SSLCertificateChainFileSSLCertificateFile了解有关配置证书链的说明。

    客户端身份验证和访问控制

    • 如何强制客户端使用证书进行身份验证?
    • 如何强制客户端对特定URL使用证书进行身份验证,但仍然允许任意客户端访问服务器的其余部分?
    • 如何仅允许具有证书的客户端访问特定的URL,但允许所有客户端访问服务器的其余部分?
    • 对于来自Internet的客户端,我如何要求HTTPS具有强密码,基本身份验证或客户端证书才能访问Intranet网站的一部分?

    如何强制客户端使用证书进行身份验证?

    当您知道所有用户时(例如,在公司Intranet上通常如此),则可以要求普通证书身份验证。您需要做的就是创建由您自己的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使用证书进行身份验证,但仍然允许任意客户端访问服务器的其余部分?

    要强制客户端使用证书针对特定URL进行身份验证,可以使用以下命令的按目录重新配置功能mod_ssl

    SSLVerifyClient none
    SSLCACertificateFile "conf/ssl.crt/ca.crt"
    
    <Location "/secure/area">
    SSLVerifyClient require
    SSLVerifyDepth 1
    </Location>
    

    如何仅允许具有证书的客户端访问特定的URL,但允许所有客户端访问服务器的其余部分?

    这样做的关键是检查客户端证书的一部分是否符合您的期望。通常,这意味着检查全部或部分专有名称(DN),以查看其是否包含某些已知字符串。有两种方法可以使用mod_auth_basicSSLRequire

    mod_auth_basic如果证书是完全任意的,或者其DN没有公共字段(通常是组织等),通常需要使用此方法。在这种情况下,您应该建立一个包含所有允许的客户端的密码数据库,如下所示:

    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>
    
    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>
    

    对于来自Internet的客户端,我如何要求HTTPS具有强密码,基本身份验证或客户端证书才能访问Intranet网站的一部分?我仍然希望允许Intranet上的客户端进行简单的HTTP访问。

    这些示例假定Intranet上的客户端IP地址为192.168.1.0/24,并且您希望允许Internet访问的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>
    

    记录中

    mod_ssl如果将其LogLevel设置为较高的跟踪级别,则可以将极其详细的调试信息记录到错误日志中。另一方面,在非常繁忙的服务器上,级别info可能已经过高。请记住,您可以配置LogLevel每个模块以适合您的需求。

    上篇:兼容性

    下篇:常见问题