import requests
data = {'foo':'bar'}
url = 'https://foo.com/bar'
r = requests.post(url, data=data)
Jeśli adres URL używa certyfikatu z podpisem własnym, kończy się to niepowodzeniem
requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Wiem, że mogę przejść False
do verify
parametru tak:
r = requests.post(url, data=data, verify=False)
Chciałbym jednak skierować żądania do kopii klucza publicznego na dysku i powiedzieć mu, aby ufał temu certyfikatowi.
python
ssl
python-requests
Matthew Moisen
źródło
źródło
Odpowiedzi:
próbować:
r = requests.post(url, data=data, verify='/path/to/public_key.pem')
źródło
ssl.get_server_certificate
pobierałem certyfikat dla(self-signed.badssl.com, 443)
, zapisałem gocert.pem
, a następnie uruchomiłemrequests.get('https://self-signed.badssl.com/', verify='cert.pem')
i nadal nie powiodło się z błędem SSL (ten certyfikat jest samopodpisany).Za pomocą tego
verify
parametru można podać niestandardowy pakiet urzędu certyfikacjiZ dokumentów :
źródło
Najłatwiej jest wyeksportować zmienną
REQUESTS_CA_BUNDLE
wskazującą na Twój prywatny urząd certyfikacji lub konkretny pakiet certyfikatów. W linii poleceń możesz to zrobić w następujący sposób:Jeśli masz swój urząd certyfikacji i nie chcesz wpisywać za
export
każdym razem, możesz dodaćREQUESTS_CA_BUNDLE
do swojego~/.bash_profile
w następujący sposób:echo "export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem" >> ~/.bash_profile ; source ~/.bash_profile
źródło
Przypadek, w którym potrzeba wielu certyfikatów, został rozwiązany w następujący sposób: Połącz wiele głównych plików PEM, myCert-A-Root.pem i myCert-B-Root.pem, do pliku. Następnie ustaw żądania REQUESTS_CA_BUNDLE var na ten plik w moim ./.bash_profile.
$ cp myCert-A-Root.pem ca_roots.pem $ cat myCert-B-Root.pem >> ca_roots.pem $ echo "export REQUESTS_CA_BUNDLE=~/PATH_TO/CA_CHAIN/ca_roots.pem" >> ~/.bash_profile ; source ~/.bash_profile
źródło
Ustawienie
export SSL_CERT_FILE=/path/file.crt
powinno wystarczyć.źródło
REQUESTS_CA_BUNDLE
zmienna nie działa w moim przypadku).Jeśli ktoś przypadkiem wyląduje tutaj (tak jak ja), chcąc dodać CA (w moim przypadku Charles Proxy) dla httplib2, wygląda na to, że możesz dołączyć go do
cacerts.txt
pliku dołączonego do pakietu pythona.Na przykład:
Zmienne środowiskowe, do których odwołują się inne rozwiązania, wydają się być specyficzne dla żądań i nie zostały odebrane przez httplib2 podczas moich testów.
źródło
Możesz spróbować:
settings = s.merge_environment_settings(prepped.url, None, None, None, None)
Możesz przeczytać więcej tutaj: http://docs.python-requests.org/en/master/user/advanced/
źródło