Jump to content

Angus Robertson

Members
  • Content Count

    2070
  • Joined

  • Last visited

  • Days Won

    38

Posts posted by Angus Robertson


  1. His solution may have fixed the exception, but will not return any sensible ALPN data, and will probably introduce other problems instead. 

     

    I did wonder whether I should use PAnsiChar instead of TBytes, which would be safer in case someone in the future tried to resize the parameter.  But TBytes seems to be the preferred method for working with binary and is mobile compatible, where Ansi is not.

     

    Angus

     


  2. I quite understand that pointers differ in Win64, but they that code is not copying pointers, it is copying 8-bit bytes. 

     

    Will you please build the OverbyteIcsSslWebServ sample with ICS 8.64 Win64 and your changes, make an request to https://localhost/demo.html with Display SSL Info and Logger Dest Event ticked, the log should contain lines with AlpnCB similar to:

     

    [16:22:53 127.0.0.1] SNI "localhost" received
    16:22:53:024 AlpnCB> inlen: 12 - 02683208687474702F312E31
    16:22:53:031 AlpnCB> Protocols: h2,http/1.1
    [16:22:53] SSL Application Layer Protocols allowed from client: h2,http/1.1
    16:22:53:044 0000000002710020 ICB> SSL_accept: SSLv3/TLS read client hello
     

    where those two lines are the input and output from IcsWireFmtToStrList.  I'm not going to look at this further with evidence of a real problem in ICS.  Or you could add IcsLogger to your own server to get the same logging information. 

     

    Angus

     

     


  3. 15 hours ago, Marcelo Jaloto said:

    The IcsWireFmtToStrList method of the OverbyteIcsUtils unit had a problem moving characters with Move without regard to the number of bytes.

    Sorry, but you misunderstand the declaration for TBytes, it is a pointer to a dynamic array of bytes, not a pointer to a array of pointers.  A byte remains the same size however compiled, so your proposed suggestion of copying the content based on the pointer size will cause many problems. 

     

    I can only assume your correction was theoretical and you did not test it with an ICS SSL server application that uses the code. 

     

    I've just built the OverbyteIcsSslWebServ sample with Win64, and ALPN is working as expected, as I showed earlier in this thread,   I am getting some other strange exceptions running Win64 samples today, so there may be other Win64 issues elsewhere, or with OpenSSL Win64, but not with ALPN.   Don't have time to investigate further at the moment.

     

    Angus


  4. If you are using TSslWSocketThrdServer then you should be using TSslWSocketThrdClient.  However TSslWSocketThrdServer is itself a descendent of TSslWSocketServer which does not use threads, so it all depends on how you are using the component.  OnSessionClosed is only gone to triggered once since the client is destroyed immediately afterwards. 

     

    Presumably you started with the OverbyteIcsThrdSrvV3.dpr sample which is the documentation and sample for TSslWSocketThrdServer, but does not support SSL. 

     

    Angus


  5. Further to my last comment, I'm not going to change the code at the moment.  If you specifically want to ignore the Location: header for an API request, set property FollowRelocation to false. 

     

    This is what the TSslX509Certs component does making REST requests which return Location: headers for responses 201 and 409. 

     

    Angus

     


  6. I was wrong about TLS/1,3, it has been experimentally added to Windows 10 1909 but only for use in Microsoft Edge (old version) not Internet Explorer, enabled in Internet Options,  Advanced, Security.  Can not test it because Edge stopped working months ago and just puts errors in the Windows Logs instead.

     

    Angus

     


  7. On 12/27/2019 at 7:54 PM, stijnsanders said:

    Older Windows versions don't support TLS 1.3,

    No versions of Windows support TLS/1,3 yet using SChannel, not even Windows Server 2019.   Only applications using OpenSSL 1.1.1 or browsers with their own SSL libraries like Firefox and Chrome support TLS/1,3.

     

    Even TLS/1,2 was not supported by Windows Vista and 7 until a patch a couple of years ago when Microsoft realised people did not want to use Windows 10.  And it's now increasingly common for protocols earlier than TLS/1,2 to be disabled on web servers for security reasons.  

     

    Angus


  8. Start by building and running the OverbyteIcsHttpRestTst.dpr demo in SslDemos, that directory includes the latest OpenSSL DLLs, assuming you are using the latest ICS download, which is V8.63 or V8.64.

     

    You get a version exception using newer DLLs on older ICS versions, or vice versa. 

     

    Angus


  9. The OnClientConnect event I've mentioned twice is how you know the client is connected.  TSslWSocketClient is not created until after connection is successful, although SSL negotiation may still fail so the socket gets disconnected again. 

     

    Servers only ever listen and respond to commands from remote clients, most clients will cleanly disconnect once completed, but you generally don't know if the client is still there which is why most servers have a timeout for an idle client. 

     

    Angus

     


  10. SSL clients don't need certificates.  Are the DLLs in the same directory as the application, if not you may be opened rubbish from elsewhere on the PC. 

     

    And try other samples, to see if just one failing, specifically try  OverbyteIcsXferTst.dp which is a far more advanced FTP client with better error handling.

     

    Angus

     


  11. Very unusual to see access violations with OpenSSL, most likely mismatched DLLs or a very old version of ICS and a newer OpenSSL.  Certainly nothing wrong with the components, use SSL all the time.  What about other ICS SSL samples, so they all fail as well? 

     

    Angus

     


  12. I know the function works because it unpacks and logs real ALPN data, but for completeness I've added logging of the ALPN wire packet:

     

    AlpnCB> inlen: 12 - 02683208687474702F312E31
    AlpnCB> Protocols: h2,http/1.1

     

    I also know the ALPN data may be incorrectly formed, OpenSSL simply passes whatever is received in the TLS initial packet, because until I fixed the bug yesterday, Delphi unicode compilers where sending 086008700470047 for http/1.1 if ALPN was specified in SslContext (not the default). This was correctly ignored by the ICS web server, but I noticed it because one of my web pages reports the client ALPN and was truncated by the first null.  I would eventually have found this when testing the Let's Encrypt TLS challenge which does not work yet due to another OpenSSL callback bug.

     

    Angus

     


  13. Don't believe there a problem in IcsWireFmtToStrList, more likely to be setting the output pointer for the AlpnSelectCallBack function, which means OpenSSL reads a Delphi variable.  Originally it was a local variable but it had gone out of scope when OpenSSL tried to read it. so V8.62 changed it to a TWSocket variable FAlpnProtoAnsi and that worked for Win32, and for Win64 according to my testing here.  But perhaps there is something different about your server implementation to the ICS samples, 

     

    As I said before, simply not using the onSslAlpnSelect should have fixed the issue.

     

    Angus

     


  14. I've updated the ICS OverbyteIcsSslMultiWebServ sample with the code you show (which comes from the older web server sample), built and tested it for Win64, and it's working fine, no exceptions with ALPN which is being reported correctly, using OpenSSL 1.1.1d Win64. 

     

    The code you show for the onSslAlpnSelect is correct usage, but not really needed since applications should default to HTTP/1.1 anyway unless told to use HTTP/2.  I did fix a memory bug in V8.62 relating to this which I guess could have come back or not been fixed properly.  I would just comment out the loop so the event returns without changing ErrCode and see if your problem goes away. 

     

    I have updated the wsocket ALPN code to suppress any exceptions processing ALPN since it's not really fatal and made IcsWireFmtToStrList check for bad packet formatting. 

     

    More importantly, during testing I found a unicode bug in IcsStrListToWireFmt which is used in HTTPS clients sending the ALPN list which sent a corrupted packet, now fixed, but you are not using that since we do not send the h2 protocol. 

     

    I'll put the source changes in SVN once my own public web server has been updated and been used for at least 24 hours.

     

    Angus

     


  15. Don 't do much testing with Win64, unusual to find problems, particularly with a simple loop.  But that function is only used in one place in ICS, to decode the ALPN response during an SSL handshake, so the buffer is within the OpenSSL DLL, maybe there is an issue with the buffer alignment or something?  No ICS applications currently use the ALPN response, so I'll hide the exception as a quick solution. 

     

    Is this problem with all SSL web sites or just one in particular, which is perhaps returning invalid data in the SSL handshake?  A typical ALPN response is just 'http/1.1, h2' so say that HTTP/2 is supported. 

     

    Angus

     


  16. Don't know anything about DEVEXPRESS components, but from reading your comments you purchased an ActiveX component from them which was written in Delphi, but which they no longer support, and you have no source code for it, but do have a similar VCL component with source? 

     

    Surely the fastest solution is try and buy the ActiveX source from DEVEXPRESS so you can bring it up to date?  Perhaps even off to let them sell your new version for others in the same situation.  Recreating it 100% accurately is not a trivial task.  

     

    Windows 10 generally retains compatibility with all earlier technologies, it's rare for Microsoft to obsolete APIs and stuff, but security often gets harder to implements, particularly because ActiveX was a horrible risk in MSIE. 

     

    I wrote a non-visual COM object 10 years ago with a type library, for use with ASP web pages,  which was relatively easy, but a visual grid will be more complex.

     

    Angus

×