25
25
#include <openssl/ssl.h>
26
26
#include <openssl/err.h>
27
27
#include <openssl/opensslv.h>
28
+ #include <openssl/x509v3.h>
28
29
29
30
#ifdef FLB_SYSTEM_WINDOWS
30
31
#define strtok_r (str , delimiter , context ) \
@@ -636,11 +637,33 @@ static int tls_net_write(struct flb_tls_session *session,
636
637
return ret ;
637
638
}
638
639
640
+ int setup_hostname_validation (struct tls_session * session , const char * hostname )
641
+ {
642
+ X509_VERIFY_PARAM * param ;
643
+
644
+ param = SSL_get0_param (session -> ssl );
645
+
646
+ if (!param ) {
647
+ flb_error ("[tls] error: ssl context is invalid" );
648
+ return -1 ;
649
+ }
650
+
651
+ X509_VERIFY_PARAM_set_hostflags (param , X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS );
652
+ if (!X509_VERIFY_PARAM_set1_host (param , hostname , 0 )) {
653
+ flb_error ("[tls] error: hostname parameter vailidation is failed : %s" ,
654
+ hostname );
655
+ return -1 ;
656
+ }
657
+
658
+ return 0 ;
659
+ }
660
+
639
661
static int tls_net_handshake (struct flb_tls * tls ,
640
662
char * vhost ,
641
663
void * ptr_session )
642
664
{
643
665
int ret = 0 ;
666
+ long ssl_code = 0 ;
644
667
char err_buf [256 ];
645
668
struct tls_session * session = ptr_session ;
646
669
struct tls_context * ctx ;
@@ -669,6 +692,20 @@ static int tls_net_handshake(struct flb_tls *tls,
669
692
}
670
693
}
671
694
695
+ if (tls -> verify == FLB_TRUE ) {
696
+ if (vhost != NULL ) {
697
+ ret = setup_hostname_validation (session , vhost );
698
+ }
699
+ else if (tls -> vhost ) {
700
+ ret = setup_hostname_validation (session , tls -> vhost );
701
+ }
702
+
703
+ if (ret != 0 ) {
704
+ pthread_mutex_unlock (& ctx -> mutex );
705
+ return -1 ;
706
+ }
707
+ }
708
+
672
709
ERR_clear_error ();
673
710
674
711
if (tls -> mode == FLB_TLS_CLIENT_MODE ) {
@@ -686,7 +723,14 @@ static int tls_net_handshake(struct flb_tls *tls,
686
723
// The SSL_ERROR_SYSCALL with errno value of 0 indicates unexpected
687
724
// EOF from the peer. This is fixed in OpenSSL 3.0.
688
725
if (ret == 0 ) {
689
- flb_error ("[tls] error: unexpected EOF" );
726
+ ssl_code = SSL_get_verify_result (session -> ssl );
727
+ if (ssl_code != X509_V_OK ) {
728
+ flb_error ("[tls] error: unexpected EOF with reason: %s" ,
729
+ ERR_reason_error_string (ERR_get_error ()));
730
+ }
731
+ else {
732
+ flb_error ("[tls] error: unexpected EOF" );
733
+ }
690
734
} else {
691
735
ERR_error_string_n (ret , err_buf , sizeof (err_buf )- 1 );
692
736
flb_error ("[tls] error: %s" , err_buf );
0 commit comments