diff --git a/mercurial/sslutil.py b/mercurial/sslutil.py --- a/mercurial/sslutil.py +++ b/mercurial/sslutil.py @@ -207,8 +207,9 @@ def _hostsettings(ui, hostname): else: # At this point we don't have a fingerprint, aren't being # explicitly insecure, and can't load CA certs. Connecting - # at this point is insecure. But we do it for BC reasons. - # TODO abort here to make secure by default. + # is insecure. We allow the connection and abort during + # validation (once we have the fingerprint to print to the + # user). s['verifymode'] = ssl.CERT_NONE assert s['verifymode'] is not None @@ -413,11 +414,16 @@ def validatesocket(sock): 'fingerprint %s') % (host, nice), hint=_('check %s configuration') % section) + # Security is enabled but no CAs are loaded. We can't establish trust + # for the cert so abort. if not sock._hgstate['caloaded']: - ui.warn(_('warning: certificate for %s not verified ' - '(set hostsecurity.%s:certfingerprints=%s or web.cacerts ' - 'config settings)\n') % (host, host, nicefingerprint)) - return + raise error.Abort( + _('unable to verify security of %s (no loaded CA certificates); ' + 'refusing to connect') % host, + hint=_('see https://mercurial-scm.org/wiki/SecureConnections for ' + 'how to configure Mercurial to avoid this error or set ' + 'hostsecurity.%s:fingerprints=%s to trust this server') % + (host, nicefingerprint)) msg = _verifycert(peercert2, host) if msg: diff --git a/tests/test-https.t b/tests/test-https.t --- a/tests/test-https.t +++ b/tests/test-https.t @@ -103,10 +103,15 @@ Defining both per-host certificate and a $ DISABLECACERTS="--config devel.disableloaddefaultcerts=true" -clone via pull +Inability to verify peer certificate will result in abort $ hg clone https://localhost:$HGPORT/ copy-pull $DISABLECACERTS - warning: certificate for localhost not verified (set hostsecurity.localhost:certfingerprints=sha256:62:09:97:2f:97:60:e3:65:8f:12:5d:78:9e:35:a1:36:7a:65:4b:0e:9f:ac:db:c3:bc:6e:b6:a3:c0:16:e0:30 or web.cacerts config settings) + abort: unable to verify security of localhost (no loaded CA certificates); refusing to connect + (see https://mercurial-scm.org/wiki/SecureConnections for how to configure Mercurial to avoid this error or set hostsecurity.localhost:fingerprints=sha256:62:09:97:2f:97:60:e3:65:8f:12:5d:78:9e:35:a1:36:7a:65:4b:0e:9f:ac:db:c3:bc:6e:b6:a3:c0:16:e0:30 to trust this server) + [255] + + $ hg clone --insecure https://localhost:$HGPORT/ copy-pull + warning: connection security to localhost is disabled per current settings; communication is susceptible to eavesdropping and tampering requesting all changes adding changesets adding manifests @@ -133,7 +138,13 @@ pull without cacert $ echo "changegroup = printenv.py changegroup" >> .hg/hgrc $ hg pull $DISABLECACERTS pulling from https://localhost:$HGPORT/ - warning: certificate for localhost not verified (set hostsecurity.localhost:certfingerprints=sha256:62:09:97:2f:97:60:e3:65:8f:12:5d:78:9e:35:a1:36:7a:65:4b:0e:9f:ac:db:c3:bc:6e:b6:a3:c0:16:e0:30 or web.cacerts config settings) + abort: unable to verify security of localhost (no loaded CA certificates); refusing to connect + (see https://mercurial-scm.org/wiki/SecureConnections for how to configure Mercurial to avoid this error or set hostsecurity.localhost:fingerprints=sha256:62:09:97:2f:97:60:e3:65:8f:12:5d:78:9e:35:a1:36:7a:65:4b:0e:9f:ac:db:c3:bc:6e:b6:a3:c0:16:e0:30 to trust this server) + [255] + + $ hg pull --insecure + pulling from https://localhost:$HGPORT/ + warning: connection security to localhost is disabled per current settings; communication is susceptible to eavesdropping and tampering searching for changes adding changesets adding manifests diff --git a/tests/test-patchbomb-tls.t b/tests/test-patchbomb-tls.t --- a/tests/test-patchbomb-tls.t +++ b/tests/test-patchbomb-tls.t @@ -63,8 +63,9 @@ Without certificates: (using smtps) sending mail: smtp host localhost, port * (glob) (verifying remote certificate) - warning: certificate for localhost not verified (set hostsecurity.localhost:certfingerprints=sha256:62:09:97:2f:97:60:e3:65:8f:12:5d:78:9e:35:a1:36:7a:65:4b:0e:9f:ac:db:c3:bc:6e:b6:a3:c0:16:e0:30 or web.cacerts config settings) - sending [PATCH] a ... + abort: unable to verify security of localhost (no loaded CA certificates); refusing to connect + (see https://mercurial-scm.org/wiki/SecureConnections for how to configure Mercurial to avoid this error or set hostsecurity.localhost:fingerprints=sha256:62:09:97:2f:97:60:e3:65:8f:12:5d:78:9e:35:a1:36:7a:65:4b:0e:9f:ac:db:c3:bc:6e:b6:a3:c0:16:e0:30 to trust this server) + [255] With global certificates: