Have requests use Windows certs for TLS/SSL validation
""" | |
This is free and unencumbered software released into the public domain. | |
Anyone is free to copy, modify, publish, use, compile, sell, or | |
distribute this software, either in source code form or as a compiled | |
binary, for any purpose, commercial or non-commercial, and by any | |
means. | |
In jurisdictions that recognize copyright laws, the author or authors | |
of this software dedicate any and all copyright interest in the | |
software to the public domain. We make this dedication for the benefit | |
of the public at large and to the detriment of our heirs and | |
successors. We intend this dedication to be an overt act of | |
relinquishment in perpetuity of all present and future rights to this | |
software under copyright law. | |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR | |
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | |
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | |
OTHER DEALINGS IN THE SOFTWARE. | |
For more information, please refer to <http://unlicense.org/> | |
""" | |
import requests | |
class NoCertsInSystemStore(Exception): | |
""" | |
Raised on Windows when there are no certs in the system store | |
""" | |
class MyRequestsBasedAPIClient: | |
def __enter__(self): | |
self.session = requests.Session() | |
# On Windows we need to tell requests not to use it's builtin ca store | |
if os.name == "nt": | |
ssl_context = ssl.create_default_context() | |
self.windows_ca_file = pathlib.Path( | |
tempfile.NamedTemporaryFile(suffix=".pem").name | |
) | |
ca_certs = ssl_context.get_ca_certs(binary_form=True) | |
if not ca_certs: | |
raise NoCertsInSystemStore() | |
self.windows_ca_file.write_text( | |
"\n".join( | |
map( | |
ssl.DER_cert_to_PEM_cert, | |
ssl_context.get_ca_certs(binary_form=True), | |
) | |
) | |
) | |
self.session.verify = self.windows_ca_file | |
return self | |
def __exit__(self, exc_type, exc_value, traceback): | |
if os.name == "nt": | |
os.unlink(self.windows_ca_file) | |
self.windows_ca_file = None | |
self.session = None |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment