documentation updates
[gnutls.git] / doc / cha-cert-auth.texi
blob93db1ce9fce93dc3b9350e699b045204d6af7d11
1 @node Certificate authentication
2 @chapter Certificate authentication
3 @cindex certificate authentication
5 The most known authentication method of @acronym{TLS} are certificates.
6 The PKIX @xcite{PKIX} public key infrastructure is daily used by anyone
7 using a browser today. @acronym{GnuTLS} supports both 
8 @acronym{X.509} certificates @xcite{PKIX} and @acronym{OpenPGP}
9 certificates using a common API.
11 The key exchange algorithms supported by certificate authentication are
12 shown in @ref{tab:key-exchange}.
14 @float Table,tab:key-exchange
15 @multitable @columnfractions .2 .7
17 @headitem Key exchange @tab Description
19 @item RSA @tab
20 The RSA algorithm is used to encrypt a key and send it to the peer.
21 The certificate must allow the key to be used for encryption.
23 @item RSA_@-EXPORT @tab
24 The RSA algorithm is used to encrypt a key and send it to the peer.
25 In the EXPORT algorithm, the server signs temporary RSA parameters of
26 512 bits --- which are considered weak --- and sends them to the
27 client.
29 @item DHE_@-RSA @tab
30 The RSA algorithm is used to sign ephemeral Diffie-Hellman parameters
31 which are sent to the peer. The key in the certificate must allow the
32 key to be used for signing. Note that key exchange algorithms which
33 use ephemeral Diffie-Hellman parameters, offer perfect forward
34 secrecy. That means that even if the private key used for signing is
35 compromised, it cannot be used to reveal past session data.
37 @item ECDHE_@-RSA @tab
38 The RSA algorithm is used to sign ephemeral elliptic curve Diffie-Hellman 
39 parameters which are sent to the peer. The key in the certificate must allow 
40 the key to be used for signing. It also offers perfect forward
41 secrecy. That means that even if the private key used for signing is
42 compromised, it cannot be used to reveal past session data.
44 @item DHE_@-DSS @tab
45 The DSA algorithm is used to sign ephemeral Diffie-Hellman parameters
46 which are sent to the peer. The certificate must contain DSA
47 parameters to use this key exchange algorithm. DSA is the algorithm
48 of the Digital Signature Standard (DSS).
50 @item ECDHE_@-ECDSA @tab
51 The Elliptic curve DSA algorithm is used to sign ephemeral elliptic
52 curve Diffie-Hellman parameters which are sent to the peer. The 
53 certificate must contain ECDSA parameters to use this key exchange 
54 algorithm. 
56 @end multitable
57 @caption{Supported key exchange algorithms.}
58 @end float
60 @menu
61 * X.509 certificates::
62 * OpenPGP certificates::
63 * Digital signatures::
64 @end menu
66 @node X.509 certificates
67 @section @acronym{X.509} certificates
68 @cindex X.509 certificates
70 The @acronym{X.509} protocols rely on a hierarchical trust model. In
71 this trust model Certification Authorities (CAs) are used to certify
72 entities.  Usually more than one certification authorities exist, and
73 certification authorities may certify other authorities to issue
74 certificates as well, following a hierarchical model.
76 @float Figure,fig:x509
77 @image{gnutls-x509,7cm}
78 @caption{An example of the X.509 hierarchical trust model.}
79 @end float
81 One needs to trust one or more CAs for his secure communications. In
82 that case only the certificates issued by the trusted authorities are
83 acceptable.  The framework is illustrated on @ref{fig:x509}.
85 @menu
86 * X.509 certificate structure::
87 * X.509 distinguished names::
88 * Verifying X.509 certificate paths::
89 * Verifying a certificate in the context of TLS session::
90 * Verifying a certificate using trust on first use authentication::
91 @end menu
93 @node X.509 certificate structure
94 @subsection @acronym{X.509} certificate structure
96 An @acronym{X.509} certificate usually contains information about the
97 certificate holder, the signer, a unique serial number, expiration
98 dates and some other fields @xcite{PKIX} as shown in @ref{tab:x509}.
100 @float Table,tab:x509
101 @multitable @columnfractions .2 .7
103 @headitem Field @tab Description
105 @item version @tab
106 The field that indicates the version of the certificate.
108 @item serialNumber @tab
109 This field holds a unique serial number per certificate.
111 @item signature @tab
112 The issuing authority's signature.
114 @item issuer @tab
115 Holds the issuer's distinguished name.
117 @item validity @tab
118 The activation and expiration dates.
120 @item subject @tab
121 The subject's distinguished name of the certificate.
123 @item extensions @tab
124 The extensions are fields only present in version 3 certificates.
126 @end multitable
127 @caption{X.509 certificate fields.}
128 @end float
130 The certificate's @emph{subject or issuer name} is not just a single
131 string.  It is a Distinguished name and in the @acronym{ASN.1}
132 notation is a sequence of several object identifiers with their corresponding
133 values. Some of available OIDs to be used in an @acronym{X.509}
134 distinguished name are defined in @file{gnutls/x509.h}.
136 The @emph{Version} field in a certificate has values either 1 or 3 for
137 version 3 certificates.  Version 1 certificates do not support the
138 extensions field so it is not possible to distinguish a CA from a
139 person, thus their usage should be avoided.
141 The @emph{validity} dates are there to indicate the date that the
142 specific certificate was activated and the date the certificate's key
143 would be considered invalid.
145 Certificate @emph{extensions} are there to include information about
146 the certificate's subject that did not fit in the typical certificate
147 fields. Those may be e-mail addresses, flags that indicate whether the
148 belongs to a CA etc.  All the supported @acronym{X.509} version 3
149 extensions are shown in @ref{tab:x509-ext}.
151 @float Table,tab:x509-ext
152 @multitable @columnfractions .3 .2 .4
154 @headitem Extension @tab OID @tab Description
156 @item Subject key id @tab 2.5.29.14 @tab
157 An identifier of the key of the subject.
159 @item Authority key id @tab 2.5.29.35 @tab
160 An identifier of the authority's key used to sign the certificate.
162 @item Subject alternative name @tab 2.5.29.17 @tab
163 Alternative names to subject's distinguished name.
165 @item Key usage @tab 2.5.29.15 @tab
166 Constraints the key's usage of the certificate.
168 @item Extended key usage @tab 2.5.29.37 @tab
169 Constraints the purpose of the certificate.
171 @item Basic constraints @tab 2.5.29.19 @tab
172 Indicates whether this is a CA certificate or not, and specify the
173 maximum path lengths of certificate chains.
175 @item CRL distribution points @tab 2.5.29.31 @tab
176 This extension is set by the CA, in order to inform about the issued
177 CRLs.
179 @item Proxy Certification Information @tab 1.3.6.1.5.5.7.1.14 @tab
180 Proxy Certificates includes this extension that contains the OID of
181 the proxy policy language used, and can specify limits on the maximum
182 lengths of proxy chains.  Proxy Certificates are specified in
183 @xcite{RFC3820}.
185 @end multitable
186 @caption{X.509 certificate extensions.}
187 @end float
189 In @acronym{GnuTLS} the @acronym{X.509} certificate structures are
190 handled using the @code{gnutls_x509_crt_t} type and the corresponding
191 private keys with the @code{gnutls_x509_privkey_t} type.  All the
192 available functions for @acronym{X.509} certificate handling have
193 their prototypes in @file{gnutls/x509.h}. An example program to
194 demonstrate the @acronym{X.509} parsing capabilities can be found at
195 @ref{ex:x509-info}.
197 @node X.509 distinguished names
198 @subsection X.509 distinguished names
199 @cindex X.509 distinguished name
201 The ``subject'' of an X.509 certificate is not described by
202 a single name, but rather with a distinguished name. This in
203 X.509 terminology is a list of strings each associated an object
204 identifier. To make things simple GnuTLS provides @funcref{gnutls_x509_crt_get_dn}
205 which follows the rules in @xcite{RFC4514} and returns a single
206 string. Access to each string by individual object identifiers
207 can be accessed using @funcref{gnutls_x509_crt_get_dn_by_oid}.
209 @showfuncdesc{gnutls_x509_crt_get_dn}
210 @showfuncdesc{gnutls_x509_crt_get_dn_by_oid}
211 @showfuncdesc{gnutls_x509_crt_get_dn_oid}
213 The more powerful @funcref{gnutls_x509_crt_get_subject} and 
214 @funcref{gnutls_x509_dn_get_rdn_ava} provide efficient access
215 to the contents of the distinguished name structure.
217 @showfuncdesc{gnutls_x509_crt_get_subject}
218 @showfuncdesc{gnutls_x509_dn_get_rdn_ava}
220 Similar functions exist to access the distinguished name
221 of the issuer of the certificate.
223 @showfuncD{gnutls_x509_crt_get_issuer_dn,gnutls_x509_crt_get_issuer_dn_by_oid,gnutls_x509_crt_get_issuer_dn_oid,gnutls_x509_crt_get_issuer}
225 @node Verifying X.509 certificate paths
226 @subsection Verifying @acronym{X.509} certificate paths
227 @cindex verifying certificate paths
229 Verifying certificate paths is important in @acronym{X.509}
230 authentication. For this purpose the following functions are
231 provided.
233 @showfuncdesc{gnutls_x509_trust_list_add_cas}
234 @showfuncdesc{gnutls_x509_trust_list_add_named_crt}
235 @showfuncdesc{gnutls_x509_trust_list_add_crls}
236 @showfuncdesc{gnutls_x509_trust_list_verify_crt}
237 @showfuncdesc{gnutls_x509_trust_list_verify_named_crt}
239 The verification function will verify a given certificate chain against a list of certificate
240 authorities and certificate revocation lists, and output
241 a bit-wise OR of elements of the @code{gnutls_@-certificate_@-status_t} 
242 enumeration shown in @ref{gnutls_certificate_status_t}. The @code{GNUTLS_@-CERT_@-INVALID} flag
243 is always set on a verification error and more detailed flags will also be set when appropriate.
245 @showenumdesc{gnutls_certificate_status_t,The @code{gnutls_@-certificate_@-status_t} enumeration.}
247 An example of certificate verification is shown in @ref{ex:verify2}.
248 It is also possible to have a set of certificates that
249 are trusted for a particular server but not to authorize other certificates.
250 This purpose is served by the functions @funcref{gnutls_x509_trust_list_add_named_crt} and @funcref{gnutls_x509_trust_list_verify_named_crt}.
252 @node Verifying a certificate in the context of TLS session
253 @subsection Verifying a certificate in the context of TLS session
254 @cindex verifying certificate paths
255 @tindex gnutls_certificate_verify_flags
257 When operating in the context of a TLS session, the trusted certificate
258 authority list may also be set using:
259 @showfuncC{gnutls_certificate_set_x509_trust_file,gnutls_certificate_set_x509_crl_file,gnutls_certificate_set_x509_system_trust}
261 Then it is not required to setup a trusted list as above.
262 The function @funcref{gnutls_certificate_verify_peers2} 
263 may then be used to verify the peer's certificate chain. The flags
264 are set similarly to the verification functions in the previous section.
266 There is also the possibility to pass some input to the verification
267 functions in the form of flags. For @funcref{gnutls_x509_trust_list_verify_crt} the
268 flags are passed straightforward, but
269 @funcref{gnutls_certificate_verify_peers2} depends on the flags set by
270 calling @funcref{gnutls_certificate_set_verify_flags}.  All the available
271 flags are part of the enumeration
272 @code{gnutls_@-certificate_@-verify_@-flags} shown in @ref{gnutls_certificate_verify_flags}.
274 @showenumdesc{gnutls_certificate_verify_flags,The @code{gnutls_@-certificate_@-verify_@-flags} enumeration.}
276 Although the verification of a certificate path indicates that the
277 certificate is signed by trusted authority, does not reveal anything
278 about the peer's identity. It is required to verify if the
279 certificate's owner is the one you expect. For more information
280 consult @xcite{RFC2818} and section @ref{ex:verify} for an example.
282 @node Verifying a certificate using trust on first use authentication
283 @subsection Verifying a certificate using trust on first use authentication
284 @cindex verifying certificate paths
285 @cindex SSH-style authentication
286 @cindex Trust on first use
287 @cindex Key pinning
288 @tindex gnutls_certificate_verify_flags
290 It is possible to use a trust on first use (similar to SSH) authentication 
291 method in GnuTLS. That is the concept used by the SSH programs, where the 
292 public key of the peer is not verified, or verified in an out-of-bound way,
293 but subsequent connections to the same peer require the public key to 
294 remain the same.  Such a system in combination with the typical CA 
295 verification of a certificate, and OCSP revocation checks,
296 can help to provide multiple factor verification, where a single point of
297 failure is not enough to compromise the system. For example a server compromise
298 may be detected using OCSP, and a CA compromise can be detected using
299 the trust on first use method.
300 Such a hybrid system with X.509 and trust on first use authentication is 
301 shown in @ref{Simple client example with SSH-style certificate verification}.
303 @showfuncdesc{gnutls_verify_stored_pubkey}
304 @showfuncdesc{gnutls_store_pubkey}
306 In addition to the above the @funcref{gnutls_store_commitment} can be 
307 used to implement a key-pinning architecture as in @xcite{KEYPIN}. 
308 This provides a way for web server to commit on a public key that is
309 not yet active.
311 @showfuncdesc{gnutls_store_commitment}
313 The storage and verification functions may be used with the default
314 text file based back-end, or another back-end may be specified. That
315 should contain storage and retrieval functions and specified as below.
317 @showfuncE{gnutls_tdb_init,gnutls_tdb_deinit,gnutls_tdb_set_verify_func,gnutls_tdb_set_store_func,gnutls_tdb_set_store_commitment_func}
319 @node OpenPGP certificates
320 @section @acronym{OpenPGP} certificates
321 @cindex OpenPGP certificates
323 The @acronym{OpenPGP} key authentication relies on a distributed trust
324 model, called the ``web of trust''. The ``web of trust'' uses a
325 decentralized system of trusted introducers, which are the same as a
326 CA. @acronym{OpenPGP} allows anyone to sign anyone else's public
327 key. When Alice signs Bob's key, she is introducing Bob's key to
328 anyone who trusts Alice. If someone trusts Alice to introduce keys,
329 then Alice is a trusted introducer in the mind of that observer.
330 For example in @ref{fig:openpgp}, David trusts Alice to be an introducer and Alice
331 signed Bob's key thus Dave trusts Bob's key to be the real one.
333 @float Figure,fig:openpgp
334 @image{gnutls-pgp,8cm}
335 @caption{An example of the OpenPGP trust model.}
336 @end float
338 There are some key points that are important in that model. In the
339 example Alice has to sign Bob's key, only if she is sure that the key
340 belongs to Bob. Otherwise she may also make Dave falsely believe that
341 this is Bob's key. Dave has also the responsibility to know who to
342 trust.  This model is similar to real life relations.
344 Just see how Charlie behaves in the previous example. Although he has
345 signed Bob's key - because he knows, somehow, that it belongs to Bob -
346 he does not trust Bob to be an introducer. Charlie decided to trust
347 only Kevin, for some reason. A reason could be that Bob is lazy
348 enough, and signs other people's keys without being sure that they
349 belong to the actual owner.
351 @subsection @acronym{OpenPGP} certificate structure
353 In @acronym{GnuTLS} the @acronym{OpenPGP} key structures
354 @xcite{RFC2440} are handled using the @code{gnutls_openpgp_crt_t} type
355 and the corresponding private keys with the
356 @code{gnutls_openpgp_privkey_t} type. All the prototypes for the key
357 handling functions can be found at @file{gnutls/openpgp.h}.
359 @subsection Verifying an @acronym{OpenPGP} certificate
361 The verification functions of @acronym{OpenPGP} keys, included in
362 @acronym{GnuTLS}, are simple ones, and do not use the features of the
363 ``web of trust''.  For that reason, if the verification needs are
364 complex, the assistance of external tools like @acronym{GnuPG} and
365 GPGME@footnote{@url{http://www.gnupg.org/related_software/gpgme/}} is
366 recommended.
368 In GnuTLS there is a verification function for OpenPGP certificates,
369 the @funcref{gnutls_openpgp_crt_verify_ring}.  This checks an
370 @acronym{OpenPGP} key against a given set of public keys (keyring) and
371 returns the key status. The key verification status is the same as in
372 @acronym{X.509} certificates, although the meaning and interpretation
373 are different. For example an @acronym{OpenPGP} key may be valid, if
374 the self signature is ok, even if no signers were found.  The meaning
375 of verification status flags is the same as in the @acronym{X.509} certificates
376 (see @ref{gnutls_certificate_verify_flags}).
378 @showfuncdesc{gnutls_openpgp_crt_verify_ring}
380 @showfuncdesc{gnutls_openpgp_crt_verify_self}
382 @subsection Verifying a certificate in the context of a TLS session
384 Similarly with X.509 certificates, one needs to specify
385 the OpenPGP keyring file in the credentials structure. The certificates
386 in this file will be  used by @funcref{gnutls_certificate_verify_peers2}
387 to verify the signatures in the certificate sent by the peer.
389 @showfuncdesc{gnutls_certificate_set_openpgp_keyring_file}
394 @node Digital signatures
395 @section Digital signatures
396 @cindex digital signatures
398 In this section we will provide some information about digital
399 signatures, how they work, and give the rationale for disabling some
400 of the algorithms used.
402 Digital signatures work by using somebody's secret key to sign some
403 arbitrary data.  Then anybody else could use the public key of that
404 person to verify the signature.  Since the data may be arbitrary it is
405 not suitable input to a cryptographic digital signature algorithm. For
406 this reason and also for performance cryptographic hash algorithms are
407 used to preprocess the input to the signature algorithm. This works as
408 long as it is difficult enough to generate two different messages with
409 the same hash algorithm output. In that case the same signature could
410 be used as a proof for both messages. Nobody wants to sign an innocent
411 message of donating 1 @euro{} to Greenpeace and find out that he
412 donated 1.000.000 @euro{} to Bad Inc.
414 For a hash algorithm to be called cryptographic the following three
415 requirements must hold:
417 @enumerate
418 @item Preimage resistance.
419 That means the algorithm must be one way and given the output of the
420 hash function @math{H(x)}, it is impossible to calculate @math{x}.
422 @item 2nd preimage resistance.
423 That means that given a pair @math{x,y} with @math{y=H(x)} it is
424 impossible to calculate an @math{x'} such that @math{y=H(x')}.
426 @item Collision resistance.
427 That means that it is impossible to calculate random @math{x} and
428 @math{x'} such @math{H(x')=H(x)}.
429 @end enumerate
431 The last two requirements in the list are the most important in
432 digital signatures. These protect against somebody who would like to
433 generate two messages with the same hash output. When an algorithm is
434 considered broken usually it means that the Collision resistance of
435 the algorithm is less than brute force. Using the birthday paradox the
436 brute force attack takes
437 @iftex
438 @math{2^{(\rm{hash\ size}) / 2}}
439 @end iftex
440 @ifnottex
441 @math{2^{((hash size) / 2)}}
442 @end ifnottex
443 operations. Today colliding certificates using the MD5 hash algorithm
444 have been generated as shown in @xcite{WEGER}.
446 There has been cryptographic results for the SHA-1 hash algorithms as
447 well, although they are not yet critical.  Before 2004, MD5 had a
448 presumed collision strength of @math{2^{64}}, but it has been showed
449 to have a collision strength well under @math{2^{50}}.  As of November
450 2005, it is believed that SHA-1's collision strength is around
451 @math{2^{63}}.  We consider this sufficiently hard so that we still
452 support SHA-1.  We anticipate that SHA-256/386/512 will be used in
453 publicly-distributed certificates in the future.  When @math{2^{63}}
454 can be considered too weak compared to the computer power available
455 sometime in the future, SHA-1 will be disabled as well.  The collision
456 attacks on SHA-1 may also get better, given the new interest in tools
457 for creating them.
459 @subsection Trading security for interoperability
461 If you connect to a server and use GnuTLS' functions to verify the
462 certificate chain, and get a @code{GNUTLS_CERT_INSECURE_ALGORITHM}
463 validation error (see @ref{Verifying X.509 certificate paths}), it means
464 that somewhere in the certificate chain there is a certificate signed
465 using @code{RSA-MD2} or @code{RSA-MD5}.  These two digital signature
466 algorithms are considered broken, so GnuTLS fails verifying
467 the certificate.  In some situations, it may be useful to be
468 able to verify the certificate chain anyway, assuming an attacker did
469 not utilize the fact that these signatures algorithms are broken.
470 This section will give help on how to achieve that.
472 It is important to know that you do not have to enable any of
473 the flags discussed here to be able to use trusted root CA
474 certificates self-signed using @code{RSA-MD2} or @code{RSA-MD5}. The
475 certificates in the trusted list are considered trusted irrespective
476 of the signature.
478 If you are using @funcref{gnutls_certificate_verify_peers2} to verify the
479 certificate chain, you can call
480 @funcref{gnutls_certificate_set_verify_flags} with the flags:
481 @itemize
482 @item @code{GNUTLS_VERIFY_ALLOW_SIGN_RSA_MD2}
483 @item @code{GNUTLS_VERIFY_ALLOW_SIGN_RSA_MD5}
484 @end itemize
485 as in the following example:
487 @example
488   gnutls_certificate_set_verify_flags (x509cred,
489                                        GNUTLS_VERIFY_ALLOW_SIGN_RSA_MD5);
490 @end example
492 This will tell the verifier algorithm to enable @code{RSA-MD5} when
493 verifying the certificates.
495 If you are using @funcref{gnutls_x509_crt_verify} or
496 @funcref{gnutls_x509_crt_list_verify}, you can pass the
497 @code{GNUTLS_VERIFY_ALLOW_SIGN_RSA_MD5} parameter directly in the
498 @code{flags} parameter.
500 If you are using these flags, it may also be a good idea to warn the
501 user when verification failure occur for this reason.  The simplest is
502 to not use the flags by default, and only fall back to using them
503 after warning the user.  If you wish to inspect the certificate chain
504 yourself, you can use @funcref{gnutls_certificate_get_peers} to extract
505 the raw server's certificate chain, @funcref{gnutls_x509_crt_list_import} to parse each of the certificates, and
506 then @funcref{gnutls_x509_crt_get_signature_algorithm} to find out the
507 signing algorithm used for each certificate.  If any of the
508 intermediary certificates are using @code{GNUTLS_SIGN_RSA_MD2} or
509 @code{GNUTLS_SIGN_RSA_MD5}, you could present a warning.