Comments
Patch
@@ -343,6 +343,13 @@ def wrapsocket(sock, keyfile, certfile,
if not serverhostname:
raise error.Abort(_('serverhostname argument is required'))
+ for f in (keyfile, certfile):
+ if f and not os.path.exists(f):
+ raise error.Abort(_('certificate file (%s) does not exist; '
+ 'cannot connect to %s') % (f, serverhostname),
+ hint=_('restore missing file or fix references '
+ 'in Mercurial config'))
+
settings = _hostsettings(ui, serverhostname)
# We can't use ssl.create_default_context() because it calls
@@ -499,6 +506,13 @@ def wrapserversocket(sock, ui, certfile=
Typically ``cafile`` is only defined if ``requireclientcert`` is true.
"""
+ # This function is not used much by core Mercurial, so the error messaging
+ # doesn't have to be as detailed as for wrapsocket().
+ for f in (certfile, keyfile, cafile):
+ if f and not os.path.exists(f):
+ raise error.Abort(_('referenced certificate file (%s) does not '
+ 'exist') % f)
+
protocol, options, _protocolui = protocolsettings('tls1.0')
# This config option is intended for use in tests only. It is a giant
@@ -592,9 +592,22 @@ Test https with cert problems through pr
#if sslcontext
+ $ cd test
+
+Missing certificate file(s) are detected
+
+ $ hg serve -p $HGPORT --certificate=/missing/certificate \
+ > --config devel.servercafile=$PRIV --config devel.serverrequirecert=true
+ abort: referenced certificate file (/missing/certificate) does not exist
+ [255]
+
+ $ hg serve -p $HGPORT --certificate=$PRIV \
+ > --config devel.servercafile=/missing/cafile --config devel.serverrequirecert=true
+ abort: referenced certificate file (/missing/cafile) does not exist
+ [255]
+
Start hgweb that requires client certificates:
- $ cd test
$ hg serve -p $HGPORT -d --pid-file=../hg0.pid --certificate=$PRIV \
> --config devel.servercafile=$PRIV --config devel.serverrequirecert=true
$ cat ../hg0.pid >> $DAEMON_PIDS
@@ -631,4 +644,16 @@ with client certificate:
abort: error: * (glob)
[255]
+Missing certficate and key files result in error
+
+ $ hg id https://localhost:$HGPORT/ --config auth.l.cert=/missing/cert
+ abort: certificate file (/missing/cert) does not exist; cannot connect to localhost
+ (restore missing file or fix references in Mercurial config)
+ [255]
+
+ $ hg id https://localhost:$HGPORT/ --config auth.l.key=/missing/key
+ abort: certificate file (/missing/key) does not exist; cannot connect to localhost
+ (restore missing file or fix references in Mercurial config)
+ [255]
+
#endif