On Sat, May 28, 2022 at 11:48 AM Arrigo Marchiori <ard...@yahoo.it.invalid>
wrote:

> Hello Damjan,
>
> On Sat, May 28, 2022 at 11:12:45AM +0200, Damjan Jovanovic wrote:
>
> > On Sat, May 28, 2022 at 9:20 AM Arrigo Marchiori <ard...@yahoo.it.invalid
> >
> > wrote:
> >
> > > Hello Damjan, all,
> > >
> > > On Fri, May 27, 2022 at 11:27:11PM +0200, Arrigo Marchiori wrote:
> > >
> > > > Hello,
> > > >
> > > > On Fri, May 27, 2022 at 09:46:51PM +0200, Arrigo Marchiori wrote:
> > > >
> > > > > Hello Damjan,
> > > > >
> > > > > On Sun, May 22, 2022 at 06:10:46PM +0200, Damjan Jovanovic wrote:
> > > > >
> > > > > > On Sun, May 22, 2022 at 2:43 PM Arrigo Marchiori
> > > <ard...@yahoo.it.invalid>
> > > > > > wrote:
> > > > > >
> > > > > > > Hello Damjan, all,
> > > > > > >
> > > > > > > On Tue, Apr 26, 2022 at 07:56:22PM +0200, Damjan Jovanovic
> wrote:
> > > > > > >
> > > > > > > > On Mon, Nov 15, 2021 at 9:57 PM Jim Jagielski <
> j...@jagunet.com>
> > > wrote:
> > > > > > > >
> > > > > > > > > I'm gonna look into the serf->(lib)curl option... Since we
> > > don't use
> > > > > > > any
> > > > > > > > > of the fancy features of serf, I'm thinking that the easy
> > > option might
> > > > > > > be
> > > > > > > > > best
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > Hi
> > > > > > > >
> > > > > > > > I've ported our WebDAV content provider module from Serf to
> Curl.
> > > > > > >
> > > > > > > I just enhanced the error reporting a bit; I am finding a
> problem
> > > > > > > under Linux and I do not really know how to assess it.
> > > > > > >
> > > > > > > The problem: if we build AOO on CentOS (that is our reference
> > > > > > > platform) then Curl will look for CA certificates in
> > > > > > > /etc/pki/tls/certs/ca-bundle.crt
> > > > > > >
> > > > > > > This will fail on openSUSE and probably on Ubuntu as well.
> > > > > > >
> > > > > > > It seems that the above path is set at configure time and
> embedded
> > > > > > > into Curl's code as #define macros.
> > > > > > >
> > > > > > > Is there an ``official'' way to assess this? Like, can we
> depend on
> > > > > > > NSS' certificate store as you wrote (quoted below)?
> > > > > > >
> > > > > >
> > > > > > Curl/OpenSSL have an enormous number of options and I am pretty
> sure
> > > it can
> > > > > > be fixed, but first I need to understand where and how it's
> failing.
> > > > > >
> > > > > > We currently allow it to run with the default CA certificate
> path, do
> > > > > > pre-verification on the server's certificate using those CA
> > > certificates,
> > > > > > then call our SSL_VERIFY_PEER function where we override the
> > > verification
> > > > > > result with the certificates from NSS.
> > > > >
> > > > > Apparently, it is failing before calling our SSL_VERIFY_PEER
> function.
> > > > >
> > > > > > If it's failing before reaching our SSL_VERIFY_PEER function, we
> > > should be
> > > > > > able to use Curl's CURLOPT_CAINFO or CURLOPT_CAINFO_BLOB
> functions
> > > to set a
> > > > > > custom CA certificate path (or in-memory buffer), maybe even an
> empty
> > > > > > buffer, so that it proceeds further. ("man CURLOPT_CAINFO", "man
> > > > > > CURLOPT_CAINFO_BLOB", or "man curl_easy_setopt" and read under
> the
> > > "SSL and
> > > > > > SECURITY OPTIONS" section.)
> > > > >
> > > > > So we would need to hard-code and try all possible paths to the CA
> > > > > bundle on Unix systems?
> > > > >
> > > > > > With the CURLOPT_CAINFO_BLOB option it might even be possible to
> > > skip the
> > > > > > custom certificate verification we do later, and pre-populate
> > > Curl/OpenSSL
> > > > > > with NSS certificates from the beginning, I just don't know
> enough
> > > about
> > > > > > NSS to rely on that (eg. if you are using a cryptographic device
> or
> > > smart
> > > > > > card in NSS, how does that work?). If that option is ok, then we
> > > might not
> > > > > > even need the NSS libraries: recent versions of NSS store all the
> > > > > > certificates in an SQLite database, which can be accessed with
> > > SQLite APIs
> > > > > > directly, no need to build with or ship the NSS libraries at all.
> > > > >
> > > > > If I understood correctly [1], a NSS-linked Curl would query NSS by
> > > > > itself... are we not in this condition?
> > > [...]
> > > >   1: https://curl.se/libcurl/c/CURLOPT_CAINFO.html
> > >
> > > Apparently, we are not. If we force CURLOPT_CAINFO and CURLOPT_CAPATH
> > > to be NULL, we get a bit further but eventually Curl aborts because
> > > validateServerX509Certificate fails.
> > >
> > > Here is the log for checking AOO updates (please excuse the long
> > > lines).  I added an extra bit of logging when entering and leaving
> > > OPENSSL_ValidateServerCertificate, that is ``our SSL_VERIFY_PEER
> > > function''.
> > >
> > >
> ----8<--------8<--------8<--------8<--------8<--------8<--------8<---------
> > >
> > >          1        9 2022-05-28 07:13:52.61 CurlSession::CurlSession
> with
> > > URL
> https://ooo-updates.apache.org/aoonext/check.Update?pkgfmt=installed
> > >          2        9 2022-05-28 07:13:52.61 Not using a proxy server
> > >          3        9 2022-05-28 07:13:52.61 GET line 1093
> > >          4        9 2022-05-28 07:13:52.61 [CurlINFO  ]   Trying
> > > 151.101.2.132:443...
> > >          5        9 2022-05-28 07:13:52.63 [CurlINFO  ] Connected to
> > > ooo-updates.apache.org (151.101.2.132) port 443 (#0)
> > >          6        9 2022-05-28 07:13:52.63 [CurlINFO  ] ALPN, offering
> > > http/1.1
> > >          7        9 2022-05-28 07:13:52.63 [CurlINFO  ] Cipher
> selection:
> > > ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
> > >          8        9 2022-05-28 07:13:52.63 [CurlINFO  ] TLSv1.2 (OUT),
> TLS
> > > handshake, Client hello (1):
> > >          9        9 2022-05-28 07:13:52.64 [CurlINFO  ] TLSv1.2 (IN),
> TLS
> > > handshake, Server hello (2):
> > >         10        9 2022-05-28 07:13:52.64 [CurlINFO  ] TLSv1.2 (IN),
> TLS
> > > handshake, Certificate (11):
> > >  --here we are inside OPENSSL_ValidateServerCertificate
> > >         11        9 2022-05-28 07:13:52.64
> validateServerX509Certificate()
> > > returning 0 at depth 2
> > >  --here we are leaving OPENSSL_ValidateServerCertificate
> > >         12        9 2022-05-28 07:13:52.64 [CurlINFO  ] TLSv1.2 (OUT),
> TLS
> > > alert, unknown CA (560):
> > >         13        9 2022-05-28 07:13:52.64 [CurlINFO  ] SSL certificate
> > > problem: unable to get local issuer certificate
> > >         14        9 2022-05-28 07:13:52.64 [CurlINFO  ] Closing
> connection
> > > 0
> > >         15        9 2022-05-28 07:13:52.64 Curl request failed with
> > > CURLcode 60
> > >         16        9 2022-05-28 07:13:52.64 CurlSession::~CurlSession:
> > > closed curl session
> > >
> > >
> ----8<--------8<--------8<--------8<--------8<--------8<--------8<---------
> > >
> > > I hope this helps.
> > >
> > >
> > I think the problem there is NSS's validation.
> >
> > In CurlSession::validateServerX509Certificate(), try change the "if (
> depth
> > == 0 )" to "if (1)".
>
> After this edit, the connection is established. The log is below.
>

That's good :).


>
> But NSS was also used before, with Serf... it stopped working when the
> bundled CA certificates started to be ``too obsolete''. After we
> updated the bundled NSS, then https connections, such as the check for
> updates, started to work again.
>

We don't need NSS specifically. From Curl, we need OpenSSL, because without
it, we are unable to ask the user to confirm self-signed certificates
during TLS negotiations [1]. Upstream OpenSSL however doesn't ship any CA
certificates, so the WebDAV provider gets them from our
com.sun.star.security.CertificateContainer, which comes from WinCrypt on
Windows (also called "mscrypt" by main/xmlsecurity/source/xmlsec/mscrypt)
and NSS elsewhere.

Therefore that update check should not have been failing on Windows. Only
if your Windows is out of date, should WinCrypt CA certificates fail.

It is also particularly strange for NSS certificates to be out of date. The
NSS certificate database that our
com.sun.star.security.CertificateContainer uses comes from a profile
(getMozillaCurrentProfile() in
main/xmlsecurity/source/nss/nssinitializer.cxx) which (AFAIK) is in the
user's home directory, and shared with and updated by Firefox or
Thunderbird. Only if you don't update AOO, and don't run Firefox, and don't
run Thunderbird, can your NSS certificates get out of date.


>
> Please also bear in mind that I am now testing a build from a _CentOS
> Docker container_. My computer is not running CentOS, but rather
> OpenSUSE. The binary is run on ``native'' OpenSUSE. If I recall
> correctly, when I build on the same native OpenSUSE, the resulting AOO
> binary connects properly to https web sites.
>
> For this reason, I was wondering if this problem is not just about
> hardcoded paths to CA certificates.
>

Since Curl's OpenSSL CA path is hardcoded to a non-portable value at
compile time, my proposed approach here disables OpenSSL's certificates and
only uses the ones from our com.sun.star.security.CertificateContainer
instead. (And, who knows, it may be helpful to make another
com.sun.star.security.CertificateContainer that gets certificates from
guessed system paths for all of AOO, not just WebDAV.)

Is there something else you propose instead?

Regards
Damjan


[1] But is Curl's inability to use custom certificate verification
functions (which can ask the user to confirm problematic certificates) with
NSS a limitation of Curl, or a limitation of NSS? Firefox uses NSS, and it
certainly asks the user to confirm expired and self-signed certificates.
How does Firefox do that, by disconnecting, asking the user, and
reconnecting if confirmed, or the Curl/OpenSSL way, by keeping the TCP
connection open during the user interaction and then resuming TLS
negotiations if confirmed?

Reply via email to