On Wed, Mar 1, 2017 at 3:51 PM, Christian Heimes <christ...@python.org>
wrote:

> On 2017-03-01 15:59, David Cournapeau wrote:
> > Hi there,
> >
> > This is hopefully the right mailing for this question. We are shipping
> > our own python interpreter in our product, and following some
> > discussions on
> > https://mail.python.org/pipermail/python-dev/2017-January/147282.html,
> > we understand shipping the certificate from certifi in our python is the
> > best approach on Linux/OS X.
>
> Yeah, it's the easiest option for you. I don't necessarily agree it's
> the best option.
>

We are certainly interested in a better option ! Our constraints are:

1. we cannot control where python actually get installed
2. on Linux, we cannot afford to have distribution-specific builds (we use
something similar to the manylinux setup)


> > Unfortunately, ssl hardcodes at compilation time the default location of
> > certificate. I could workaround this at the python level by patching
> > ssl.SSLContext.load_default_certs to look as follows:
>
> Small correction: The location of the certs is hard-coded in OpenSSL.
> The ssl module simply uses OpenSSL's defaults on non-Windows platforms.
>
>
> def load_default_certs(...):
> >     ....
> >
> >     if sys.platform == "win32":
> >         ...
> >     else:
> >         prefix = os.path.normpath(sys.prefix)
> >         default_cert = os.path.join(prefix, "ssl", "cert.pem")
> >         if os.path.isfile(default_cert):
> >             self.load_verify_locations(default_cert)
> >         else:
> >             self.set_default_verify_paths()
> >
> > While this seems to work, my lack of knowledge in all things related to
> > security and ssl in particular makes me worry to patch anything in
> > there. Is this a sane approach ? If not, is there a better way ?
>
> You can override the default verify paths already. There is no need to
> monkey patch load_default_certs(). You have two options:
>
> 1) Create your own custom SSLContext with a custom trust anchor, e.g.
> ctx = ssl.create_default_context(cafile='...') and pass the context along.
>
> 2) Set SSL_CERT_FILE env var to override OpenSSL's default setting, see
> https://docs.python.org/3/library/ssl.html#ssl.get_default_verify_paths
>
> The second option may work for you. You can set the env var at any time
> before you create a new SSLContext object.
>
>
Just to clarify: I am aware that for code we write/distribute, there are
better ways (we tend to always use requests for http(s) handling). But as
we are distributing python as a distribution, the goal is to make things
work by default for 3rd party users, without compromising security, so 1.
is not applicable. 2. is not a good solution in our opinion because it may
cause trouble when people use programs linked against openssl through
subprocess.

David

Christian
>
>
> _______________________________________________
> Security-SIG mailing list
> Security-SIG@python.org
> https://mail.python.org/mailman/listinfo/security-sig
>
>


-- 
blog: http://cournape.wordpress.com
code: https://github.com/cournape
twitter: @cournape
_______________________________________________
Security-SIG mailing list
Security-SIG@python.org
https://mail.python.org/mailman/listinfo/security-sig

Reply via email to