Skip to content

Instantly share code, notes, and snippets.

@marschhuynh
Created January 6, 2019 03:59
Show Gist options
  • Star 64 You must be signed in to star a gist
  • Fork 14 You must be signed in to fork a gist
  • Save marschhuynh/31c9375fc34a3e20c2d3b9eb8131d8f3 to your computer and use it in GitHub Desktop.
Save marschhuynh/31c9375fc34a3e20c2d3b9eb8131d8f3 to your computer and use it in GitHub Desktop.
# install_certifi.py
#
# sample script to install or update a set of default Root Certificates
# for the ssl module. Uses the certificates provided by the certifi package:
# https://pypi.python.org/pypi/certifi
import os
import os.path
import ssl
import stat
import subprocess
import sys
STAT_0o775 = ( stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR
| stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP
| stat.S_IROTH | stat.S_IXOTH )
def main():
openssl_dir, openssl_cafile = os.path.split(
ssl.get_default_verify_paths().openssl_cafile)
print(" -- pip install --upgrade certifi")
subprocess.check_call([sys.executable,
"-E", "-s", "-m", "pip", "install", "--upgrade", "certifi"])
import certifi
# change working directory to the default SSL directory
os.chdir(openssl_dir)
relpath_to_certifi_cafile = os.path.relpath(certifi.where())
print(" -- removing any existing file or link")
try:
os.remove(openssl_cafile)
except FileNotFoundError:
pass
print(" -- creating symlink to certifi certificate bundle")
os.symlink(relpath_to_certifi_cafile, openssl_cafile)
print(" -- setting permissions")
os.chmod(openssl_cafile, STAT_0o775)
print(" -- update complete")
if __name__ == '__main__':
main()
@SKR
Copy link

SKR commented Apr 14, 2023

Thanks, it solves my problem!

@MikhailStukalau
Copy link

Thanks! You'r the best!

@kevlarCode
Copy link

Yes!! It runs! Thanks for that life saver!

@gr8h
Copy link

gr8h commented May 9, 2023

perfect!! thanks

@lucreciaef
Copy link

lucreciaef commented May 18, 2023

I use Win11, and first it didn't find the directory, so I created the folder 'C:\Program Files\Common Files\SSL' manually.
Then, I'm having this error - ideas?

Traceback (most recent call last):
File "C:...\certif.py", line 44, in
main()
File "C:...\certif.py", line 38, in main
os.symlink(relpath_to_certifi_cafile, openssl_cafile)
PermissionError: [WinError 5] Access is denied: '..\..\..\...\venv\lib\site-packages\certifi\cacert.pem' -> 'cert.pem'

Edit: I was too quick to post. It failed when running from PyCharm but then worked when running it via Powershell as admin

@sanywright13
Copy link

thank you

@Manimestro
Copy link

Thank you .. helped a lot

@PaulHendi
Copy link

Thanks a lot !!

@BasiliskDev
Copy link

Ty

@arkahome
Copy link

Just change this part to not get FileNotFound Error :

FileNotFoundError: [WinError 2] The system cannot find the file specified: 'C:\Program Files\Common Files\ssl'

    try:
        os.chdir(openssl_dir)
    except FileNotFoundError:
        os.makedirs(openssl_dir)
        os.chdir(openssl_dir)

Full Code :

# install_certifi.py
#
# sample script to install or update a set of default Root Certificates
# for the ssl module.  Uses the certificates provided by the certifi package:
#       https://pypi.python.org/pypi/certifi

import os
import os.path
import ssl
import stat
import subprocess
import sys

STAT_0o775 = ( stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR
             | stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP
             | stat.S_IROTH |                stat.S_IXOTH )


def main():
    openssl_dir, openssl_cafile = os.path.split(
        ssl.get_default_verify_paths().openssl_cafile)

    print(" -- pip install --upgrade certifi")
    subprocess.check_call([sys.executable,
        "-E", "-s", "-m", "pip", "install", "--upgrade", "certifi"])

    import certifi

    # change working directory to the default SSL directory
    try:
        os.chdir(openssl_dir)
    except FileNotFoundError:
        os.makedirs(openssl_dir)
        os.chdir(openssl_dir)
    relpath_to_certifi_cafile = os.path.relpath(certifi.where())
    print(" -- removing any existing file or link")
    try:
        os.remove(openssl_cafile)
    except FileNotFoundError:
        pass
    print(" -- creating symlink to certifi certificate bundle")
    os.symlink(relpath_to_certifi_cafile, openssl_cafile)
    print(" -- setting permissions")
    os.chmod(openssl_cafile, STAT_0o775)
    print(" -- update complete")

if __name__ == '__main__':
    main()

@lrayne
Copy link

lrayne commented Apr 14, 2024

Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment