Folks

Here's my proposal

HttpClient 5.2: 

* Announce the plan to deprecate and eventually remove NTLM support and
experimental SPNEGO / Kerberos support

* Ask downstream projects to get in touch with us. Invite interested
parties to participate in Kerberos support improvements

HttpClient 5.3: 

* Make NTLM / SPNEGO / Kerberos disabled by default requiring an
explicit opt-in from the user. Mark respective implementations
deprecated.

* Remove stateful connection support

* Invite interested parties to participate in Kerberos support
improvements


HttpClient 6.0: 

* Remove NTLM support

* Remove SPNEGO / Kerberos support if still broken


HttpClient 6.0 is not going to happen sooner than 2025. There should
plenty of time for downstream projects to re-act and adjust.

Oleg


On Sat, 2021-11-20 at 19:52 +0100, Michael Osipov wrote:
> Am 2021-11-20 um 17:41 schrieb Oleg Kalnichevski:
> > Folks
> > 
> > Presently NTLM & SPNEGO are stated as supported authentication
> > schemes,
> > by the project which is, quite frankly, not the case. There are
> > partial
> > implementations in various state of decay contributed some while
> > ago by
> > contributors long gone with no one on the project both capable and
> > willing to maintain that code and deal with user reported issues.
> > 
> > I think we should drop the pretense and start dealing with the
> > problem.
> > If we cannot adequately support those features we should consider
> > deprecating and eventually removing them entirely.
> > 
> > As the first step I would like to propose NTLM & SPNEGO be made an
> > opt-
> > in feature as of version 5.3. Users would have to explicitly enable
> > NTLM & SPNEGO support to make HttpClient engage in an NTLM or
> > SPNEGO
> > handshake.
> > 
> > This may encourage people vested in NTLM and SPNEGO come forth and
> > help
> > support those features.
> > 
> > Also, the deprecation or removal of NTLM would unable us to drop
> > connection state tracking support and greatly simplify the
> > connection
> > management APIs.
> 
> Let me both comment since I have experience with them and on 
> contributions in general.
> Contributions: I generally, for all ASF projects I maintain, reject 
> contributions I cannot test or do not have access to the technology
> to 
> do so (it must be freely, namely OSS). I have recently deleted 130
> 000 
> LoC in Maven SCM for commercial SCMs because none of us is able to
> test 
> them.
> 
> Now let's get into those two:
> NTLM: Although the client part is fully documented these days, this 
> mechanism is very problematic in many ways. It is connection-bound
> and 
> generally not suited for HTTP which is stateless, in fact IIS
> disabled 
> it on HTTP/2 for obvious reasons. There is no OSS implementation (at 
> least I am not aware of) on the server-side (if you put apart innards
> of 
> Samba) which gives me the ability to hook into Apache HTTPd or
> Tomcat, 
> ideally as an opaque GSS-API or jGSS mechanism and test properly.
> You 
> always need a domain controller, ideally Active Directory and a
> Windows 
> server with IIS to test this. The server needs to talk to the DC
> likely 
> through MS-RPC (DCE-RPC) (part of the protocol). There is no way I
> am 
> going to do this. Only SSPI supports this out of the box. Moreover,
> the 
> mechanism is deprecated for many years by Microsoft and replaced
> with 
> standard Kerberos.
> If your company hasn't moved to Kerberos or client certs then
> something 
> is seriously wrong with your company.
> My verdict: There is no way we can make this right/reliable/correct.
> If 
> you check MS-NLMP [1] there are constant updates putting a burden on
> us.
> I support its removal in 6.0.
> 
> SPNEGO: This is a pseudo-mechanism negotiating sub-mechanisms (NTLM
> or 
> Kerberos). Although a Microsoft invention also, this has an RFC and
> is 
> completely open. When I talk about SPNEGO I always mean Kerberos 
> negotiated, nothing else. Pure Kerberos does *not* exist over HTTP,
> thus 
> no need to support it. Kerberos is freely available (for all OSes)
> and a 
> KDC can be set up with MIT Kerberos, Heimdal or Samba or GNU/Linux
> or 
> FreeBSD to test. I have a test network in VirtualBox which just
> works. 
> It is just effort for the implementor to do so, but easier than
> brain 
> surgery.
> SPNEGO/Kerberos does *not* require any connection binding, I have
> been 
> using it for more than 10 years and I have *never* seen more than
> one 
> roundtrip, see also [2]. Neither with MIT Kerberos, Microsoft
> Kerberos 
> or Java Kerberos.
> One of the biggest problems with many OSS approaches I have seen on
> the 
> client side: they are crap and logically broken. Namely, they
> violate 
> RFC 7546 [3] and don't make things right. Even curl is broken [3].
> The 
> only OSS library I know to be correct is libserf. Many just don't
> read 
> the RFCs to make things right, compared to you! Ping Identity is
> also 
> broken. I told this to our service support at work, he was pissed
> off.
> 
> 6,5 years I ago I have created HTTPCLIENT-1625 to make things right,
> 4.x 
> flow was not suitable, in 5.x this was reworked and I believe it
> will 
> work, but don't know for sure. Shamely, I haven't had enough free
> time 
> to tackle this issue, I am requirements-driven from work after all
> and 
> didn't have this one for Java in all those years, clients were in C
> or C#.
> Both the JGSS code and the JNA-based code for SSPI aren't really
> good. 
> As soon as a business need arises here at work, I will start working
> on it.
> 
> What is important to know for you when you want to remove code: The 
> security context loop is always client initiated and required to be 
> completed by a token sent from the server with the response unless it
> is 
> 401/407. So the HttpClient needs to store the context somewhere until
> it 
> receives the response, completes security context and frees the
> security 
> context. This is on a per-request basis. If the context is not
> completed 
> with the response then the authentication should not be trusted,
> either 
> an exception should be through or a warning/error must be logged.
> 
> My verdict: What we have now for SPNEGO/Kerberos should be removed
> in 
> 6.0, *but not* the technical support to integrate it properly into 
> HttpClient.
> 
> I used it daily on four OSes on client-side and server-side, it just 
> works with zero headache for the user. In modern C# applications 
> interactively, or headless in ancient Fortran apps via C. Even fully 
> automated in GitLab runners for access APIs on Tomcat.
> 
> Michael
> 
> [1] 
> https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nlmp/b38c36ed-2804-4868-a9ff-8dd3182128e4
> [2] https://github.com/gssapi/mod_auth_gssapi/issues/204
> [3] https://datatracker.ietf.org/doc/html/rfc7546
> [4] 
> https://curl.se/docs/knownbugs.html#curl_never_completes_Negotiate_o
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@hc.apache.org
> For additional commands, e-mail: dev-h...@hc.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@hc.apache.org
For additional commands, e-mail: dev-h...@hc.apache.org

Reply via email to