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.