Commit b57a46c36222c45dfb7616487a74ac570970c3b1
1 parent
61dff045
Exists in
master
and in
5 other branches
Melhorando tratamento de erros SSL
Showing
2 changed files
with
55 additions
and
74 deletions
Show diff stats
src/include/lib3270/session.h
src/lib3270/telnet.c
| ... | ... | @@ -136,7 +136,7 @@ static void check_in3270(H3270 *session); |
| 136 | 136 | static void store3270in(H3270 *hSession, unsigned char c); |
| 137 | 137 | static void check_linemode(H3270 *hSession, Boolean init); |
| 138 | 138 | static int non_blocking(H3270 *session, Boolean on); |
| 139 | -static void net_connected(H3270 *session); | |
| 139 | +static int net_connected(H3270 *session); | |
| 140 | 140 | #if defined(X3270_TN3270E) /*[*/ |
| 141 | 141 | static int tn3270e_negotiate(H3270 *hSession); |
| 142 | 142 | #endif /*]*/ |
| ... | ... | @@ -595,7 +595,6 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo |
| 595 | 595 | |
| 596 | 596 | /* init ssl */ |
| 597 | 597 | #if defined(HAVE_LIBSSL) |
| 598 | - session->last_ssl_error = !0; | |
| 599 | 598 | if (session->ssl_host) |
| 600 | 599 | ssl_init(session); |
| 601 | 600 | #endif |
| ... | ... | @@ -607,7 +606,8 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo |
| 607 | 606 | if(!rc) |
| 608 | 607 | { |
| 609 | 608 | trace_dsn(session,"Connected.\n"); |
| 610 | - net_connected(session); | |
| 609 | + if(net_connected(session)) | |
| 610 | + return -1; | |
| 611 | 611 | } |
| 612 | 612 | else |
| 613 | 613 | { |
| ... | ... | @@ -729,10 +729,12 @@ static void setup_lus(H3270 *hSession) |
| 729 | 729 | } |
| 730 | 730 | |
| 731 | 731 | #if defined(HAVE_LIBSSL) |
| 732 | -static void ssl_negotiate(H3270 *hSession) | |
| 732 | +static int ssl_negotiate(H3270 *hSession) | |
| 733 | 733 | { |
| 734 | 734 | int rv; |
| 735 | 735 | |
| 736 | + trace("%s",__FUNCTION__); | |
| 737 | + | |
| 736 | 738 | set_ssl_state(hSession,LIB3270_SSL_NEGOTIATING); |
| 737 | 739 | non_blocking(hSession,False); |
| 738 | 740 | |
| ... | ... | @@ -743,7 +745,7 @@ static void ssl_negotiate(H3270 *hSession) |
| 743 | 745 | /* Failed. */ |
| 744 | 746 | popup_an_error(hSession,_( "SSL init failed!")); |
| 745 | 747 | net_disconnect(hSession); |
| 746 | - return; | |
| 748 | + return -1; | |
| 747 | 749 | } |
| 748 | 750 | |
| 749 | 751 | /* Set up the TLS/SSL connection. */ |
| ... | ... | @@ -752,7 +754,7 @@ static void ssl_negotiate(H3270 *hSession) |
| 752 | 754 | trace_dsn(hSession,"SSL_set_fd failed!\n"); |
| 753 | 755 | popup_an_error(hSession,_( "SSL_set_fd failed!")); |
| 754 | 756 | net_disconnect(hSession); |
| 755 | - return; | |
| 757 | + return -1; | |
| 756 | 758 | } |
| 757 | 759 | |
| 758 | 760 | trace("%s: Running SSL_connect",__FUNCTION__); |
| ... | ... | @@ -761,13 +763,34 @@ static void ssl_negotiate(H3270 *hSession) |
| 761 | 763 | |
| 762 | 764 | if (rv != 1) |
| 763 | 765 | { |
| 764 | - trace_dsn(hSession,"continue_tls: SSL_connect failed\n"); | |
| 765 | - popup_an_error(hSession,_( "SSL connect failed!")); | |
| 766 | + int ssl_error = SSL_get_error(hSession->ssl_con,rv); | |
| 767 | + | |
| 768 | + if(ssl_error == SSL_ERROR_SYSCALL) | |
| 769 | + { | |
| 770 | + if(!hSession->ssl_error) | |
| 771 | + { | |
| 772 | + trace_dsn(hSession,"SSL_connect failed (ssl_error=%lu)\n",hSession->ssl_error); | |
| 773 | + popup_an_error(hSession,_( "SSL connect failed!")); | |
| 774 | + } | |
| 775 | + else | |
| 776 | + { | |
| 777 | + trace_dsn(hSession,"SSL_connect failed: %s %s\n", | |
| 778 | + ERR_lib_error_string(hSession->ssl_error), | |
| 779 | + ERR_reason_error_string(hSession->ssl_error)); | |
| 780 | + popup_an_error(hSession,_( ERR_reason_error_string(hSession->ssl_error) )); | |
| 781 | + } | |
| 782 | + | |
| 783 | + } | |
| 784 | + else | |
| 785 | + { | |
| 786 | + trace_dsn(hSession,"SSL_connect failed (ssl_error=%d errno=%d)\n",ssl_error,errno); | |
| 787 | + popup_an_error(hSession,_( "SSL connect failed!")); | |
| 788 | + } | |
| 789 | + | |
| 766 | 790 | net_disconnect(hSession); |
| 767 | - return; | |
| 791 | + return -1; | |
| 768 | 792 | } |
| 769 | 793 | |
| 770 | -// hSession->secure_connection = True; | |
| 771 | 794 | non_blocking(hSession,True); |
| 772 | 795 | |
| 773 | 796 | /* Success. */ |
| ... | ... | @@ -816,10 +839,11 @@ static void ssl_negotiate(H3270 *hSession) |
| 816 | 839 | |
| 817 | 840 | /* Tell the world that we are (still) connected, now in secure mode. */ |
| 818 | 841 | lib3270_set_connected(hSession); |
| 842 | + return 0; | |
| 819 | 843 | } |
| 820 | 844 | #endif // HAVE_LIBSSL |
| 821 | 845 | |
| 822 | -static void net_connected(H3270 *hSession) | |
| 846 | +static int net_connected(H3270 *hSession) | |
| 823 | 847 | { |
| 824 | 848 | if(hSession->proxy_type > 0) |
| 825 | 849 | { |
| ... | ... | @@ -829,62 +853,24 @@ static void net_connected(H3270 *hSession) |
| 829 | 853 | if (proxy_negotiate(hSession, hSession->proxy_type, hSession->sock, hSession->hostname,hSession->current_port) < 0) |
| 830 | 854 | { |
| 831 | 855 | host_disconnect(hSession,True); |
| 832 | - return; | |
| 856 | + return -1; | |
| 833 | 857 | } |
| 834 | 858 | } |
| 835 | 859 | |
| 836 | 860 | trace_dsn(hSession,"Connected to %s, port %u%s.\n", hSession->hostname, hSession->current_port,hSession->ssl_host? " via SSL": ""); |
| 837 | 861 | |
| 838 | -#if defined(HAVE_LIBSSL) /*[*/ | |
| 862 | +#if defined(HAVE_LIBSSL) | |
| 839 | 863 | /* Set up SSL. */ |
| 840 | 864 | if(hSession->ssl_con && hSession->secure == LIB3270_SSL_UNDEFINED) |
| 841 | 865 | { |
| 842 | - ssl_negotiate(hSession); | |
| 843 | -/* | |
| 844 | - int rc; | |
| 845 | - | |
| 846 | - set_ssl_state(hSession,LIB3270_SSL_NEGOTIATING); | |
| 847 | - | |
| 848 | - if (SSL_set_fd(hSession->ssl_con, hSession->sock) != 1) | |
| 849 | - { | |
| 850 | - trace_dsn(hSession,"Can't set fd!\n"); | |
| 851 | - popup_system_error(hSession,_( "Connection failed" ), _( "Can't set SSL socket file descriptor" ), "%s", SSL_state_string_long(hSession->ssl_con)); | |
| 852 | - set_ssl_state(hSession,LIB3270_SSL_UNSECURE); | |
| 853 | - } | |
| 854 | - else | |
| 855 | - { | |
| 856 | - rc = SSL_connect(hSession->ssl_con); | |
| 857 | - | |
| 858 | - if(rc != 1) | |
| 859 | - { | |
| 860 | - unsigned long e = ERR_get_error(); | |
| 861 | - const char * state = SSL_state_string_long(hSession->ssl_con); | |
| 862 | - | |
| 863 | - trace_dsn(hSession,"TLS/SSL tunneled connection failed with error %ld, rc=%d and state=%s",e,rc,state); | |
| 864 | - | |
| 865 | - host_disconnect(hSession,True); | |
| 866 | - | |
| 867 | - if(e != hSession->last_ssl_error) | |
| 868 | - { | |
| 869 | - hSession->message(hSession,LIB3270_NOTIFY_ERROR,_( "Connection failed" ),_( "SSL negotiation failed" ),state); | |
| 870 | - hSession->last_ssl_error = e; | |
| 871 | - } | |
| 872 | - return; | |
| 873 | - | |
| 874 | - } | |
| 875 | - } | |
| 876 | - | |
| 877 | -// hSession->secure_connection = True; | |
| 878 | - trace_dsn(hSession,"TLS/SSL tunneled connection complete. Connection is now secure.\n"); | |
| 879 | - | |
| 880 | - // Tell everyone else again. | |
| 881 | - lib3270_set_connected(hSession); | |
| 882 | -*/ | |
| 866 | + if(ssl_negotiate(hSession)) | |
| 867 | + return -1; | |
| 883 | 868 | } |
| 884 | -#endif /*]*/ | |
| 869 | +#endif | |
| 885 | 870 | |
| 886 | 871 | lib3270_setup_session(hSession); |
| 887 | 872 | |
| 873 | + return 0; | |
| 888 | 874 | } |
| 889 | 875 | |
| 890 | 876 | /** |
| ... | ... | @@ -1120,7 +1106,8 @@ void net_input(H3270 *hSession) |
| 1120 | 1106 | |
| 1121 | 1107 | host_disconnect(hSession,True); |
| 1122 | 1108 | return; |
| 1123 | - } else if (nr == 0) | |
| 1109 | + } | |
| 1110 | + else if (nr == 0) | |
| 1124 | 1111 | { |
| 1125 | 1112 | /* Host disconnected. */ |
| 1126 | 1113 | trace_dsn(hSession,"RCVD disconnect\n"); |
| ... | ... | @@ -1137,7 +1124,8 @@ void net_input(H3270 *hSession) |
| 1137 | 1124 | return; |
| 1138 | 1125 | } |
| 1139 | 1126 | lib3270_set_connected(hSession); |
| 1140 | - net_connected(hSession); | |
| 1127 | + if(net_connected(hSession)) | |
| 1128 | + return; | |
| 1141 | 1129 | } |
| 1142 | 1130 | |
| 1143 | 1131 | lib3270_data_recv(hSession, nr, buffer); |
| ... | ... | @@ -3094,6 +3082,7 @@ static void ssl_init(H3270 *session) |
| 3094 | 3082 | { |
| 3095 | 3083 | static SSL_CTX *ssl_ctx = NULL; |
| 3096 | 3084 | |
| 3085 | + session->ssl_error = 0; | |
| 3097 | 3086 | set_ssl_state(session,LIB3270_SSL_UNDEFINED); |
| 3098 | 3087 | |
| 3099 | 3088 | if(ssl_ctx == NULL) |
| ... | ... | @@ -3129,6 +3118,7 @@ static void ssl_init(H3270 *session) |
| 3129 | 3118 | |
| 3130 | 3119 | SSL_set_ex_data(session->ssl_con,ssl_3270_ex_index,(char *) session); |
| 3131 | 3120 | |
| 3121 | +// SSL_set_verify(session->ssl_con, SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); | |
| 3132 | 3122 | SSL_set_verify(session->ssl_con, 0, NULL); |
| 3133 | 3123 | |
| 3134 | 3124 | } |
| ... | ... | @@ -3164,14 +3154,9 @@ static void ssl_info_callback(INFO_CONST SSL *s, int where, int ret) |
| 3164 | 3154 | unsigned long e = ERR_get_error(); |
| 3165 | 3155 | char err_buf[1024]; |
| 3166 | 3156 | |
| 3167 | - while(ERR_peek_error() == e) // Remove other messages with the same error | |
| 3168 | - e = ERR_get_error(); | |
| 3169 | - | |
| 3170 | 3157 | if(e != 0) |
| 3171 | 3158 | { |
| 3172 | - if(e == hSession->last_ssl_error) | |
| 3173 | - return; | |
| 3174 | - hSession->last_ssl_error = e; | |
| 3159 | + hSession->ssl_error = e; | |
| 3175 | 3160 | (void) ERR_error_string_n(e, err_buf, 1023); |
| 3176 | 3161 | } |
| 3177 | 3162 | #if defined(_WIN32) |
| ... | ... | @@ -3190,16 +3175,12 @@ static void ssl_info_callback(INFO_CONST SSL *s, int where, int ret) |
| 3190 | 3175 | err_buf[0] = '\0'; |
| 3191 | 3176 | } |
| 3192 | 3177 | |
| 3193 | - trace_dsn(hSession,"SSL Connect error in %s\nState: %s\nAlert: %s\n",err_buf,SSL_state_string_long(s),SSL_alert_type_string_long(ret)); | |
| 3194 | - | |
| 3195 | - lib3270_popup_dialog( hSession, // H3270 *session, | |
| 3196 | - PW3270_DIALOG_CRITICAL, // PW3270_DIALOG type, | |
| 3197 | - _( "SSL Connect error" ), // Title | |
| 3198 | - err_buf, // Message | |
| 3199 | - _( "<b>Connection state:</b> %s\n<b>Alert message:</b> %s" ), | |
| 3200 | - SSL_state_string_long(s), | |
| 3201 | - SSL_alert_type_string_long(ret)); | |
| 3202 | - | |
| 3178 | + trace_dsn(hSession,"SSL Connect error %d\nMessage: %s\nState: %s\nAlert: %s\n", | |
| 3179 | + ret, | |
| 3180 | + err_buf, | |
| 3181 | + SSL_state_string_long(s), | |
| 3182 | + SSL_alert_type_string_long(ret) | |
| 3183 | + ); | |
| 3203 | 3184 | |
| 3204 | 3185 | } |
| 3205 | 3186 | ... | ... |