ustream-openssl: wolfSSL: fix certificate validation
authorPetr Štetiar <ynezz@true.cz>
Wed, 9 Dec 2020 16:51:18 +0000 (17:51 +0100)
committerPetr Štetiar <ynezz@true.cz>
Thu, 10 Dec 2020 11:24:34 +0000 (12:24 +0100)
commitc6b4c48689a3e80a6fd26a66f8699a2d8aaece6d
tree7420ee9b4cbd91e87f6ec2970b8f03cfa39078c3
parent3bc05402bfabc711a335262cbb40664b6dfb1240
ustream-openssl: wolfSSL: fix certificate validation

Currently wolfSSL doesn't validate any certificates, quoting from
README:

 wolfSSL takes a different approach to certificate verification than
 OpenSSL does. The default policy for the client is to verify the server,
 this means that if you don't load CAs to verify the server you'll get a
 connect error, no signer error to confirm failure (-188).

 If you want to mimic OpenSSL behavior of having SSL_connect succeed even if
 verifying the server fails and reducing security you can do this by calling:

  wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0);

 before calling wolfSSL_new();. Though it's not recommended.

wolfSSL simply behaves differently then OpenSSL so once you set
SSL_VERIFY_NONE wolfSSL doesn't care about the certificates anymore so
every call to SSL_get_verify_result() is going to succeed (returns
X509_V_OK) even for invalid certificates and current OpenSSL based post
connection verification logic thus doesn't work.

So in order to get the validation working we need to use SSL_VERIFY_PEER
for wolfSSL by default and allow disabling it explicitly by new
`context_set_require_validation()` call. In order to keep the same error
handling/messages via `notify_verify_error()` callback we as well need
to handle certificate errors manually.

Fixes: FS#3465
Signed-off-by: Petr Štetiar <ynezz@true.cz>
ustream-internal.h
ustream-openssl.c
ustream-ssl.c
ustream-ssl.h