comparison tests/test-https.t @ 29411:e1778b9c8d53

sslutil: abort when unable to verify peer connection (BC) Previously, when we connected to a server and were unable to verify its certificate against a trusted certificate authority we would issue a warning and continue to connect. This is obviously not great behavior because the x509 certificate model is based upon trust of specific CAs. Failure to enforce that trust erodes security. This behavior was defined several years ago when Python did not support loading the system trusted CA store (Python 2.7.9's backports of Python 3's improvements to the "ssl" module enabled this). This commit changes behavior when connecting to abort if the peer certificate can't be validated. With an empty/default Mercurial configuration, the peer certificate can be validated if Python is able to load the system trusted CA store. Environments able to load the system trusted CA store include: * Python 2.7.9+ on most platforms and installations * Python 2.7 distributions with a modern ssl module (e.g. RHEL7's patched 2.7.5 package) * Python shipped on OS X Environments unable to load the system trusted CA store include: * Python 2.6 * Python 2.7 on many existing Linux installs (because they don't ship 2.7.9+ or haven't backported modern ssl module) * Python 2.7.9+ on some installs where Python is unable to locate the system CA store (this is hopefully rare) Users of these Pythongs will need to configure Mercurial to load the system CA store using web.cacerts. This should ideally be performed by packagers (by setting web.cacerts in the global/system hgrc file). Where Mercurial packagers aren't setting this, the linked URL in the new abort message can contain instructions for users. In the future, we may want to add more code for finding the system CA store. For example, many Linux distributions have the CA store at well-known locations (such as /etc/ssl/certs/ca-certificates.crt in the case of Ubuntu). This will enable CA loading to "just work" on more Python configurations and will be best for our users since they won't have to change anything after upgrading to a Mercurial with this patch. We may also want to consider distributing a trusted CA store with Mercurial. Although we should think long and hard about that because most systems have a global CA store and Mercurial should almost certainly use the same store used by everything else on the system.
author Gregory Szorc <gregory.szorc@gmail.com>
date Sat, 25 Jun 2016 07:26:43 -0700
parents 93b83ef78d1e
children 072e4a595607
comparison
equal deleted inserted replaced
29410:222f6834c69a 29411:e1778b9c8d53
101 adding file changes 101 adding file changes
102 added 1 changesets with 4 changes to 4 files 102 added 1 changesets with 4 changes to 4 files
103 103
104 $ DISABLECACERTS="--config devel.disableloaddefaultcerts=true" 104 $ DISABLECACERTS="--config devel.disableloaddefaultcerts=true"
105 105
106 clone via pull 106 Inability to verify peer certificate will result in abort
107 107
108 $ hg clone https://localhost:$HGPORT/ copy-pull $DISABLECACERTS 108 $ hg clone https://localhost:$HGPORT/ copy-pull $DISABLECACERTS
109 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) 109 abort: unable to verify security of localhost (no loaded CA certificates); refusing to connect
110 (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)
111 [255]
112
113 $ hg clone --insecure https://localhost:$HGPORT/ copy-pull
114 warning: connection security to localhost is disabled per current settings; communication is susceptible to eavesdropping and tampering
110 requesting all changes 115 requesting all changes
111 adding changesets 116 adding changesets
112 adding manifests 117 adding manifests
113 adding file changes 118 adding file changes
114 added 1 changesets with 4 changes to 4 files 119 added 1 changesets with 4 changes to 4 files
131 $ cd copy-pull 136 $ cd copy-pull
132 $ echo '[hooks]' >> .hg/hgrc 137 $ echo '[hooks]' >> .hg/hgrc
133 $ echo "changegroup = printenv.py changegroup" >> .hg/hgrc 138 $ echo "changegroup = printenv.py changegroup" >> .hg/hgrc
134 $ hg pull $DISABLECACERTS 139 $ hg pull $DISABLECACERTS
135 pulling from https://localhost:$HGPORT/ 140 pulling from https://localhost:$HGPORT/
136 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) 141 abort: unable to verify security of localhost (no loaded CA certificates); refusing to connect
142 (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)
143 [255]
144
145 $ hg pull --insecure
146 pulling from https://localhost:$HGPORT/
147 warning: connection security to localhost is disabled per current settings; communication is susceptible to eavesdropping and tampering
137 searching for changes 148 searching for changes
138 adding changesets 149 adding changesets
139 adding manifests 150 adding manifests
140 adding file changes 151 adding file changes
141 added 1 changesets with 1 changes to 1 files 152 added 1 changesets with 1 changes to 1 files