home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 November / CMCD1104.ISO / Software / Complet / Apache / apache_2.0.52-win32-x86-no_ssl.msi / Data.Cab / F278557_ssl_howto.xml < prev    next >
Extensible Markup Language  |  2004-08-06  |  12KB  |  289 lines

  1. <?xml version='1.0' encoding='UTF-8' ?>
  2. <!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
  3. <?xml-stylesheet type="text/xsl" href="../style/manual.en.xsl"?>
  4. <!-- $Revision: 1.3.2.9 $ -->
  5.  
  6. <!--
  7.  Copyright 2002-2004 The Apache Software Foundation
  8.  
  9.  Licensed under the Apache License, Version 2.0 (the "License");
  10.  you may not use this file except in compliance with the License.
  11.  You may obtain a copy of the License at
  12.  
  13.      http://www.apache.org/licenses/LICENSE-2.0
  14.  
  15.  Unless required by applicable law or agreed to in writing, software
  16.  distributed under the License is distributed on an "AS IS" BASIS,
  17.  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18.  See the License for the specific language governing permissions and
  19.  limitations under the License.
  20. -->
  21.  
  22. <manualpage metafile="ssl_howto.xml.meta">
  23. <parentdocument href="./">SSL/TLS</parentdocument>
  24.  
  25.   <title>SSL/TLS Strong Encryption: How-To</title>
  26.  
  27. <summary>
  28. <blockquote>
  29. <p>The solution of this problem is trivial
  30. and is left as an exercise for the reader.</p>
  31.  
  32. <p class="cite">-- <cite>Standard textbook cookie</cite></p>
  33. </blockquote>
  34.  
  35. <p>How to solve particular security constraints for an SSL-aware
  36. webserver is not always obvious because of the coherences between SSL,
  37. HTTP and Apache's way of processing requests. This chapter gives
  38. instructions on how to solve such typical situations. Treat it as a first
  39. step to find out the final solution, but always try to understand the 
  40. stuff before you use it. Nothing is worse than using a security solution
  41. without knowing its restrictions and coherences.</p>
  42. </summary>
  43.  
  44. <section id="ciphersuites">
  45. <title>Cipher Suites and Enforced Strong Security</title>
  46. <ul>
  47. <li><a href="#realssl">SSLv2 only server</a></li>
  48. <li><a href="#onlystrong">strong encryption only server</a></li>
  49. <li><a href="#upgradeenc">server gated cryptography</a></li>
  50. <li><a href="#strongurl">stronger per-directory requirements</a></li>
  51. </ul>
  52.  
  53. <section id="realssl">
  54. <title>How can I create a real SSLv2-only server?</title>
  55.     <p>The following creates an SSL server which speaks only the SSLv2 protocol and
  56.     its ciphers.</p>
  57.  
  58.     <example><title>httpd.conf</title>
  59.       SSLProtocol -all +SSLv2<br />
  60.       SSLCipherSuite SSLv2:+HIGH:+MEDIUM:+LOW:+EXP<br />
  61.     </example>
  62. </section>
  63.  
  64. <section id="onlystrong">
  65. <title>How can I create an SSL server which accepts strong encryption
  66. only?</title>
  67.     <p>The following enables only the seven strongest ciphers:</p>
  68.     <example><title>httpd.conf</title>
  69.       SSLProtocol all<br />
  70.       SSLCipherSuite HIGH:MEDIUM<br />
  71.     </example>
  72. </section>
  73.  
  74. <section id="upgradeenc">
  75. <title>How can I create an SSL server which accepts strong encryption
  76. only, but allows export browsers to upgrade to stronger encryption?</title>
  77.     <p>This facility is called Server Gated Cryptography (SGC) and details
  78.     you can find in the <code>README.GlobalID</code> document in the
  79.     mod_ssl distribution. In short: The server has a Global ID server
  80.     certificate, signed by a special CA certificate from Verisign which
  81.     enables strong encryption in export browsers. This works as following:
  82.     The browser connects with an export cipher, the server sends its Global
  83.     ID certificate, the browser verifies it and subsequently upgrades the
  84.     cipher suite before any HTTP communication takes place. The question
  85.     now is: How can we allow this upgrade, but enforce strong encryption.
  86.     Or in other words: Browser either have to initially connect with
  87.     strong encryption or have to upgrade to strong encryption, but are
  88.     not allowed to keep the export ciphers. The following does the trick:</p>
  89.     <example><title>httpd.conf</title>
  90.       # allow all ciphers for the initial handshake,<br />
  91.       # so export browsers can upgrade via SGC facility<br />
  92.       SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL<br />
  93.       <br />
  94.       <Directory /usr/local/apache2/htdocs><br />
  95.       # but finally deny all browsers which haven't upgraded<br />
  96.       SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 128<br />
  97.       </Directory>
  98.     </example>
  99. </section>
  100.  
  101. <section id="strongurl">
  102. <title>How can I create an SSL server which accepts all types of ciphers
  103. in general, but requires a strong ciphers for access to a particular
  104. URL?</title>
  105.     <p>Obviously you cannot just use a server-wide <directive
  106.     module="mod_ssl">SSLCipherSuite</directive> which restricts the
  107.     ciphers to the strong variants. But mod_ssl allows you to reconfigure
  108.     the cipher suite in per-directory context and automatically forces
  109.     a renegotiation of the SSL parameters to meet the new configuration.
  110.     So, the solution is:</p>
  111.     <example>
  112.       # be liberal in general<br />
  113.       SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL<br />
  114.       <br />
  115.       <Location /strong/area><br />
  116.       # but https://hostname/strong/area/ and below<br />
  117.       # requires strong ciphers<br />
  118.       SSLCipherSuite HIGH:MEDIUM<br />
  119.       </Location>
  120.     </example>
  121. </section>
  122. </section>
  123. <!-- /ciphersuites -->
  124.  
  125. <section id="accesscontrol">
  126. <title>Client Authentication and Access Control</title>
  127. <ul>
  128. <li><a href="#allclients">simple certificate-based client authentication</a></li>
  129. <li><a href="#arbitraryclients">selective certificate-based client authentication</a></li>
  130. <li><a href="#certauthenticate">particular certificate-based client authentication</a></li>
  131. <li><a href="#intranet">intranet vs. internet authentication</a></li>
  132. </ul>
  133.  
  134. <section id="allclients">
  135. <title>How can I authenticate clients based on certificates when I know
  136. all my clients?</title>
  137.     <p>When you know your user community (i.e. a closed user group
  138.     situation), as it's the case for instance in an Intranet, you can
  139.     use plain certificate authentication. All you have to do is to
  140.     create client certificates signed by your own CA certificate
  141.     <code>ca.crt</code> and then verify the clients against this
  142.     certificate.</p>
  143.     <example><title>httpd.conf</title>
  144.       # require a client certificate which has to be directly<br />
  145.       # signed by our CA certificate in ca.crt<br />
  146.       SSLVerifyClient require<br />
  147.       SSLVerifyDepth 1<br />
  148.       SSLCACertificateFile conf/ssl.crt/ca.crt
  149.     </example>
  150. </section>
  151.  
  152. <section id="arbitraryclients">
  153. <title>How can I authenticate my clients for a particular URL based on
  154. certificates but still allow arbitrary clients to access the remaining
  155. parts of the server?</title>
  156.     <p>For this we again use the per-directory reconfiguration feature
  157.     of <module>mod_ssl</module>:</p>
  158.  
  159.     <example><title>httpd.conf</title>
  160.     SSLVerifyClient none<br />
  161.     SSLCACertificateFile conf/ssl.crt/ca.crt<br />
  162.     <br />
  163.     <Location /secure/area><br />
  164.     SSLVerifyClient require<br />
  165.     SSLVerifyDepth 1<br />
  166.     </Location><br />
  167.     </example>
  168. </section>
  169.  
  170. <section id="certauthenticate">
  171. <title>How can I authenticate only particular clients for a some URLs based
  172. on certificates but still allow arbitrary clients to access the remaining
  173. parts of the server?</title>
  174.     <p>The key is to check for various ingredients of the client certificate.
  175.     Usually this means to check the whole or part of the Distinguished
  176.     Name (DN) of the Subject. For this two methods exists: The <module
  177.     >mod_auth</module> based variant and the <directive
  178.     module="mod_ssl">SSLRequire</directive> variant. The first method is
  179.     good when the clients are of totally different type, i.e. when their
  180.     DNs have no common fields (usually the organisation, etc.). In this
  181.     case you've to establish a password database containing <em>all</em>
  182.     clients. The second method is better when your clients are all part of
  183.     a common hierarchy which is encoded into the DN. Then you can match
  184.     them more easily.</p>
  185.  
  186.     <p>The first method:</p>
  187.     <example><title>httpd.conf</title><pre>
  188. SSLVerifyClient      none
  189. <Directory /usr/local/apache2/htdocs/secure/area>
  190.  
  191. SSLVerifyClient      require
  192. SSLVerifyDepth       5
  193. SSLCACertificateFile conf/ssl.crt/ca.crt
  194. SSLCACertificatePath conf/ssl.crt
  195. SSLOptions           +FakeBasicAuth
  196. SSLRequireSSL
  197. AuthName             "Snake Oil Authentication"
  198. AuthType             Basic
  199. AuthUserFile         /usr/local/apache2/conf/httpd.passwd
  200. require              valid-user
  201. </Directory></pre>
  202.     </example>
  203.  
  204.     <example><title>httpd.passwd</title><pre>
  205. /C=DE/L=Munich/O=Snake Oil, Ltd./OU=Staff/CN=Foo:xxj31ZMTZzkVA
  206. /C=US/L=S.F./O=Snake Oil, Ltd./OU=CA/CN=Bar:xxj31ZMTZzkVA
  207. /C=US/L=L.A./O=Snake Oil, Ltd./OU=Dev/CN=Quux:xxj31ZMTZzkVA</pre>
  208.     </example>
  209.  
  210.     <p>The second method:</p>
  211.  
  212.     <example><title>httpd.conf</title><pre>
  213. SSLVerifyClient      none
  214. <Directory /usr/local/apache2/htdocs/secure/area>
  215.  
  216.   SSLVerifyClient      require
  217.   SSLVerifyDepth       5
  218.   SSLCACertificateFile conf/ssl.crt/ca.crt
  219.   SSLCACertificatePath conf/ssl.crt
  220.   SSLOptions           +FakeBasicAuth
  221.   SSLRequireSSL
  222.   SSLRequire       %{SSL_CLIENT_S_DN_O}  eq "Snake Oil, Ltd." \
  223.                and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"}
  224. </Directory></pre>
  225.     </example>
  226. </section>
  227.  
  228. <section id="intranet">
  229. <title>How can I require HTTPS with strong ciphers and either basic
  230. authentication or client certificates for access to a subarea on the
  231. Intranet website for clients coming from the Internet but still allow
  232. plain HTTP access for clients on the Intranet?</title>
  233.    <p>Let us assume the Intranet can be distinguished through the IP
  234.    network 192.160.1.0/24 and the subarea on the Intranet website has
  235.    the URL <code>/subarea</code>. Then configure the following outside
  236.    your HTTPS virtual host (so it applies to both HTTPS and HTTP):</p>
  237.  
  238.     <example><title>httpd.conf</title><pre>
  239. SSLCACertificateFile conf/ssl.crt/company-ca.crt
  240.  
  241. <Directory /usr/local/apache2/htdocs>
  242. #   Outside the subarea only Intranet access is granted
  243. Order                deny,allow
  244. Deny                 from all
  245. Allow                from 192.168.1.0/24
  246. </Directory>
  247.  
  248. <Directory /usr/local/apache2/htdocs/subarea>
  249. #   Inside the subarea any Intranet access is allowed
  250. #   but from the Internet only HTTPS + Strong-Cipher + Password
  251. #   or the alternative HTTPS + Strong-Cipher + Client-Certificate
  252.  
  253. #   If HTTPS is used, make sure a strong cipher is used.
  254. #   Additionally allow client certs as alternative to basic auth.
  255. SSLVerifyClient      optional
  256. SSLVerifyDepth       1
  257. SSLOptions           +FakeBasicAuth +StrictRequire
  258. SSLRequire           %{SSL_CIPHER_USEKEYSIZE} >= 128
  259.  
  260. #   Force clients from the Internet to use HTTPS
  261. RewriteEngine        on
  262. RewriteCond          %{REMOTE_ADDR} !^192\.168\.1\.[0-9]+$
  263. RewriteCond          %{HTTPS} !=on
  264. RewriteRule          .* - [F]
  265.  
  266. #   Allow Network Access and/or Basic Auth
  267. Satisfy              any
  268.  
  269. #   Network Access Control
  270. Order                deny,allow
  271. Deny                 from all
  272. Allow                192.168.1.0/24
  273.  
  274. #   HTTP Basic Authentication
  275. AuthType             basic
  276. AuthName             "Protected Intranet Area"
  277. AuthUserFile         conf/protected.passwd
  278. Require              valid-user
  279. </Directory></pre>
  280.     </example>
  281. </section>
  282. </section>
  283. <!-- /access control -->
  284.  
  285. </manualpage>
  286.  
  287.  
  288.  
  289.