<div dir="ltr">Hi All<br><br><div>We are trying to run Squid 4.8, compiled with OpenSSL 1.1.1 (see [1]) on Ubuntu 18.04 as a transparent proxy for the purpose of egress filtering of HTTPS traffic using SNI (see config in [2]). It it works correctly when contacting some addresses (e.g. <a href="https://www.ubuntu.com">https://www.ubuntu.com</a>) but not others (e.g. <a href="https://www.google.com">https://www.google.com</a>). When we contact 
<a href="https://www.google.com">https://www.google.com</a> using TLS1.2 we get the error in the logs:</div><div>2019/09/15 10:33:09 kid1| ERROR: negotiating TLS on FD 19: error:1425F175:SSL routines:ssl_choose_client_version:inappropriate fallback (1/-1/0)</div><div>and the page returned to the client contains ERR_SECURE_CONNECT_FAIL. When TLS1.3 is used, the connections are made correctly, however my application is constrained to java8 & tomcat8 which does not support TLS1.3.<br></div><div><br></div><div>Connections are made using curl or openssl s_client. For example:</div>openssl s_client -tls1_2  -CAfile squid.crt -connect <a href="http://www.google.com:443">www.google.com:443</a> -tlsextdebug<br>[237/1854]CONNECTED(00000005)<br>TLS server extension "renegotiation info" (id=65281), len=1<br>0000 - 00                                                .<br>TLS server extension "EC point formats" (id=11), len=4<br>0000 - 03 00 01 02                                       ....<br>TLS server extension "session ticket" (id=35), len=0<br>TLS server extension "extended master secret" (id=23), len=0<br>depth=1 C = GB, ST = London, L = squid, O = squid, CN = squid<br>verify return:1<br>depth=0 CN = <a href="http://www.google.com">www.google.com</a><br>verify return:1<br>---<br>Certificate chain<br> 0 s:CN = <a href="http://www.google.com">www.google.com</a><br>   i:C = GB, ST = London, L = squid, O = squid, CN = squid<br> 1 s:C = GB, ST = London, L = squid, O = squid, CN = squid<br>   i:C = GB, ST = London, L = squid, O = squid, CN = squid<br> 2 s:C = GB, ST = London, L = squid, O = squid, CN = squid<br>   i:C = GB, ST = London, L = squid, O = squid, CN = squid<br><div>etc</div><div><br></div><div>Attached are pcap files showing first a bad connection to google and then a working connection to ubuntu. Looking at the pcap files the difference in the google and ubuntu server hello lies in the extensions and the cypher:<br></div><div>Google:</div>Handshake Protocol: Server Hello<br>    Handshake Type: Server Hello (2)<br>    Length: 59<br>    Version: TLS 1.2 (0x0303)<br>    Random: 5d7e05552e1fdea260f67e0bdf413f6a9837fbaffdebeb35…<br>    Session ID Length: 0<br>    Cipher Suite: TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca9)<br>    Compression Method: null (0)<br>    Extensions Length: 19<br>    Extension: extended_master_secret (len=0)<br>    Extension: renegotiation_info (len=1)<br>    Extension: ec_point_formats (len=2)<br><div>    Extension: session_ticket (len=0)</div><div>Ubuntu:</div><div>Handshake Protocol: Server Hello<br>    Handshake Type: Server Hello (2)<br>    Length: 61<br>    Version: TLS 1.2 (0x0303)<br>    Random: 7ec2c3a2554bac610e0290ac1f160c3ed185bdd1159e377c…<br>    Session ID Length: 0<br>    Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)<br>    Compression Method: null (0)<br>    Extensions Length: 21<br>    Extension: server_name (len=0)<br>    Extension: renegotiation_info (len=1)<br>    Extension: ec_point_formats (len=4)<br>    Extension: session_ticket (len=0)</div><div>Differences are that Google supplies 
extended_master_secretand Ubuntu supplies 
server_name extensions. The cyphers chosen by the server is also different. Enabling debug using squid -k debug indicates that this is the likely problematic area:</div><div><br></div>2019/09/15 11:21:02.486 kid1| 83,5| PeerConnector.cc(712) checkForMissingCertificates: SSL server sent 2 certificates<br>2019/09/15 11:21:02.486 kid1| 83,7| AsyncCall.cc(26) AsyncCall: The AsyncCall Security::PeerConnector::negotiate constructed, this=0x560d937c94b0 [call515701]2019/09/15 11:21:02.486 kid1| 83,7| AsyncCall.cc(93) ScheduleCall: PeerConnector.cc(391) will call Security::PeerConnector::negotiate() [call515701]<br>2019/09/15 11:21:02.486 kid1| 83,7| AsyncJob.cc(154) callEnd: Ssl::PeekingPeerConnector status out: [ FD 19 job24663]<br>2019/09/15 11:21:02.486 kid1| 83,7| AsyncCallQueue.cc(57) fireNext: leaving Security::PeerConnector::negotiate()<br>2019/09/15 11:21:02.486 kid1| 83,7| AsyncCallQueue.cc(55) fireNext: entering Security::PeerConnector::negotiate()<br>2019/09/15 11:21:02.486 kid1| 83,7| AsyncCall.cc(38) make: make call Security::PeerConnector::negotiate [call515701]<br>2019/09/15 11:21:02.486 kid1| 83,7| AsyncJob.cc(123) callStart: Ssl::PeekingPeerConnector status in: [ FD 19 job24663]<br>2019/09/15 11:21:02.486 kid1| 83,5| PeerConnector.cc(188) negotiate: SSL_connect session=0x560d93835950<br>2019/09/15 11:21:02.486 kid1| 83,7| bio.cc(356) giveBuffered: 5<=5 bytes to OpenSSL<br>2019/09/15 11:21:02.486 kid1| 83,7| bio.cc(356) giveBuffered: 63<=63 bytes to OpenSSL<br>2019/09/15 11:21:02.486 kid1| 83,7| bio.cc(164) stateChanged: FD 19 now: 0x1001 TWCH (SSLv3/TLS write client hello)<br>2019/09/15 11:21:02.486 kid1| 83,7| bio.cc(471) write: postpone writing 7 bytes to SSL FD 19<br>2019/09/15 11:21:02.486 kid1| 83,7| bio.cc(164) stateChanged: FD 19 now: 0x4008 SSLERR (error)<br>2019/09/15 11:21:02.486 kid1| 83,7| bio.cc(164) stateChanged: FD 19 now: 0x1002 SSLERR (error)<br>2019/09/15 11:21:02.486 kid1| 83,5| NegotiationHistory.cc(83) retrieveNegotiatedInfo: SSL connection info on FD 19 SSL version NONE/0.0 negotiated cipher<br>2019/09/15 11:21:02.486 kid1| ERROR: negotiating TLS on FD 19: error:1425F175:SSL routines:ssl_choose_client_version:inappropriate fallback (1/-1/0)<br>2019/09/15 11:21:02.486 kid1| 83,5| PeerConnector.cc(570) callBack: TLS setup ended for local=<a href="http://10.20.251.235:37882">10.20.251.235:37882</a> remote=<a href="http://216.58.210.196:443">216.58.210.196:443</a> FD 19 flags=1<br><br><div>I am not sure how to resolve this issue. I am guessing that there is something in the response from Google that is causing OpenSSL to reject the connections. From what I can see, there is no evidence of a downgrade being attempted, which is what the inappropriate fallback error message might indicate.</div><div><br></div><div>Any advice/guidance greatfully recieved.</div><div>John<br> </div><div><br><div>[1] OpenSSL and 
Squid versions</div><div>openssl version<br>OpenSSL 1.1.1  11 Sep 2018</div><div><br></div>squid -v<br>Squid Cache: Version 4.8<br>Service Name: squid<br>Ubuntu linux<br>This binary uses OpenSSL 1.1.1  11 Sep 2018. For legal restrictions on distribution see <a href="https://www.openssl.org/source/license.html">https://www.openssl.org/source/license.html</a><br>configure options:  '--build=x86_64-linux-gnu' '--prefix=/usr' '--includedir=${prefix}/include' '--mandir=${prefix}/share/man' '--infodir=${prefix}/share/info' '--$<br>ysconfdir=/etc' '--localstatedir=/var' '--libexecdir=${prefix}/lib/squid' '--srcdir=.' '--disable-maintainer-mode' '--disable-dependency-tracking' '--disable-silen$<br>-rules' 'BUILDCXXFLAGS=-g -O2 -fdebug-prefix-map=/home/builder/diladele/squid-ubuntu/src/ubuntu18/scripts.squid4/build/squid/squid-4.8=. -fstack-protector-strong -$<br>format -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -latomic' 'BUILDCXX=x86_64-linux-gn$<br>-g++' '--with-build-environment=default' '--enable-build-info=Ubuntu linux' '--datadir=/usr/share/squid' '--sysconfdir=/etc/squid' '--libexecdir=/usr/lib/squid' '-$<br>mandir=/usr/share/man' '--enable-inline' '--disable-arch-native' '--enable-async-io=8' '--enable-storeio=ufs,aufs,diskd,rock' '--enable-removal-policies=lru,heap' $<br>--enable-delay-pools' '--enable-cache-digests' '--enable-icap-client' '--enable-ssl' '--enable-ssl-crtd' '--with-openssl' '--enable-follow-x-forwarded-for' '--enab$<br>e-auth-basic=DB,fake,getpwnam,LDAP,NCSA,NIS,PAM,POP3,RADIUS,SASL,SMB' '--enable-auth-digest=file,LDAP' '--enable-auth-negotiate=kerberos,wrapper' '--enable-auth-ntl<br>m=fake,SMB_LM' '--enable-external-acl-helpers=file_userip,kerberos_ldap_group,LDAP_group,session,SQL_session,time_quota,unix_group,wbinfo_group' '--enable-security-<br>cert-validators=fake' '--enable-storeid-rewrite-helpers=file' '--enable-url-rewrite-helpers=fake' '--enable-eui' '--enable-esi' '--enable-icmp' '--enable-zph-qos' '<br>--enable-ecap' '--disable-translation' '--with-swapdir=/var/spool/squid' '--with-logdir=/var/log/squid' '--with-pidfile=/var/run/squid.pid' '--with-filedescriptors=<br>65536' '--with-large-files' '--with-default-user=proxy' '--with-gnutls' '--enable-linux-netfilter' 'build_alias=x86_64-linux-gnu' 'CC=x86_64-linux-gnu-gcc' 'CFLAGS=<br>-g -O2 -fdebug-prefix-map=/home/builder/diladele/squid-ubuntu/src/ubuntu18/scripts.squid4/build/squid/squid-4.8=. -fstack-protector-strong -Wformat -Werror=format-s<br>ecurity -Wall' 'LDFLAGS=-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -latomic' 'CPPFLAGS=-Wdate-time -D_FORTIFY_SOURCE=2' 'CXX=x86_64-linux-gnu-<br>g++' 'CXXFLAGS=-g -O2 -fdebug-prefix-map=/home/builder/diladele/squid-ubuntu/src/ubuntu18/scripts.squid4/build/squid/squid-4.8=. -fstack-protector-strong -Wformat -<br><div>Werror=format-security'</div><div><br></div><div>[2] Configuration squid.conf</div>visible_hostname squid<br>max_filedesc 4096<br><br>http_port 3128<br>#Handling HTTP requests<br>http_port 3129 intercept<br>include /etc/squid/http_sites.conf<br>http_access allow allowed_http_sites<br><br>#Handling HTTPS requests<br>https_port 3130 cert=/etc/squid/ssl/squid.pem ssl-bump intercept<br>acl SSL_port port 443http_access allow SSL_port<br># Allows access to <a href="http://www.google.com">www.google.com</a> and <a href="http://www.ubuntu.com">www.ubuntu.com</a><br>include /etc/squid/https_sites.conf<br><br># TLS peek-and-splice configuration<br>acl step1 at_step SslBump1<br>acl step2 at_step SslBump2<br>acl step3 at_step SslBump3<br>ssl_bump peek step1 all<br>ssl_bump peek step2 allowed_https_sites<br>ssl_bump splice step3 allowed_https_sitesssl_bump terminate step2 all<br>http_access deny all</div></div>