Viktor Dukhovni | 919ba00 | 2015-12-29 13:28:28 -0500 | [diff] [blame] | 1 | =pod |
| 2 | |
| 3 | =head1 NAME |
| 4 | |
| 5 | SSL_CTX_dane_enable, SSL_CTX_dane_mtype_set, SSL_dane_enable, |
| 6 | SSL_dane_tlsa_add, SSL_get0_dane_authority, SSL_get0_dane_tlsa - |
| 7 | enable DANE TLS authentication of the remote TLS server in the local |
| 8 | TLS client |
| 9 | |
| 10 | =head1 SYNOPSIS |
| 11 | |
| 12 | #include <openssl/ssl.h> |
| 13 | |
| 14 | int SSL_CTX_dane_enable(SSL_CTX *ctx); |
| 15 | int SSL_CTX_dane_mtype_set(SSL_CTX *ctx, const EVP_MD *md, |
| 16 | uint8_t mtype, uint8_t ord); |
| 17 | int SSL_dane_enable(SSL *s, const char *basedomain); |
| 18 | int SSL_dane_tlsa_add(SSL *s, uint8_t usage, uint8_t selector, |
| 19 | uint8_t mtype, unsigned char *data, size_t dlen); |
| 20 | int SSL_get0_dane_authority(SSL *s, X509 **mcert, EVP_PKEY **mspki); |
| 21 | int SSL_get0_dane_tlsa(SSL *s, uint8_t *usage, uint8_t *selector, |
| 22 | uint8_t *mtype, unsigned const char **data, |
| 23 | size_t *dlen); |
| 24 | |
| 25 | =head1 DESCRIPTION |
| 26 | |
| 27 | These functions implement support for DANE TLSA (RFC6698 and RFC7671) |
| 28 | peer authentication. |
| 29 | |
| 30 | SSL_CTX_dane_enable() must be called first to initialize the |
| 31 | shared state required for DANE support. Individual connections |
| 32 | associated with the context can then enable per-connection DANE |
| 33 | support as appropriate. DANE authentication is implemented in the |
| 34 | L<X509_verify_cert(3)> function, and applications that override |
| 35 | L<X509_verify_cert(3)> via L<SSL_CTX_set_cert_verify_callback(3)> |
| 36 | are responsible to authenticate the peer chain in whatever manner |
| 37 | they see fit. |
| 38 | |
| 39 | SSL_CTX_dane_mtype_set() may then be called zero or more times to |
| 40 | to adjust the supported digest algorithms. This must be done before |
| 41 | any SSL handles are created for the context. |
| 42 | |
| 43 | The B<mtype> argument specifies a DANE TLSA matching type and the |
Viktor Dukhovni | 63b6583 | 2016-01-06 13:48:16 -0500 | [diff] [blame] | 44 | B<md> argument specifies the associated digest algorithm handle. |
Viktor Dukhovni | 919ba00 | 2015-12-29 13:28:28 -0500 | [diff] [blame] | 45 | The B<ord> argument specifies a strength ordinal. Algorithms with |
| 46 | a larger strength ordinal are considered more secure. Strength |
| 47 | ordinals are used to implement RFC7671 digest algorithm agility. |
| 48 | Specifying a B<NULL> digest algorithm for a matching type disables |
| 49 | support for that matching type. Matching type Full(0) cannot be |
| 50 | modified or disabled. |
| 51 | |
| 52 | By default, matching type C<SHA2-256(1)> (see RFC7218 for definitions |
| 53 | of the DANE TLSA parameter acronyms) is mapped to C<EVP_sha256()> |
| 54 | with a strength ordinal of C<1> and matching type C<SHA2-512(2)> |
| 55 | is mapped to C<EVP_sha512()> with a strength ordinal of C<2>. |
| 56 | |
Viktor Dukhovni | 80f63d6 | 2016-01-16 15:29:44 -0500 | [diff] [blame^] | 57 | SSL_dane_enable() must be called before the SSL handshake is initiated with |
| 58 | L<SSL_connect(3)> if (and only if) you want to enable DANE for that connection. |
Viktor Dukhovni | 919ba00 | 2015-12-29 13:28:28 -0500 | [diff] [blame] | 59 | (The connection must be associated with a DANE-enabled SSL context). |
| 60 | The B<basedomain> argument specifies the RFC7671 TLSA base domain, |
| 61 | which will be the primary peer reference identifier for certificate |
| 62 | name checks. Additional server names can be specified via |
| 63 | L<SSL_add1_host(3)>. The B<basedomain> is used as the default SNI |
| 64 | hint if none has yet been specified via L<SSL_set_tlsext_host_name(3)>. |
| 65 | |
| 66 | SSL_dane_tlsa_add() may then be called one or more times, to |
| 67 | load each of the TLSA records that apply to the remote TLS peer. |
| 68 | (This too must be done prior to the beginning of the SSL handshake). |
| 69 | The arguments specify the fields of the TLSA record. The B<data> |
| 70 | field is provided in binary (wire RDATA) form, not the hexadecimal ASCII |
| 71 | presentation form, with an explicit length passed via B<dlen>. |
| 72 | A return value of 0 indicates that "unusable" TLSA records |
| 73 | (with invalid or unsupported parameters) were provided, a negative |
| 74 | return value indicates an internal error in processing the records. |
| 75 | If DANE authentication is enabled, but no TLSA records are added |
| 76 | successfully, authentication will fail, and the handshake may not |
| 77 | complete, depending on the B<mode> argument of L<SSL_set_verify(3)> |
| 78 | and any verification callback. |
| 79 | |
| 80 | SSL_get0_dane_authority() can be used to get more detailed information |
| 81 | about the matched DANE trust-anchor after successful connection |
| 82 | completion. The return value is negative if DANE verification |
| 83 | failed (or was not enabled), 0 if an EE TLSA record directly matched |
| 84 | the leaf certificate, or a positive number indicating the depth at |
| 85 | which a TA record matched an issuer certificate. |
| 86 | |
| 87 | If the B<mcert> argument is not B<NULL> and a TLSA record matched |
| 88 | a chain certificate, a pointer to the matching certificate is |
| 89 | returned via B<mcert>. The returned address is a short-term internal |
| 90 | reference to the certificate and must not be freed by the application. |
| 91 | Applications that want to retain access to the certificate can call |
| 92 | L<X509_up_ref(3)> to obtain a long-term reference which must then |
| 93 | be freed via L<X509_free(3)> once no longer needed. |
| 94 | |
| 95 | If no TLSA records directly matched any elements of the certificate |
| 96 | chain, but a DANE-TA(2) SPKI(1) Full(0) record provided the public |
| 97 | key that signed an element of the chain, then that key is returned |
| 98 | via B<mspki> argument (if not NULL). In this case the return value |
| 99 | is the depth of the top-most element of the validated certificate |
| 100 | chain. As with B<mcert> this is a short-term internal reference, |
| 101 | and L<EVP_PKEY_up_ref(3)> and L<EVP_PKEY_free(3)> can be used to |
| 102 | acquire and release long-term references respectively. |
| 103 | |
| 104 | SSL_get0_dane_tlsa() can be used to retrieve the fields of the |
| 105 | TLSA record that matched the peer certificate chain. The return |
| 106 | value indicates the match depth or failure to match just as with |
| 107 | SSL_get0_dane_authority(). When the return value is non-negative, |
| 108 | the storage pointed to by the B<usage>, B<selector>, B<mtype> and |
| 109 | B<data> parameters is updated to the corresponding TLSA record |
| 110 | fields. The B<data> field is in binary wire form, and is therefore |
| 111 | not NUL-terminated, its length is returned via the B<dlen> parameter. |
| 112 | If any of these parameters is NULL, the corresponding field |
| 113 | is not returned. The B<data> parameter is set to a short-term |
| 114 | internal-copy of the associated data field and must not be freed |
| 115 | by the application. Applications that need long-term access to |
| 116 | this field need to copy the content. |
| 117 | |
| 118 | =head1 RETURN VALUES |
| 119 | |
| 120 | The functions SSL_CTX_dane_enable(), SSL_CTX_dane_mtype_set(), |
| 121 | SSL_dane_enable() and SSL_dane_tlsa_add() return a positive value |
| 122 | on success. Negative return values indicate resource problems (out |
| 123 | of memory, etc.) in the SSL library, while a return value of B<0> |
| 124 | indicates incorrect usage or invalid input, such as an unsupported |
| 125 | TLSA record certificate usage, selector or matching type. Invalid |
| 126 | input also includes malformed data, either a digest length that |
| 127 | does not match the digest algorithm, or a C<Full(0)> (binary ASN.1 |
| 128 | DER form) certificate or a public key that fails to parse. |
| 129 | |
| 130 | The functions SSL_get0_dane_authority() and SSL_get0_dane_tlsa() |
| 131 | return a negative value when DANE authentication failed or was not |
| 132 | enabled, a non-negative value indicates the chain depth at which |
| 133 | the TLSA record matched a chain certificate, or the depth of the |
| 134 | top-most certificate, when the TLSA record is a full public key |
| 135 | that is its signer. |
| 136 | |
| 137 | =head1 EXAMPLE |
| 138 | |
| 139 | Suppose "smtp.example.com" is the MX host of the domain "example.com", |
| 140 | and has DNSSEC-validated TLSA records. The calls below will perform |
| 141 | DANE authentication and arrange to match either the MX hostname or |
| 142 | the destination domain name in the SMTP server certificate. Wildcards |
| 143 | are supported, but must match the entire label. The actual name |
| 144 | matched in the certificate (which might be a wildcard) is retrieved, |
| 145 | and must be copied by the application if it is to be retained beyond |
| 146 | the lifetime of the SSL connection. |
| 147 | |
| 148 | SSL_CTX *ctx; |
| 149 | SSL *ssl; |
| 150 | int num_usable = 0; |
| 151 | const char *nexthop_domain = "example.com"; |
| 152 | const char *dane_tlsa_domain = "smtp.example.com"; |
| 153 | uint8_t usage, selector, mtype; |
| 154 | |
| 155 | if ((ctx = SSL_CTX_new(TLS_client_method())) == NULL) |
| 156 | /* handle error */ |
| 157 | if (SSL_CTX_dane_enable(ctx) <= 0) |
| 158 | /* handle error */ |
| 159 | |
| 160 | if ((ssl = SSL_new(ctx)) == NULL) |
| 161 | /* handle error */ |
| 162 | |
| 163 | if (SSL_dane_enable(ssl, dane_tlsa_domain) <= 0) |
| 164 | /* handle error */ |
| 165 | if (!SSL_add1_host(ssl, nexthop_domain)) |
| 166 | /* handle error */ |
| 167 | SSL_set_hostflags(ssl, X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS); |
| 168 | |
| 169 | for (... each TLSA record ...) { |
| 170 | unsigned char *data; |
| 171 | size_t len; |
| 172 | int ret; |
| 173 | |
| 174 | /* set usage, selector, mtype, data, len */ |
| 175 | |
| 176 | /* Opportunistic DANE TLS clients treat usages 0, 1 as unusable. */ |
| 177 | switch (usage) { |
| 178 | case 0: /* PKIX-TA(0) */ |
| 179 | case 1: /* PKIX-EE(1) */ |
| 180 | continue; |
| 181 | } |
| 182 | |
| 183 | ret = SSL_dane_tlsa_add(ssl, usage, selector, mtype, data, len); |
Viktor Dukhovni | 63b6583 | 2016-01-06 13:48:16 -0500 | [diff] [blame] | 184 | /* free data as appropriate */ |
Viktor Dukhovni | 919ba00 | 2015-12-29 13:28:28 -0500 | [diff] [blame] | 185 | |
| 186 | if (ret < 0) |
| 187 | /* handle SSL library internal error */ |
| 188 | else if (ret == 0) |
| 189 | /* handle unusable TLSA record */ |
| 190 | else |
| 191 | ++num_usable; |
| 192 | } |
| 193 | |
| 194 | /* |
| 195 | * Opportunistic DANE clients use unauthenticated TLS when all TLSA records |
| 196 | * are unusable, so continue the handshake even if authentication fails. |
| 197 | */ |
| 198 | if (num_usable == 0) { |
| 199 | int (*cb)(int ok, X509_STORE_CTX *sctx) = NULL; |
| 200 | |
| 201 | /* Log all records unusable? */ |
| 202 | /* Set cb to a non-NULL callback of your choice? */ |
| 203 | |
| 204 | SSL_set_verify(ssl, SSL_VERIFY_NONE, cb); |
| 205 | } |
| 206 | |
| 207 | /* Perform SSL_connect() handshake and handle errors here */ |
| 208 | |
| 209 | if (SSL_get_verify_result(ssl) == X509_V_OK) { |
| 210 | const char *peername = SSL_get0_peername(ssl); |
| 211 | EVP_PKEY *mspki = NULL; |
| 212 | |
Viktor Dukhovni | 80f63d6 | 2016-01-16 15:29:44 -0500 | [diff] [blame^] | 213 | int depth = SSL_get0_dane_authority(ssl, NULL, &mspki); |
Viktor Dukhovni | 919ba00 | 2015-12-29 13:28:28 -0500 | [diff] [blame] | 214 | if (depth >= 0) { |
Viktor Dukhovni | 80f63d6 | 2016-01-16 15:29:44 -0500 | [diff] [blame^] | 215 | (void) SSL_get0_dane_tlsa(ssl, &usage, &selector, &mtype, NULL, NULL); |
Viktor Dukhovni | 919ba00 | 2015-12-29 13:28:28 -0500 | [diff] [blame] | 216 | printf("DANE TLSA %d %d %d %s at depth %d\n", usage, selector, mtype, |
| 217 | (mspki != NULL) ? "TA public key verified certificate" : |
| 218 | depth ? "matched TA certificate" : "matched EE certificate", |
| 219 | depth); |
| 220 | } |
| 221 | if (peername != NULL) { |
| 222 | /* Name checks were in scope and matched the peername */ |
| 223 | printf(bio, "Verified peername: %s\n", peername); |
| 224 | } |
| 225 | } else { |
| 226 | /* |
| 227 | * Not authenticated, presumably all TLSA rrs unusable, but possibly a |
| 228 | * callback suppressed connection termination despite presence of TLSA |
| 229 | * usable RRs none of which matched. Do whatever is appropriate for |
| 230 | * unauthenticated connections. |
| 231 | */ |
| 232 | } |
| 233 | |
| 234 | =head1 NOTES |
| 235 | |
| 236 | It is expected that the majority of clients employing DANE TLS will |
| 237 | be doing "opportunistic DANE TLS" in the sense of RFC7672 and |
| 238 | RFC7435. That is, they will use DANE authentication when |
| 239 | DNSSEC-validated TLSA records are published for a given peer, and |
| 240 | otherwise will use unauthenticated TLS or even cleartext. |
| 241 | |
| 242 | Such applications should generally treat any TLSA records published |
| 243 | by the peer with usages PKIX-TA(0) and PKIX-EE(1) as "unusable", |
| 244 | and should not include them among the TLSA records used to authenticate |
| 245 | peer connections. In addition, some TLSA records with supported |
| 246 | usages may be "unusable" as a result of invalid or unsupported |
| 247 | parameters. |
| 248 | |
| 249 | When a peer has TLSA records, but none are "usable", an opportunistic |
| 250 | application must avoid cleartext, but cannot authenticate the peer, |
| 251 | and so should generally proceed with an unauthenticated connection. |
| 252 | Opportunistic applications need to note the return value of each |
| 253 | call to SSL_dane_tlsa_add(), and if all return 0 (due to invalid |
| 254 | or unsupported parameters) disable peer authentication by calling |
| 255 | L<SSL_set_verify(3)> with B<mode> equal to B<SSL_VERIFY_NONE>. |
| 256 | |
| 257 | =head1 SEE ALSO |
| 258 | |
| 259 | L<SSL_new(3)>, |
| 260 | L<SSL_add1_host(3)>, |
| 261 | L<SSL_set_hostflags(3)>, |
| 262 | L<SSL_set_tlsext_host_name(3)>, |
| 263 | L<SSL_set_verify(3)>, |
| 264 | L<SSL_CTX_set_cert_verify_callback(3)>, |
| 265 | L<X509_verify_cert(3)>, |
| 266 | L<SSL_connect(3)>, |
| 267 | L<SSL_get0_peername(3)>, |
| 268 | L<EVP_get_digestbyname(3)>, |
| 269 | L<X509_up_ref(3)>, |
| 270 | L<X509_free(3)>, |
| 271 | L<EVP_PKEY_up_ref(3)>, |
| 272 | L<EVP_PKEY_free(3)> |
| 273 | |
| 274 | =head1 HISTORY |
| 275 | |
| 276 | These functions were first added to OpenSSL 1.1.0. |
| 277 | |
| 278 | =cut |