[openssl-users] Hostname validation

Viktor Dukhovni openssl-users at dukhovni.org
Tue Jan 27 20:03:45 UTC 2015


On Tue, Jan 27, 2015 at 10:09:38PM +0300, Serj wrote:

> 27.01.2015, 20:23, "Viktor Dukhovni" <openssl-users at dukhovni.org>:
> > I would set SSL verification parameters is to obtain the parameter
> > handle via SSL_get0_param() or where appropriate SSL_CTX_get0_param(),
> > and use the various X509_VERIFY_PARAM_mumble() functions to tweak
> > the parameter object in place.
> 
> Why are not there any X509_VERIFY_PARAM_mumble() functions in your code?
> So your code is not complete?

It is complete enough.  The word "mumble" is not meant to be taken
literally.  The phrase:

    "various X509_VERIFY_PARAM_mumble() functions"

means any of:

    X509_VERIFY_PARAM_set_hostflags()
    X509_VERIFY_PARAM_set1_host()
    ...


> > As I mentioned, this function should be documented, but is not yet.
> > The documentation for these functions is not yet written. ?The way
> > Yes, these need (more) documentation.
> 
> That's why maybe it is better to use X509_check_host() in "post conection checks" now?

No, it is better to use the parameter functions, and also to document
the missing SSL_get0_param().

> NOTES
> Applications are encouraged to use X509_VERIFY_PARAM_set1_host()
> rather than explicitly calling X509_check_host(3). Host name checks
> are out of scope with the DANE-EE(3) certificate usage, and the
> internal checks will be suppressed as appropriate when DANE support
> is added to OpenSSL.
> ----------------------------------------------------------------------------------
> and no any documentation on how to set properly params for SSL or CTX!

Example code should likely be added to that document.

> Maybe this code is right, while there is no full documentation yet:
> 
>   char servername[]="www.openssl.org\x0";
>   X509_VERIFY_PARAM *param;
>   param = X509_VERIFY_PARAM_new();
> 
>   //enable automatic hostname checks 
>   X509_VERIFY_PARAM_set_hostflags(param, X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
>   X509_VERIFY_PARAM_set1_host(param, servername,0);
>   SSL_CTX_set1_param(ctx, param); //is right if combined by a bitwise 'OR' operation
>   
>   //free param
>   X509_VERIFY_PARAM_free(param);

No, use the code example I provided.  The above sets the hostname
in the global context, where it does not belong.  My original
message is below:

On Sun, Jan 25, 2015 at 05:57:06PM +0000, Viktor Dukhovni wrote:

> On Sun, Jan 25, 2015 at 07:43:14PM +0300, Serj wrote:
> 
> > What is the best way to make hostname validation?
> > 
> > 1. http://wiki.openssl.org/index.php/Hostname_validation
> > 2. X509_check_host that was added in OpenSSL 1.1.0.
> 
> The X509_check_host() interface is also available in OpenSSL 1.0.2
> released a few days ago
> 
>     https://www.openssl.org/docs/crypto/X509_check_host.html
> 
> (the documentation should be updated to note the earlier availability).
> 
> Starting with 1.0.2, you can also ask OpenSSL to automatically
> perform hostname checks during the SSL handshake on the application's
> behalf:
> 
>     https://www.openssl.org/docs/crypto/X509_VERIFY_PARAM_set_hostflags.html
>     https://www.openssl.org/docs/crypto/X509_VERIFY_PARAM_set1_host.html
>     https://www.openssl.org/docs/crypto/X509_VERIFY_PARAM_add1_host.html
>     https://www.openssl.org/docs/ssl/SSL_set_verify.html
> 
> Sadly, we're still lacking documentation of SSL_get0_param() which
> is needed for a complete SSL hostname check recipe:
> 
> 	const char *servername;
> 	SSL *ssl;
> 	X509_VERIFY_PARAM *param;
> 
> 	servername = "www.example.com";
> 	ssl = SSL_new(...);
> 	param = SSL_get0_param(ssl);
> 
> 	/* Enable automatic hostname checks */
> 	X509_VERIFY_PARAM_set_hostflags(param, X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
> 	X509_VERIFY_PARAM_set1_host(param, servername, 0);
> 
> 	/* Configure a non-zero callback if desired */
> 	SSL_set_verify(ssl, SSL_VERIFY_PEER, 0);
> 
> 	/*
> 	 * Establish SSL connection, hostname should be checked
> 	 * automatically test with a hostname that should not match,
> 	 * the connection will fail (unless you specify a callback
> 	 * that returns despite the verification failure.  In that
> 	 * case SSL_get_verify_status() can expose the problem after
> 	 * connection completion.
> 	 */
> 	 ...
> 
> > I don't know does the first one support wildcards or no! Seems
> > to be: how does Curl_cert_hostcheck work - is the answer, but I
> > don't know how it works.
> 
> Wildcard support is configured via the flags documented for X509_check_host(),
> the two most frequently useful are:
> 
> 	X509_CHECK_FLAG_NO_WILDCARDS
> 	X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS

-- 
	Viktor.


More information about the openssl-users mailing list