Requests: рдПрд╕рдПрд╕рдПрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 3 рд╕рд┐рддре░ 2013  ┬╖  121рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: psf/requests

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрдк рдЬрд┐рд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдереЛрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЖрдорддреМрд░ рдкрд░ рд╣рдореЗрд╢рд╛ рдЕрдкрдиреА .pem рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдирд┐рдЬреА рдХреБрдВрдЬреА рд╣реЛрддреА рд╣реИред openssl рдЖрдкрдХреЛ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдмрд┐рдирд╛ рдПрдХ рднреА рдмрдирд╛рдиреЗ рдирд╣реАрдВ рджреЗрдЧрд╛ред

Documentation Planned

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@botondus рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЕрдиреБрд░реЛрдз рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдорд┐рд▓рд╛ред рдореИрдВ рдЗрд╕реЗ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП .p12 рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдФрд░ рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝ рд╣реИред

рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдФрд░ рдирд┐рдЬреА рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред

// Generate the certificate file.
openssl pkcs12 -in /path/to/p12cert -nokeys -out certificate.pem
// Generate private key with passpharse, First enter the password provided with the key and then an arbitrary PEM password //(say: 1234) 
openssl pkcs12 -in /path/to/p12cert -nocerts -out privkey.pem

рдареАрдХ рд╣реИ, рд╣рдордиреЗ рдЕрднреА рддрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЙрд╕ рдХреБрдВрдЬреА рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рд╕реЗ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░ рдмрд╛рд░ рдкреАрдИрдПрдо рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝ рдХреЗ рдмрд┐рдирд╛ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред

// Running this command will prompt for the pem password(1234), on providing which we will obtain the plainkey.pem
openssl rsa -in privkey.pem -out plainkey.pem

рдЕрдм, рдЖрдкрдХреЗ рдкрд╛рд╕ certificate.pem рдФрд░ plainkey.pem , рджреЛрдиреЛрдВ рдлрд╛рдЗрд▓реЗрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреАрдЖрдИ рд╕реЗ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред

рдЗрди рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдФрд░ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЕрдиреБрд░реЛрдз рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

import requests
url = 'https://exampleurl.com'
headers = {
            'header1': '1214141414',
            'header2': 'adad-1223-122'
          }
response = requests.get(url, headers=headers, cert=('~/certificate.pem', '~/plainkey.pem'), verify=True)
print response.json()

рдЙрдореНрдореАрдж рд╣реИ рдпреЗ рдорджрдж рдХрд░реЗрдЧрд╛:

cc @kennethreitz @Lukasa @sigmavirus24

рд╕рднреА 121 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

requests.get('https://kennethreitz.com', cert='server.pem', cert_pw='my_password')

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП cert рдкрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: cert=('server.pem', 'my_password')

@sigmavirus24
рдЯрдкрд▓ (certificate, key) ред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдХреАрдлрд╛рдЗрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред
Stdlib рдХреЛ рдХреЗрд╡рд▓ рд╕рдВрд╕реНрдХрд░рдг 3.3 рдореЗрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдорд┐рд▓рд╛ред

рдЕрд░реЗ, @ t-8ch, рдЖрдк рдЧрд▓рддреА рд╕реЗ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп FS рдкрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЬреБрдбрд╝ рдЧрдПред ;) рд╕рд╣реА рд▓рд┐рдВрдХ ред

рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА @ t-8chред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдХрднреА рднреА рдмрд╕ рдХреЗ рдореБрджреНрджреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред :/

рдЗрд╕рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдЖрдо рд╕рд╣рдорддрд┐ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдкрд╛рдпрдерди рдХреЗ рдЧреИрд░-3.3 рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдХрд┐рддрдирд╛ рдХрд╛рдо рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ?

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдирд╛ рдХрд┐рддрдирд╛ рдХрдард┐рди рд╣реЛрдЧрд╛? рдореИрдВ рдмрд╕ рдЗрд╕ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рджреЛ рдШрдВрдЯреЗ рд▓рдЧ рдЧрдП, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрдЧрд╛, рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд╣рд╛рдВ рд▓реВрдкрд┐рдВрдЧ рдХрд░рддрд╛ рд╣реИред рд╢рд╛рдирджрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рд░реБрдХреЛ, рдпрд╣ рд▓реВрдкрд┐рдВрдЧ рдХрд╣рд╛рдБ рдмреИрдарддрд╛ рд╣реИ? рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рд╣рдо рдХрд╣рд╛рдБ рдЕрд╕рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдк рдЯреНрд░реЗрд╕рдмреИрдХ рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕реЗ рд╣рдо рд▓реВрдк рдХрд░рддреЗ рд╣реИрдВ?

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣реАрдВ рд▓рдЯрдХрд╛ рд╣реБрдЖ рд╣реИ:

рдЖрд░ = рдЕрдиреБрд░реЛрдзред рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдпреВрдЖрд░рдПрд▓,
рдкреНрд░рдорд╛рдгреАрдХрд░рдг = рд╢реАрд░реНрд╖рд▓реЗрдЦ,
рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ = рд╕реЗрд▓реНрдл.рд╕рд░реНрдЯ_рдЯреБрдкрд▓,
рд╣реЗрдбрд░ = рд╣реЗрдбрд░,
рд╕рдордп рд╕рдорд╛рдкреНрдд = резреж,
рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ = рд╕рддреНрдп)

рдореИрдВрдиреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд▓рд╛рдн рдХреЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЛ рдКрдкрд░ рдпрд╛ рдиреАрдЪреЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

рдЖрд╣, рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ред рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдЗрд╕реЗ рд▓рдЯрдХрд╛ рджреЗрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ Ctrl + C рд╕реЗ рдорд╛рд░ рджреЗрдВ рддрд╛рдХрд┐ рдЕрдЬрдЧрд░ рдПрдХ рдХреАрдмреЛрд░реНрдбрдЗрдВрдЯрд░рдкреНрдЯ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХреЗ, рдлрд┐рд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдо рдЯреНрд░реЗрд╕рдмреИрдХ рдореЗрдВ рдХрд╣рд╛рдВ рд╣реИрдВред рдореИрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╣рд╛рдВ рд░реБрдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЬреЛ рдореИрдВрдиреЗ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рджреЗрдЦрд╛ рд╣реИ) рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓, рдкрд╛рд╕рд╡рд░реНрдб-рд╕рдВрд░рдХреНрд╖рд┐рдд рдкреНрд░рдорд╛рдгрдкрддреНрд░ рджрд┐рдП рдЬрд╛рдиреЗ рдкрд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ред рдпрд╣ рдмрд┐рдирд╛ рд▓реЙрдЧ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЙрдореНрдкреНрдЯ рд╕реАрдзреЗ рдореБрджреНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ), рдФрд░ рдпрд╣ рд╕рдордп рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдВрдЯрд░ рджрдмрд╛рдП рдЬрд╛рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдХрд╣рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЬрдм рд╕рд░реНрд╡рд░ рдкрд░ рдХреЛрдб рдЪрд▓ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдмреЛрдЭрд┐рд▓, рдЦрддрд░рдирд╛рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдорд╛рд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рджреЗрдЧрд╛)ред

рдХреНрдпрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдкрдХреЗ рдирд┐рдпрдВрддреНрд░рдг рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ рдФрд░ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рд╣реИ?

@maxnoel рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк @рд▓реБрдХрд╛рд╕рд╛ рдХреЗ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЖрдЦрд┐рд░реА рдЯрд┐рдкреНрдкрдгреА) рддреЛ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рд╣реИ рдЬреЛ рд╣рдо рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ .

рдЖрдк рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рдкрд╛рдпрдерди рдкреНрд░реЙрдореНрдкреНрдЯ рд╕реЗ рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝ рдХреЗ рд▓рд┐рдП рд╕реНрдЯрдб рдкрд░ рдмреНрд▓реЙрдХ рдХрд░ рд░рд╣рд╛ рд╣реИ:

>>> r = requests.get("https://foo.example.com/api/user/bill", cert=("client.crt", "client.key"))
Enter PEM pass phrase:
>>>

рдпрджрд┐ рдЖрдк рдкреГрд╖реНрдарднреВрдорд┐ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдЙрд╕ рдЗрдирдкреБрдЯ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдпрд╣ рд╕рд╣реА рд╣реИред рдХреНрдпрд╛ рдРрд╕рд╛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЬрдм рдХреЛрдИ рдкрд╛рд╕рд╡рд░реНрдб рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЕрдкрд╡рд╛рдж рдЙрдард╛рдирд╛ рд╕реНрдЯрдб рдкрд░ рд╕рд╛рдорд╛рди рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рджреЗрдиреЗ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдПрдХ рдЧреИрд░-рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ)ред

рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рдкрддрд╛ред @рд░реАрдкрд░рд╣рд▓реНрдХ?

рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ pyOpenSSL рджреНрд╡рд╛рд░рд╛ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз pyopenssl рдХреЛ рдХрд╣рд╛рдВ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ? рдореИрдВ рдереЛрдбрд╝рд╛ рдЦреЛрдж рд╕рдХрддрд╛ рд╣реВрдБред

@reaperhulk рдпрд╣ рдпрд╣рд╛рдВ urllib3 рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛

рд╣рдо stdlib рдХреЗ рд▓рд┐рдП рднреА рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреАред

рдЗрд╕рд▓рд┐рдП рд╣рдо pyOpenSSL рдХреА рддрд░рд╣ рдПрдХ рдкреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЗрд╕ ред Stdlib рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдореЗрдВ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд╕рд╛рде load_cert_chain рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ? рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдкрд╛рдЪреЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдореЗрдВ рднрд╛рдЧ рд░рд╣рд╛ рд╣реВрдВред

рдпрд╣ рдирд╣реАрдВ рд╣реИред

PKCS#12 рд╕реНрд╡рд░реВрдкрд┐рдд (рдФрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб) тАЛтАЛрдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЬрд┐рдирдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░/рдХреБрдВрдЬреА рд╣реЛ рд╕рдХрддреА рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдЙрд╕реА рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрдПрдЧрд╛?

@ рдорд┐рдХреЗрд▓реБрдкреЛ рд╣рд╛рдБред

@telam @mikelupo
рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рдЧреБрдЧрд▓ рдХрд┐рдпрд╛, рдЖрдЦрд┐рд░рдХрд╛рд░, рдореИрдВрдиреЗ рдЗрд╕реЗ pycurl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ред
рдореЗрд░реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореИрдВ рдЕрдкрдиреА .pfx рдлрд╝рд╛рдЗрд▓ рдХреЛ .pem рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдУрдкрдирдПрд╕рдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдФрд░ рдХреБрдВрдЬреА (рдкрд╛рд╕ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЗ рд╕рд╛рде рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб) тАЛтАЛрджреЛрдиреЛрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдлрд┐рд░ рдирд┐рдореНрди рдХреЛрдб рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░реЗрдВред

import pycurl
import StringIO

b = StringIO.StringIO()
c = pycurl.Curl()
url = "https://example.com"
c.setopt(pycurl.URL, url)
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.setopt(pycurl.CAINFO, "/path/cacert.pem")
c.setopt(pycurl.SSLKEY, "/path/key_file.pem")
c.setopt(pycurl.SSLCERT, "/path/cert_file.pem")
c.setopt(pycurl.SSLKEYPASSWD, "your pass phrase")
c.perform()
c.close()
response_body = b.getvalue()

BTW, рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП, pass phrase рд▓рд┐рдП рд╣рд╛рд░реНрдбрдХреЛрдб рдирд╣реАрдВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ

рдмреЗрд╢рдХред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рд╕рдорд╕реНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рдкрд╛рд╕ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдпрд╣ рд╣реИ рдХрд┐ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдЖрдкрдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╣реИрдВрдЧ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рд╕реНрдЯрдб рдореЗрдВ рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдПрдХ рдЧреИрд░-рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ, рдЬреАрдпреВрдЖрдИ рдпрд╛ рд░рд┐рдореЛрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреАред

рдЬрдм рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдХреЛрдИ рднреА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЕрдкрд╡рд╛рдж рдЙрдард╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрджрд┐ рдЖрдк рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП '' рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ Opensl рд╣реИрдВрдЧ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдпрд╣ рдПрдХ рдЦрд░рд╛рдм рдкрд╛рд╕рд╡рд░реНрдб рдЯреЗрдХреНрд╕реНрдЯ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдЖрдк рддреБрд░рдВрдд рдЕрдкрдирд╛ py рдкреНрд░рд╡рд╛рд╣ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ
рддрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЙрд╕ рд╕реНрдкрд╖реНрдЯ рд╕реНрдЯрд╛рд▓ рдХреЗ рдмрд┐рдирд╛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛

рд╣рдо рдЗрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдордп рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рд╢реЗрдбреНрдпреВрд▓ рдирд╣реАрдВ рд╣реИред

@botondus рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЕрдиреБрд░реЛрдз рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдорд┐рд▓рд╛ред рдореИрдВ рдЗрд╕реЗ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП .p12 рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдФрд░ рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝ рд╣реИред

рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдФрд░ рдирд┐рдЬреА рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред

// Generate the certificate file.
openssl pkcs12 -in /path/to/p12cert -nokeys -out certificate.pem
// Generate private key with passpharse, First enter the password provided with the key and then an arbitrary PEM password //(say: 1234) 
openssl pkcs12 -in /path/to/p12cert -nocerts -out privkey.pem

рдареАрдХ рд╣реИ, рд╣рдордиреЗ рдЕрднреА рддрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЙрд╕ рдХреБрдВрдЬреА рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рд╕реЗ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░ рдмрд╛рд░ рдкреАрдИрдПрдо рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝ рдХреЗ рдмрд┐рдирд╛ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред

// Running this command will prompt for the pem password(1234), on providing which we will obtain the plainkey.pem
openssl rsa -in privkey.pem -out plainkey.pem

рдЕрдм, рдЖрдкрдХреЗ рдкрд╛рд╕ certificate.pem рдФрд░ plainkey.pem , рджреЛрдиреЛрдВ рдлрд╛рдЗрд▓реЗрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреАрдЖрдИ рд╕реЗ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред

рдЗрди рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдФрд░ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЕрдиреБрд░реЛрдз рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

import requests
url = 'https://exampleurl.com'
headers = {
            'header1': '1214141414',
            'header2': 'adad-1223-122'
          }
response = requests.get(url, headers=headers, cert=('~/certificate.pem', '~/plainkey.pem'), verify=True)
print response.json()

рдЙрдореНрдореАрдж рд╣реИ рдпреЗ рдорджрдж рдХрд░реЗрдЧрд╛:

cc @kennethreitz @Lukasa @sigmavirus24

рдореИрдВрдиреЗ рдЕрдВрдЧреВрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрдирд╛ рд╣реИ рдХрд┐ рдЕрдореЗрдЬрд╝реЕрди рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдареАрдХ рдпрд╣реА рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рднреА рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореЗрд░реА рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рд╕рд╛рджреЗ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЛ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕реНрдЯреЛрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ (рджреВрд╕рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЪреЛрд░реА рд╣реЛрдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред рддреЛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рддрд░реАрдХрд╛ рдирд┐рдЬреА рдХреБрдВрдЬреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдкрде рдХреЗ рдмрдЬрд╛рдп PEM encoded string of private key рдЬреИрд╕реЗ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╣реИред рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЙрдирдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдирд┐рдЬреА рдХреБрдВрдЬреА/рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди/рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдХреЛ рдмрд╕ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред
рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрд░реЛрдз рдЕрдЬрдЧрд░ рдХреЗ ssl lib рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдкреНрд░рдорд╛рдгрдкрддреНрд░/рдирд┐рдЬреА рдХреБрдВрдЬреА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдмрд╕ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдкрд╛рдЗрдерди stdlib рдХреЗ рдмрдЬрд╛рдп pyopenssl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? pyopenssl рдореЗрдВ рдУрдкрдирдПрд╕рдПрд▓ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдПрдХ рдЖрд╡рд░рдг рд╣реИ, рджреЗрдЦреЗрдВ: https://pyopenssl.readthedocs.io/en/latest/api/ssl.html#connection -objects ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рдо рдлрд╝рд╛рдЗрд▓ рдкрде рдХреЗ рдмрдЬрд╛рдп 'pkey' рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдиреБрд░реЛрдз рдкрд╣рд▓реЗ рд╕реЗ рд╣реА PyOpenSSL рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╕реНрдерд╛рдкрд┐рдд рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХрднреА рднреА рдЕрдирд┐рд╡рд╛рд░реНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛: рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣рдо рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВред

рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд░рд┐рд▓реАрдЬ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЯреАрдПрд▓рдПрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП SSLContext рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ urllib3 рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реЛрдЧрд╛: рдЬреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдЧрд╛ред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдЬрдм рддрдХ рдЕрдиреБрд░реЛрдз ssl.SSLContext/OpenSSL.SSL.Context рдХреЛ urllib3 рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛, рдпрд╣рд╛рдВ рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдкреНрд░рдорд╛рдгрдкрддреНрд░/рдХреАрдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ (рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрдЬрд╛рдп PyOpenSSL рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) ssl, рдЬреЛ рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)

import requests

 # Get the password from the user/configfile/whatever
password = ...

# Subclass OpenSSL.SSL.Context to use a password callback that gives your password
class PasswordContext(requests.packages.urllib3.contrib.pyopenssl.OpenSSL.SSL.Context):
    def __init__(self, method):
        super(PasswordContext, self).__init__(method)
        def passwd_cb(maxlen, prompt_twice, userdata):
            return password if len(password) < maxlen else ''
        self.set_passwd_cb(passwd_cb)

# Monkey-patch the subclass into OpenSSL.SSL so it is used in place of the stock version
requests.packages.urllib3.contrib.pyopenssl.OpenSSL.SSL.Context = PasswordContext

# Use requests as normal, e.g.
endpoint = 'https://example.com/authenticated'
ca_certs = '/path/to/ca/certs/bundle'
certfile = '/path/to/certificate'
keyfile = '/path/to/encrypted/keyfile'
requests.get(endpoint, verify=ca_certs, cert=(certfile, keyfile))

@ahnolds : рдХреНрдпрд╛ рдпрд╣

@ рд▓реБрдХрд╛рд╕рд╛ : рдХреНрдпрд╛

PKCS#12 рдПрдХ рдкреЗрдЪреАрджрд╛ рдореБрджреНрджрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рдЕрдкрдиреЗ SSLContext рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рд╡рд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

@ рд▓реБрдХрд╛рд╕рд╛ : рдореИрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ client_cert.p12 рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ cert=... рдХреАрд╡рд░реНрдб рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ред

@vog рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ рдХрд╛рдо рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА?

@ рд▓реБрдХрд╛рд╕рд╛ рдореИрдВ requests рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдХрдо рд╕реЗ рдХрдо рд╕рдордЭреВрдВ , рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  • рдпрд╛ рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ PKCS#12 рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рд╕реАрдзреЗ рдирд┐рдЪрд▓реА рдкрд░рддреЛрдВ (urllib3, рдЖрджрд┐) рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдФрд░ рд╢рд╛рдпрдж рдкрд╛рд╕рд╡рд░реНрдб рднреАред (рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдЬреЛ рдпреВрдЖрд░рдПрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдЯреВрд▓ рдкрд░ рдЕрдкрдирд╛ рдкреАрдХреЗрд╕реАрдПрд╕ #12 рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрдГрдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рд╕реЗ рдкреВрдЫреЗред)
  • рдпрджрд┐ рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдкреАрдХреЗрд╕реАрдПрд╕#12 (+рдкрд╛рд╕рд╡рд░реНрдб) рдХреЛ рдкреАрдИрдПрдо рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛, рдлрд┐рд░ рдЗрдиреНрд╣реЗрдВ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░реЛрдВ рдкрд░ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдХреБрдЫ рдХреЙрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ OpenSSL рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреАрдИрдПрдо рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдЕрднреА рддрдХ (рдЕрдирдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб) тАЛтАЛрдкреАрдИрдПрдо рдХреЛ рдирд┐рдЪрд▓реА рдкрд░рддреЛрдВ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ (рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓/рдкрд╛рдпрдерди "рдПрд╕рдПрд╕рдПрд▓" "рдмрдлрд░" рд░реИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП wrap_bio , рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдирд╡реАрдирддрдо рдкрд╛рдпрдерди 3 рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдкрд╛рдпрдерди 2 рдореЗрдВ рдирд╣реАрдВ)ред
  • рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдпрд╣ рдЕрд╕рдВрднрд╡ рднреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рди рдХреЗрд╡рд▓ PKCS#12 рдХреЛ PEM рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдмрд▓реНрдХрд┐ (рдЕрдирдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб) тАЛтАЛтАЛтАЛрдкреАрдИрдПрдо рдбреЗрдЯрд╛ рд╡рд╛рд▓реА рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рднреА рдмрдирд╛рдиреА рд╣реЛрдЧреАред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдЦрд┐рд░реА рдмрд┐рдВрджреБ рд╡рд╣ рд╣реИ рдЬреЛ рдореИрдВ рдЗрд╕ рд╕рдордп рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рд╡рд╛рд▓реЗ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдХреЗрд╡рд▓ PKCS#12 рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдирд┐рдЪрд▓реА рдкрд░рддреЛрдВ рдореЗрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рднреЗрдЬ рд╕рдХрддрд╛?

рдореИрдВ рдПрдХ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдХреЗ рд░реВрдк рдореЗрдВ @reaperhulk рдореЗрдВ рдЯреИрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ

@ рд▓реБрдХрд╛рд╕рд╛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдмрд╣реБрдд рддрдХрдиреАрдХреА рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдпрд╣ рдмрд╕ рдпрд╣реА рд╣реИ:

рдЖрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕реА рд╕реЗрд╡рд╛ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд▓рдЧрднрдЧ рд╣рд░ рдЬрдЧрд╣ рдЖрдкрдХреЛ рдпрд╣ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдФрд░ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ (рдЬрд╣рд╛рдБ рдлрд╝рд╛рдЗрд▓ PKCS#12 рдПрдиреНрдХреЛрдбреЗрдб рд╣реИ)ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдкреАрдЖрдИ рдореЗрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЬрд╛рд╡рд╛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд╛рдпрдерди рдореЗрдВ рдпрд╣ рдирд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрдЯрд┐рд▓ рд╣реИред

рдЗрд╕рд▓рд┐рдП рд▓рдЧрднрдЧ рдХреЛрдИ рднреА рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╡реЗ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓ рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рд╣рд╛рде рд╕реЗ рдПрдХ рдкреАрдИрдПрдо рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдРрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдУрд╡рд░рд╣реЗрдб рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХреЗрд╡рд▓ (PKCS#12) рдлрд╝рд╛рдЗрд▓ рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдирд╛рдо рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ requests рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо рдЬрд╛рд╡рд╛ рдХреА рддрд░рд╣ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

requests рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреЗрд╡рдХреВрдл рдЬрдЯрд┐рд▓ рдПрдкреАрдЖрдИ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреАрдХреЗрд╕реАрдПрд╕ # 12 рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдПрдХ рдмреЗрд╡рдХреВрдл рдЬрдЯрд┐рд▓ рдПрдкреАрдЖрдИ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИред

PKCS#12 рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдПрдХ рдмреЗрд╡рдХреВрдл рдЬрдЯрд┐рд▓ API рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИред

рд╣рд╛рдБ, рдореИрдВ рдЗрд╕рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЕрд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдБ: рд╕реНрдЯреИрдХ рдореЗрдВ рдХрд╣реАрдВ рднреА PKCS#12 рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдкрд╛рдХрд░ рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦреБрд╢реА рд╣реЛрдЧреАред

рдореИрдВ рдЬреЛ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЙрд╕ рдХрд╛рдо рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рдХреЛрдб рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЗрд╕реЗ рдХрд╣рд╛рдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░рд╛ рддрд░реНрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

  1. рдЖрдо рддреМрд░ рдкрд░, рдЕрдиреБрд░реЛрдз рдХреЗрд╡рд▓ рдЗрд╕рдХреА рдПрдкреАрдЖрдИ рд╕рддрд╣ рдореЗрдВ рдЬреБрдбрд╝рддреЗ рд╣реИрдВ рдпрджрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд, рдпрджрд┐ рдпрд╣ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдХреБрдЫ рджреНрд╡рд╛рд░рд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдФрд░ рдпрджрд┐ рд╣рдо рдЬреЛ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдпрд╛ рд╕реВрдХреНрд╖реНрдо рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВред
  2. рдЖрдо рддреМрд░ рдкрд░ PKCS#12 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ API рд╕рддрд╣ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ cert= рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ (рдмрд╕ рдЙрди рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдЪреМрдбрд╝рд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВрдЧреЗ) рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ( рдпрд╣реА рд╣реИ, рд╣рдо рдордЬрд╝рдмреВрддреА рд╕реЗ PKCS#12 рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ PEM рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рд╣рдо рддрд░реНрдХ рдХреА рджреЛрдиреЛрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ), рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рд╕рддрд╣ рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдорд╛рдореВрд▓реА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ .
  3. рд╣рд╛рд▓рд╛рдБрдХрд┐, рдРрд╕реА рдЕрдиреНрдп рдЬрдЧрд╣реЗрдВ рд╣реИрдВ рдЬрд╣рд╛рдБ рдпрд╣ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдПрдбреЗрдкреНрдЯрд░ рд╕реНрддрд░ рдкрд░, рдпрд╛ рдЕрдиреБрд░реЛрдз рдЯреВрд▓рдмреЗрд▓реНрдЯ рдореЗрдВ рдПрдХ рд╕рд╣рд╛рдпрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╛ рдХреБрдЫ рдФрд░ред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рд╕реВрдХреНрд╖реНрдо рд╣реИ, рдХреЛрдб рдХрд┐рддрдирд╛ рдЬрдЯрд┐рд▓ рд╣реИ, рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдХреЛрдб рдХреЛ рдХрд╣рд╛рдВ рд░рдЦрд╛ рдЬрд╛рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рдПрдХ _suspicion_ рд╣реИ рдХрд┐ рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА PKCS#12 рдХреЛ рд╣реИрдВрдбрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ _at best_ Requests рдХреЗрд╡рд▓ PKCS#12 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ [security] рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛрдЧрд╛ред рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд┐рд╕реА рднреА рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдЙрдкрд▓рдмреНрдз рди рд╣реЛрдВ, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣рдореЗрдВ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмреЛрдирд░реНрд╕ рд╕рд╛рдорд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ @reaperhulk рдХрд╛ рд╡рдЬрди рд╣реЛ: рд╡рд╣ рд╕рдВрднрд╡рддрдГ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рддреЗрдЬреА рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдЬрд┐рддрдирд╛ рдХрд┐ рдореИрдВ рд╢реЛрдз рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдореИрдВ рдЗрд╕ рд╕рдорд░реНрдерди рдХреЛ рдЬреЛрдбрд╝рд╛ рд╣реБрдЖ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ: рдореБрдЭреЗ рдмрд╕ рдХреБрдЫ рдРрд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рд▓рд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рдо рдХрд╛ рджрд╛рдпрд░рд╛ рдХреНрдпрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ рдФрд░ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдореЗрдВ рдХрд┐рддрдиреЗ рдмрдбрд╝реЗ рдкрд╣рд╛рдбрд╝ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

PKCS#12 рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╡рд┐рд╡рд░рдг: рдпрджрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдмрд╛рдЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп unicode рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ Python OpenSSL рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рддреЛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ load_pkcs12() рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

if isinstance(password, unicode):
    password_bytes = password.encode('utf8')
else:
    password_bytes = password
pkcs12 = OpenSSL.crypto.load_pkcs12(pkcs12_data, password_bytes)

рдПрдХ рдкреВрд░реНрдг рдХрдирд╡рд░реНрдЯрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ pkcs12_data рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рдЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ, рдЬрдмрдХрд┐ password рдмрд╛рдЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдпрд╛ рдпреВрдирд┐рдХреЛрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

def pkcs12_to_pem(pkcs12_data, password):
    # Old versions of OpenSSL.crypto.load_pkcs12() fail if the password is a unicode object
    if isinstance(password, unicode):
        password_bytes = password.encode('utf8')
    else:
        password_bytes = password
    p12 = OpenSSL.crypto.load_pkcs12(pkcs12_data, password_bytes)
    p12_cert = p12.get_certificate()
    p12_key = p12.get_privatekey()
    pem_cert = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, p12_cert)
    pem_key = OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, p12_key)
    pem = pem_cert + pem_key
    return pem

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ PKCS#12 рдЪрд░реНрдЪрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореБрджреНрджреЗ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ PKCS#12 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рд╡реЛрдЯ рджреВрдВрдЧрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рдореБрджреНрджрд╛ рд╣реЛ, рд▓реЗрдХрд┐рди рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рднрд╛рд░реА рд▓реЛрдЧреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд┐рд╕реЗ рдЕрдирдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, OpenSSL.crypto.dump_privatekey рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ PEM рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреА рдПрдХ рдкреНрд░рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдкреАрдИрдПрдо рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдо рдХрд░ рджреЗрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛ред

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк use_privatekey рдХреА OpenSSL.SSL.Context рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рдХреЗ рд╕рдорд╛рди рд╣реИрдХ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░реЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ (рдЕрдирдЪрд╛рд╣реЗ) рдХреБрдЫ рдЗрд╕ рддрд░рд╣

# From somewhere
pkcs12_data = ...
password_bytes = ...

class Pkcs12Context(requests.packages.urllib3.contrib.pyopenssl.OpenSSL.SSL.Context):
    def __init__(self, method):
        super(PasswordContext, self).__init__(method)
        p12 = OpenSSL.crypto.load_pkcs12(pkcs12_data, password_bytes)
        self.use_certificate(p12.get_certificate())
        self.use_privatekey(p12.get_privatekey())
# Monkey-patch the subclass into OpenSSL.SSL so it is used in place of the stock version
requests.packages.urllib3.contrib.pyopenssl.OpenSSL.SSL.Context = Pkcs12Context

рдлрд┐рд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдХреЗрд╡рд▓ requests.get рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред

рдЕрдм рдЗрд╕ рдзрд╛рдЧреЗ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореВрд▓ рдХрд╛ рдкреБрдирд░реНрд▓реЗрдЦрди:

рдПрдХ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдкреАрдИрдПрдо рд╕реНрд╡рд░реВрдкрд┐рдд рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпрд╛ рдЕрдиреБрд░реЛрдз рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдЪреВрдВрдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдорд╛рдирдХ libs рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЙрджреНрдпрдо рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдВрдд рдореВрд▓реНрдпрд╡рд╛рди рд╣реЛрдЧрд╛ (рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдФрд░ рдРрд╕рд╛ рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ)ред

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдпрд╣ рдПрдХ рдХрд╕реНрдЯрдо ssl рд╕рдВрджрд░реНрдн рдХреЛ urllib3 рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдПрдбреЙрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рд╕ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрд╕рдПрд╕рдПрд▓ рд╕рдВрджрд░реНрдн рдЬреЛ рдХреБрдЫ рднреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рд╡рд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдпрд╣рд╛рдВ рдПрдХ рдХрд╕реНрдЯрдо рд╕рдВрджрд░реНрдн рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ .pfx рдФрд░ .p12 рдХреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ .pem рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рджреЗрдЦреЗрдВ https://gist.github.com/erikbern/756b1d8df2d1487497d29b90e81f8068

рдЕрдЧрд░ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдореИрдВ рдПрдХ рдкреАрдЖрд░ рдЬрдорд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рдФрд░ рд╕рдВрджрд░реНрдн рдкреНрд░рдмрдВрдзрдХ рд╕реЗ рдмрдЪрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдмрддрд╛рдУред

рдпрд╣ рд╡рд┐рд▓рдп рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рдбрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрдм рдЖрдк рдПрдХ PyOpenSSL рд╕рдВрджрд░реНрдн рдХреЛ рд╕реАрдзреЗ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЖрдк рдкрд╛ рд╕рдХреЗрдВ рдХрд┐ рдЖрдк рдЙрд╕ рдореБрджреНрджреЗ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рд╡рд┐рд▓рдп рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рдбрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрдм рдЖрдк рдПрдХ PyOpenSSL рд╕рдВрджрд░реНрдн рдХреЛ рд╕реАрдзреЗ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЖрдк рдкрд╛ рд╕рдХреЗрдВ рдХрд┐ рдЖрдк рдЙрд╕ рдореБрджреНрджреЗ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рднреНрд░рдорд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ pfx/p12 рд╕рдорд░реНрдерди рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╡рд┐рд▓рдп рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ? (рд╕рдВрджрд░реНрдн рдЖрджрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рдирддреЗ рд╣реБрдП)ред рдЗрд╕реЗ рдПрдХ рд╢реЙрдЯ рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реБрдИ рд▓реЗрдХрд┐рди рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдореЗрд░реЗ рд╕рдордп рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ рдЕрдЧрд░ рдЗрд╕реЗ рд╡рд┐рд▓рдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ "рд╡рд┐рд▓рдп рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ" рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛ред

@erikbern рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рд╕рдорд╛рдзрд╛рди рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдФрд░ рд╡рд┐рд▓рдп рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИ рдЬреЛ рдХреБрдЫ рд╣рдж рддрдХ рд▓рдЧрд╛рддрд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, urllib3 рдореЗрдВ PyOpenSSL contrib рдореЙрдбреНрдпреВрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ PKCS#12 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛрдЧрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рд╕рдорд╛рдзрд╛рди рд╕реНрд╡реАрдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ @vog рджреНрд╡рд╛рд░рд╛ рдиреЛрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ PKCS#12 рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп ssl рдореЙрдбреНрдпреВрд▓ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╕рдорд░реНрдерди рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рднреА рдЕрдиреБрд░реЛрдз рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдмрдврд╝рд┐рдпрд╛ рд╣реИред рдореИрдВ рдпрд╣ рднреА рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рдЦрд░рд╛рдм рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рд╕реНрдХ рдкрд░ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХреА рдЧрдИ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХрд╛ рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдЦрд┐рдо рд╣реИред рдЕрдЧрд▓реЗ рд╣рдлреНрддреЗ рдЗрд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред ssl рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж - рдпрджрд┐ рд╕реАрдорд╛ requests рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ рддреЛ рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

рдореИрдВрдиреЗ рдЗрд╕реЗ рджреЗрдЦрд╛ рдФрд░ ssl рдореЙрдбреНрдпреВрд▓ рдиреЗ cadata рддрд░реНрдХ рдЬреЛрдбрд╝рд╛ рдЬрд╣рд╛рдВ рдЖрдк рдХрдЪреНрдЪреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрдо рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: https://docs.python.org/3/library/ssl.html #ssl.SSLContext.load_verify_locations

рд╣рдореЗрдВ рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП urllib3 рдХреЛ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдкреИрдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ

@erikbern рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐, рдЗрд╕ рддрд░рд╣ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рд╕рдорд╛рдзрд╛рди рдмреЗрд╣рддрд░ рд╕рд┐рд░реНрдл рдПрдХ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдмрд┐рдирд╛ рдкрд╛рд░рд┐рдд рдХрд░рдХреЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ SSLContext urllib3 рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╕реНрддреБ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ TransportAdapter ред

https://github.com/kennethreitz/requests/issues/2519 рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╕рдорд╛рди рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╢рд╛рдпрдж рд╡рд┐рд▓рдп рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рдореИрдВ рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдкрд╛рд╕рд╡рд░реНрдб рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реИред рдХреНрдпрд╛ рдореБрдЭреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП? рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ ASAP рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рд╣рдо рдЗрд╕рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реА рд╕рдмрд╕реЗ рдЕрдиреБрд░реЛрдзрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдзрд╛рдЧрд╛ 2013 рдореЗрдВ рд╢реБрд░реВ рд╣реБрдЖ рдерд╛ рдФрд░ рдореБрдЭреЗ рдЕрдВрдд рддрдХ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рдХреЛрдИ рд╕рдВрдХрд▓реНрдк рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдХреНрдпрд╛ рдЖрдк рд▓реЛрдЧреЛрдВ рдиреЗ рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдерд╛? рдпрд╛ рдпрд╣ рдЕрднреА рднреА рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИ?

рдореИрдВ рдПрдХ рдРрдк рд╕реБрд░рдХреНрд╖рд╛ рдЙрддреНрдкрд╛рдж рдореЗрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдореИрдВ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред рддреЛ рдХреЛрдИ рднреА рд╕рдВрдХреЗрдд рд╕рд╣рд╛рдпрдХ рд╣реЛрдЧрд╛

@AnoopPillai рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЬрд╛рдБрдЪ рдХреА? https://github.com/requests/requests/issues/1573#issuecomment -188125157

рд╣рд╛рдВ, рдореИрдВрдиреЗ рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдкрдврд╝реА рд╣реИ, рдпрд╣ рдПрдХ рдХрд╛рдо рд╣реИ рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рдЗрд╕реЗ 2 рдкреНрд░рдорд╛рдгрд┐рдд рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдореЗрд░реЗ рдЖрд╡реЗрджрди рдХреЗ рдмрд╛рд╣рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣рдо рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб .pem рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд┐рдЬреЛрд░реА рдЬреИрд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рдкрд╛рд╕рд╡рд░реНрдб рд░рди рдЯрд╛рдЗрдо рдкрд░ рдРрдк рджреНрд╡рд╛рд░рд╛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЛрдИ рд╣рд╛рд░реНрдб рдХреЛрдбрд┐рдВрдЧ рди рд╣реЛред

@ рдЕрдиреВрдкрдкрд┐рд▓реНрд▓рдИ рдареАрдХ рд╣реИред

@kennethreitz рдирд╣реАрдВ, рд╣рдордиреЗ рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

@ рдЕрдиреВрдкрдкрд┐рд▓реНрд▓рдИ рд╣рд╛рдБ, рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдмрд╕ рдХреБрдЫ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХреЗ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЖрдкрдХреЛ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдПрдбреЙрдкреНрдЯрд░ рд╕реНрддрд░ рдкрд░ рд╕реАрдзреЗ urllib3 рдХреЛ SSLContext рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝ рдпрд╛ рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рдо рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВред

@AnoopPillai рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдЙрдкрдпреЛрдЧреА https://gist.github.com/erikbern/756b1d8df2d1487497d29b90e81f8068

рдореБрдЭреЗ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рд▓реБрдХрд╛рд╕рд╛ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред
рдореИрдВ рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдирдпрд╛ рд╣реВрдВ рдФрд░ 3.6 рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХреНрдпрд╛ рдЖрдк рдореЗрд░рд╛ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХреЗ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдлрд░ рдЬреИрд╕реЗ рд╡рд┐рдХрд▓реНрдк рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВред
@Erikbern рдореИрдВ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рд╕рдорд╛рдзрд╛рди рд╕реЗ рдирд╣реАрдВ рджреЗрдЦреВрдВрдЧрд╛ ред рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@ рдЕрдиреВрдкрдкрд┐рд▓реНрд▓рдИ рдЖрдкрдХреЛ load_cert_chain ред

@ рд▓реБрдХрд╛рд╕рд╛ рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░реЗрдВрдЧреЗ? рдХреЗрд╡рд▓ рдХреБрдЫ рдорд┐рдирдЯ рд▓рдЧрдиреЗ рдЪрд╛рд╣рд┐рдП (рдореИрдВ рдЙрдиреНрдирдд рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ, рдпрд╛ рд╢рд╛рдпрдж рдПрдХ рдирдП рдЙрдиреНрдирдд рдЙрдиреНрдирдд рдЕрдиреБрднрд╛рдЧ рдореЗрдВ)

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рджреЛрд╕реНрддреЛрдВ, рдЕрдЬрдЧрд░ рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдХреА рдХрдореА рдХрд╛ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рдХреЛрдб рд▓реБрдХрд╛рд╕рд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реВрдВред рдореЗрд░рд╛ рдХреЛрдб рд╣реИ:

class DESAdapter(HTTPAdapter):
    """
    A TransportAdapter that re-enables 3DES support in Requests.
    """
    def init_poolmanager(self, *args, **kwargs):
        context = create_urllib3_context(load_cert_chain='rtmqa-clientid.pem',password='weblogic')
        kwargs['ssl_context'] = context
        return super(DESAdapter, self).init_poolmanager(*args, **kwargs)

    def proxy_manager_for(self, *args, **kwargs):
        context = create_urllib3_context(load_cert_chain='rtmqa-clientid.pem', password='weblogic')
        kwargs['ssl_context'] = context
        return super(DESAdapter, self).proxy_manager_for(*args, **kwargs)
s = requests.Session()
s.mount(url, DESAdapter())
r = s.get(url, headers=request_header).json()

рдФрд░ рдореБрдЭреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ
рд▓реЗрдЦрди рддреНрд░реБрдЯрд┐: create_urllib3_context () рдХреЛ рдПрдХ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рддрд░реНрдХ 'load_cert_chain' рдорд┐рд▓рд╛

рдпрд╣ рдПрдХ рдЧрд▓рддреА рд╣реИ, рд╣рд╛рдБред рдЖрдк create_urllib3_context рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХрд╛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд▓реМрдЯрд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдкрд░ load_cert_chain рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдореЗрд░реЗ рдореИрдХ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд urllib3..util.ssl_.py рдореЗрдВ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдирд╡реАрдирддрдо рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдХреЛрдб рд╣реИ

    if certfile:
        context.load_cert_chain(certfile, keyfile)
    if HAS_SNI:  # Platform-specific: OpenSSL with enabled SNI
        return context.wrap_socket(sock, server_hostname=server_hostname)

рдкрд╛рд╕рд╡рд░реНрдб рд╡рд┐рдХрд▓реНрдк рдЧрд╛рдпрдм рд╣реИред рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ ssl_.py рдХреЛ рдХреИрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реВрдВ?

@ рдЕрдиреВрдкрдкрд┐рд▓реНрд▓рдИ рдЖрдк рдирд╣реАрдВред рдмрд┐рдирд╛ рддрд░реНрдХ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдлрд┐рд░ рд▓реМрдЯрд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдкрд░ load_cert_chain рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВред рдЖрдкрдХреЛ urllib3 рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

ctx = create_urllib3_context()
ctx.load_cert_chain(your_arguments_here)

рдЖрдЗрдП рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░реЗрдВ :)

@ erikbern рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/contrib/pyopenssl.py", line 441, in wrap_socket
    cnx.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/OpenSSL/SSL.py", line 1716, in do_handshake
    self._raise_ssl_error(self._ssl, result)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/OpenSSL/SSL.py", line 1456, in _raise_ssl_error
    _raise_current_error()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/OpenSSL/_util.py", line 54, in exception_from_error_queue
    raise exception_type(errors)
OpenSSL.SSL.Error: [('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')]

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/connectionpool.py", line 595, in urlopen
    self._prepare_proxy(conn)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/connectionpool.py", line 816, in _prepare_proxy
    conn.connect()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/connection.py", line 326, in connect
    ssl_context=context)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/util/ssl_.py", line 329, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/contrib/pyopenssl.py", line 448, in wrap_socket
    raise ssl.SSLError('bad handshake: %r' % e)
ssl.SSLError: ("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/adapters.py", line 440, in send
    timeout=timeout
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/connectionpool.py", line 639, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/util/retry.py", line 388, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='credit-cards-accounts-qa.kdc.capitalone.com', port=443): Max retries exceeded with url: /credit-cards-accounts/credit-cards/accounts/XqLuxBTABbIDvpw56ba34p2WV9JoWUSkPJ09hrBlWD8= (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",),))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/tsu892/Desktop/Office/Pythone-work/ASR-pythone/ASR-python3.6/test-request.py", line 48, in <module>
    r = requests.get(url, headers=request_header, cert=cert).json()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/api.py", line 72, in get
    return request('get', url, params=params, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/sessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/adapters.py", line 506, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='credit-cards-accounts-qa.kdc.capitalone.com', port=443): Max retries exceeded with url: /credit-cards-accounts/credit-cards/accounts/XqLuxBTABbIDvpw56ba34p2WV9JoWUSkPJ09hrBlWD8= (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",),))

рдиреАрдЪреЗ рдореЗрд░рд╛ рдХреЛрдб рд╣реИ:

import requests
import json
import OpenSSL.crypto
import tempfile
import os
import contextlib
import ssl

json_file='apiInput.json'
hdr_key=[]
hdr_value=[]
json_data=open(json_file)
data = json.load(json_data)
request_body={}
#pprint(data)
json_data.close()
request_data = data['request1']
request_header=request_data['header-data']
url=request_header['url']

@contextlib.contextmanager
def pfx_to_pem():
    print('inside pfx tp pem')
    with tempfile.NamedTemporaryFile(suffix='.pem') as t_pem:
        f_pem = open(t_pem.name, 'wb')
        fr_pfx = open('rtmqa-clientid.pfx', 'rb').read()
        p12 = OpenSSL.crypto.load_pkcs12(fr_pfx,'xxxxxxxxx')
        f_pem.write(OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, p12.get_privatekey()))
        f_pem.write(OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, p12.get_certificate()))
        ca = p12.get_ca_certificates()
        if ca is not None:
            for cert in ca:
                f_pem.write(OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, cert))
        f_pem.close()
        yield t_pem.name

with pfx_to_pem() as cert:
    print(cert)
    r = requests.get(url, headers=request_header, cert=cert).json()
print(r.status_code)
print(r.json())

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдпрд╣ рдЬрд╛рдирдирд╛ рдХрдард┐рди рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдХреНрдпреЛрдВ рдЯреВрдЯ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ

@ рд▓реБрдХрд╛рд╕рд╛ рдореИрдВрдиреЗ рдЙрд╕ рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди (рдиреАрдЪреЗ рдЪрд┐рдкрдХрд╛рдпрд╛ рдЧрдпрд╛ рдХреЛрдб) рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдФрд░ рдЙрд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реБрдЖ рдЬреЛ рдореБрдЭреЗ tempfile рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛ред

import requests
import json
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.ssl_ import create_urllib3_context

json_file='apiInput.json'
hdr_key=[]
hdr_value=[]
json_data=open(json_file)
data = json.load(json_data)
request_body={}
#pprint(data)
json_data.close()
request_data = data['request1']
request_header=request_data['header-data']
url=request_header['url']

class DESAdapter(HTTPAdapter):
    """
    A TransportAdapter that re-enables 3DES support in Requests.
    """
    def init_poolmanager(self, *args, **kwargs):
        context = create_urllib3_context()
        context.load_cert_chain('rtmqa-clientid.pem',password='weblogic')
        kwargs['ssl_context'] = context
        return super(DESAdapter, self).init_poolmanager(*args, **kwargs)

    def proxy_manager_for(self, *args, **kwargs):
        context = create_urllib3_context()
        context.load_cert_chain('rtmqa-clientid.pem',password='weblogic')
        kwargs['ssl_context'] = context
        return super(DESAdapter, self).proxy_manager_for(*args, **kwargs)

s = requests.Session()
s.headers=request_header
s.mount(url, DESAdapter())
r = s.get(url)
/Users/tsu892/Python3.6/bin/python /Users/tsu892/Desktop/Office/Pythone-work/ASR-pythone/ASR-python3.6/Test-ASRreq.py
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/contrib/pyopenssl.py", line 441, in wrap_socket
    cnx.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/OpenSSL/SSL.py", line 1716, in do_handshake
    self._raise_ssl_error(self._ssl, result)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/OpenSSL/SSL.py", line 1456, in _raise_ssl_error
    _raise_current_error()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/OpenSSL/_util.py", line 54, in exception_from_error_queue
    raise exception_type(errors)
OpenSSL.SSL.Error: [('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')]

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/connectionpool.py", line 595, in urlopen
    self._prepare_proxy(conn)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/connectionpool.py", line 816, in _prepare_proxy
    conn.connect()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/connection.py", line 326, in connect
    ssl_context=context)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/util/ssl_.py", line 329, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/contrib/pyopenssl.py", line 448, in wrap_socket
    raise ssl.SSLError('bad handshake: %r' % e)
ssl.SSLError: ("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/adapters.py", line 440, in send
    timeout=timeout
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/connectionpool.py", line 639, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/util/retry.py", line 388, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='credit-cards-accounts-qa.kdc.capitalone.com', port=443): Max retries exceeded with url: /credit-cards-accounts/credit-cards/accounts/XqLuxBTABbIDvpw56ba34p2WV9JoWUSkPJ09hrBlWD8= (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",),))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/tsu892/Desktop/Office/Pythone-work/ASR-pythone/ASR-python3.6/Test-ASRreq.py", line 37, in <module>
    r = s.get(url)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/sessions.py", line 521, in get
    return self.request('GET', url, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/sessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/adapters.py", line 506, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='credit-cards-accounts-qa.kdc.capitalone.com', port=443): Max retries exceeded with url: /credit-cards-accounts/credit-cards/accounts/XqLuxBTABbIDvpw56ba34p2WV9JoWUSkPJ09hrBlWD8= (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",),))

@erikbern рдпрд╣ рдореЗрд░реЗ рд▓реИрдкрдЯреЙрдк рдкрд░ рдПрдХ рд╕реЗрдЯрдЕрдк рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдореИрдВ рдПрдХ рдореИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдкрд╛рдЗрдереЛрди 3.6

6c40089ea258:~ tsu892$ pip3 show requests
Name: requests
Version: 2.18.4
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: [email protected]
License: Apache 2.0
Location: /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages
Requires: idna, certifi, chardet, urllib3
6c40089ea258:~ tsu892$ pip3 show certifi
Name: certifi
Version: 2017.7.27.1
Summary: Python package for providing Mozilla's CA Bundle.
Home-page: http://certifi.io/
Author: Kenneth Reitz
Author-email: [email protected]
License: MPL-2.0
Location: /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages
Requires: 

рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИ?

python -m requests.help рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХреНрдпрд╛ рд╣реИ?

@ рд▓реБрдХрд╛рд╕рд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ:

6c40089ea258:~ tsu892$ python3 -m requests.help?
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3: No module named requests.help?

рдХреГрдкрдпрд╛ рдЕрдкрдиреА рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рдкреНрд░рд╢реНрди рдЪрд┐рд╣реНрди рд╣рдЯрд╛ рджреЗрдВред

6c40089ea258:~ tsu892$ python3 -m requests.help
{
  "chardet": {
    "version": "3.0.4"
  },
  "cryptography": {
    "version": "2.0.3"
  },
  "idna": {
    "version": "2.6"
  },
  "implementation": {
    "name": "CPython",
    "version": "3.6.2"
  },
  "platform": {
    "release": "16.7.0",
    "system": "Darwin"
  },
  "pyOpenSSL": {
    "openssl_version": "1010006f",
    "version": "17.2.0"
  },
  "requests": {
    "version": "2.18.4"
  },
  "system_ssl": {
    "version": "100020bf"
  },
  "urllib3": {
    "version": "1.22"
  },
  "using_pyopenssl": true
}

рддреЛ рдЖрдкрдХреЛ рдЬреЛ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ рд╡рд╣ рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдЯреАрдПрд▓рдПрд╕ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реИред рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдФрд░ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рд╕рд╣реА рд▓рдЧрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдЧрд▓рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЖрдк рдХрд┐рд╕ рд╕рд░реНрд╡рд░ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреНрд▓рд╛рдЙрдб рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдкрд░ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рд╣рдо рдПрдкреАрдЖрдИ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдкрд╣рд▓реЗ рдУрдПрд╕рдмреА рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЕрдиреБрд░реЛрдз рдХреЛ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдХреЛ рд░реВрдЯ рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рдПрдХ рд╣реА рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдбрд╛рдХрд┐рдпрд╛ рдпрд╛ рдореЗрд░реЗ рд░реВрдмреА рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреАрдЖрдИ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдХреНрдпрд╛ рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдЖрдк рдореЗрд░реЗ рд▓рд┐рдП рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реЛрд╕реНрдЯ рдирд╛рдо рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдкрде рдХреЗ рдмрд┐рдирд╛ рд╣реЛрд╕реНрдЯ URL https://credit-cards-accounts-qa.kdc.capitalone.com рд╣реИ
рдпрд╣ рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╣реИ

рд╣рд╛рдБ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдХрд┐ рд╡рд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк openssl s_client -showcerts -connect credit-cards-accounts-qa.kdc.capitalone.com:443 рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреВрд░рд╛ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╣рдЯрд╛рдП рдЧрдП

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЙрд╕ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХрд╣рд╛рдБ рд╣реИ?

рдореИрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рджреГрд╢реНрдп рдХреЗ рдкреАрдЫреЗ рдХреЛрдИ рд░реВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

рд╣рд╛рдБ, Chrome рдХреЗ рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓ рдЖрдкрдХреЛ рдЙрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд░рд╣реА рдкреВрд░реНрдг рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдВрдЧреЗред

рдЖрдк рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдСрдирд▓рд╛рдЗрди рдкреЛрд╕реНрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ...

@erikbern рдпрд╣ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реВрдЪрдирд╛ рд╣реИред рдЖрдк рд╕рдорд╛рди рдЖрджреЗрд╢ рдЪрд▓рд╛рдХрд░ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@SethMichaelLarson @erikbern рдХреЗ GitHub рдкреНрд░реЛрдлрд╛рдЗрд▓ "рдЪреАрдл рдЯреНрд░реЛрд▓ рдСрдлрд┐рд╕рд░" рд╕реЗред рд╢рд╛рдпрдж рд╡реЗ рд╕рд┐рд░реНрдл рдЯреНрд░реЛрд▓рд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рдереЗ?

@erikbern @sigmavirus24 рдЖрд╣! рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдореИрдВ рдХрд┐рд╕рд╕реЗ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЖрдЧреЗ рдмрдврд╝рдирд╛! рдореИрдВ

рдЬрдм рдореИрдВ рдбрд╛рдХрд┐рдпрд╛ рд╕реЗ рджреМрдбрд╝рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ sha-1 рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ Pycharm рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ

рдпрджрд┐ рдЖрдк рд╕рдЪрдореБрдЪ рдХреНрд░реЛрдо рдореЗрдВ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@SethMichaelLarson рдХрд┐рд╕ рдХрдорд╛рдВрдб рдХреЛ рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реИ? FYI рдХрд░реЗрдВ рдЕрдм рдЯрд┐рдкреНрдкрдгреА рд╣рдЯрд╛ рджреА рдЧрдИ рд╣реИ рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдпрд╣рд╛рдВ рдПрдХ рд╕рдВрдкреВрд░реНрдг BEGIN CERTIFICATE рдмреНрд▓реЙрдм рдерд╛ ... afaik рдЖрдк рдЗрд╕реЗ рдСрдирд▓рд╛рдЗрди рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

@erikbern рд╡рд╣

рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдбреЗрдЯрд╛ рд╣реИрдВ; рд╡реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рдпрд╛рд╕ рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╕рд╛рджреЗ рдкрд╛рда рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

рдореИрдВ рдкреНрд░рдорд╛рдгрд┐рдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЧрдпрд╛ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ Sha-1 рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдФрд░ .Pem рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдорд┐рд▓рд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ API рдХреЛ рд╣рд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

@AnoopPillai рдореБрдЭреЗ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб 1 рд╕рд┐рддрдВрдмрд░ рд╕реЗ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдкреЗрдо рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣реЛрд╕реНрдЯ рдирд┐рдпрдорд┐рдд рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред @ рд▓реБрдХрд╛рд╕рд╛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

рдореБрдЭреЗ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЕрднреА рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдЖ рд░рд╣реА рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ Temp рдлрд╝рд╛рдЗрд▓ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рднреАред рдореИрдВ Google рдкреЛрд╕реНрдЯрдореИрди рдореЗрдВ .pfx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ (рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЕрдкрдиреЗ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдХрд╛рдо рдкрддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдкрд╛рдпрдерди рдХреЗ рд╕рд╛рде 401 рдорд┐рд▓ рд░рд╣реЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЬрд┐рд╕ рдХрдВрдкрдиреА рдХреЗ рд╕рд╛рде рдореИрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рдмрд╣реБрдд рдорджрдж рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ - рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд╕рдорд╕реНрдпрд╛ рдирд┐рд╡рд╛рд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реБрдЭрд╛рд╡ рд╣реИ?

рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реВрдВ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрд╣рд╛рдВ рджреЗрдЦрдирд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧ Temp рдлрд╝рд╛рдЗрд▓ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рдлрд▓рддрд╛ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдореИрдВрдиреЗ рдЕрднреА рднреА рдЙрдирдХреА рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдкреНрд░рдмрдВрдзрди рдЯреАрдо рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реИред

рдХрд┐рд╕реА рднреА рд╕рд▓рд╛рд╣ рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреА - рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдзрдиреНрдпрд╡рд╛рдж :)

рдмрд╕ рдПрдХ рд╕реБрдЭрд╛рд╡, рдХреНрдпрд╛ рдЖрдкрдиреЗ PFX рдХреЛ PEM рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА? рд╕рд╛рде рд╣реА, рдпрджрд┐ рд╕рд░реНрд╡рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо/рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ auth=() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд/рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдореИрдВ рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд PEM рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЕрдм рдХрдИ рд╣рдлреНрддреЛрдВ рд╕реЗ рдЙрдкрд░реЛрдХреНрдд class DESAdapter(HTTPAdapter) рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

@ideasean рдЕрднреА рднреА рдЕрдорд╛рдиреНрдп рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ temp рдлрд╝рд╛рдЗрд▓ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗ рдЧрдП pfx_to_pem рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЬреЗрдирд░реЗрдЯ рдХреА рдЧрдИ .pem рдлрд╝рд╛рдЗрд▓ рдкрд░ load_cert_chain рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣реИ рдирд╛? рдЗрд╕рдореЗрдВ рдирд┐рдЬреА рдХреБрдВрдЬреА рдФрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╣реИред

рдЪреВрдВрдХрд┐ .pfx рдкреЛрд╕реНрдЯрдореИрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдпрд╣рд╛рдВ рдкреНрд░рдорд╛рдгрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд░реВрдкрд╛рдВрддрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ?

рдореИрдВрдиреЗ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ DESAdapter рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреВрдкрдкрд┐рд▓реНрд▓рдИ рдХреА рдкреЛрд╕реНрдЯ рдореЗрдВ рд╕рд┐рддрдВрдмрд░ 1 рдХреЛ рдКрдкрд░ рд╕реЗ рд╢реБрд░реВ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ -

рдореИрдВрдиреЗ рдЙрд╕ рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди (рдиреАрдЪреЗ рдЪрд┐рдкрдХрд╛рдпрд╛ рдЧрдпрд╛ рдХреЛрдб) рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдФрд░ рдЙрд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реБрдЖ рдЬреЛ рдореБрдЭреЗ tempfile рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛ред

рдореИрдВ рд░реВрдкрд╛рдВрддрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд░реАрдХреНрд╖рдг рдкреЛрд╕реНрдЯрдореИрди рдХреЗ рд╕рд╛рде рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдкреЗрдо рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реИ?

рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдЙрдкрд░реЛрдХреНрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реА рдкреЗрдо рдлрд╝рд╛рдЗрд▓ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб/рдкрд╛рд╕рд╡рд░реНрдб рд╕рдВрд░рдХреНрд╖рд┐рдд рдереА, рдФрд░ рдкрд╛рдЗрдерди рдЕрдиреБрд░реЛрдз рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХрд╛ рдкреАрдИрдПрдо рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдкреНрд░рддрд┐ рд▓рд┐рдВрдХ рдореВрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рд▓реЗрдХрд┐рди рддрдм рдЖрдкрдХреЗ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдПрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╣реЛрдЧрд╛)ред

@ideasean рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ .pfx рдХреЛ рддреЛрдбрд╝рд╛ рдФрд░ рдмреИрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рд╕рд╛рде рдПрдХ .pem рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдмреИрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рдПрдХ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдХ .pem рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХреАред

рдЕрднреА рднреА рдЕрдорд╛рдиреНрдп рдкреНрд░рдорд╛рдг-рдкрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдкреЛрд╕реНрдЯрдореИрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░реНрдЯ рдбрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ рдФрд░ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╡реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭ рд╕рдХрддрд╛ рдХрд┐ рдореИрдВ рдЗрд╕ .pfx рдХреЛ рдареАрдХ рд╕реЗ рдЕрдирдкреИрдХ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рдХреНрдпреЛрдВ рд╣реВрдВ

рдореИрдВрдиреЗ рдУрдкрдирдПрд╕рдПрд▓ рдХрдорд╛рдВрдб openssl pkcs12 -in <my_pfx>.pfx -out certificate.cer -nodes рдХреА рднреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдпрд╣ рдЕрднреА рднреА рдореБрдЭреЗ 401 рддреНрд░реБрдЯрд┐ рджреЗ рд░рд╣рд╛ рд╣реИ рдЬрдм рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдмрджрд▓рддрд╛ рд╣реВрдВ: context.load_cert_chain('certificate.cer')

рдореИрдВрдиреЗ рдЙрдкрд░реНрдпреБрдХреНрдд .cer рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЬрдм рдореИрдВ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдкреЛрд╕реНрдЯрдореИрди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИ (рдкреЙрдкрдЕрдк рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬрдм рдпрд╣ .pfx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ), рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдЙрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЪреВрдВрдХрд┐ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдХреЛрдИ "рдкреНрд░рдорд╛рдгрдкрддреНрд░" рдкреИрдирд▓ рдирд╣реАрдВ рд╣реИ рдЬреИрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣рд╛рдВ рд╣реИред

рдЖрдк рдкреЛрд╕реНрдЯрдореИрди рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдкреИрдирд▓, рдПрд╕рдПрд╕рдПрд▓ рд╕рддреНрдпрд╛рдкрди рдЕрдХреНрд╖рдо рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реЗрдЯрд┐рдВрдЧ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рд╖рдп рдкрд░ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╡рд┐рд╖рдп рд╕реЗ рдереЛрдбрд╝рд╛ рд╣рдЯрдХрд░ рд╣реИрдВред

@ mkane848 рдиреЗ рдЖрдкрдХреА рдореВрд▓ рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреА рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ ValueError: String expected ред рдЖрдк https://github.com/pyca/pyopenssl/issues/701 рдФрд░ https://github.com/shazow/urllib3/issues/1275 рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдирд┐рдЬреА рдкреЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

from requests.adapters import HTTPAdapter

from urllib3.util.ssl_ import create_urllib3_context

class SSLAdapter(HTTPAdapter):
    def __init__(self, certfile, keyfile, password=None, *args, **kwargs):
        self._certfile = certfile
        self._keyfile = keyfile
        self._password = password
        return super(self.__class__, self).__init__(*args, **kwargs)

    def init_poolmanager(self, *args, **kwargs):
        self._add_ssl_context(kwargs)
        return super(self.__class__, self).init_poolmanager(*args, **kwargs)

    def proxy_manager_for(self, *args, **kwargs):
        self._add_ssl_context(kwargs)
        return super(self.__class__, self).proxy_manager_for(*args, **kwargs)

    def _add_ssl_context(self, kwargs):
        context = create_urllib3_context()
        context.load_cert_chain(certfile=self._certfile,
                                keyfile=self._keyfile,
                                password=str(self._password))
        kwargs['ssl_context'] = context

рдЖрдкрдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрднреА рдПрдХ рдЕрд▓рдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ requests рд▓рд┐рдП PKCS#12 рд╕рдорд░реНрдерди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ:

рдХреЛрдб рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ : рдпрд╣ рди рддреЛ рдмрдВрджрд░ рдкреИрдЪрд┐рдВрдЧ рдФрд░ рди рд╣реА рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рдХрд╕реНрдЯрдо TransportAdapter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдХрд╕реНрдЯрдо SSLContext рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рд╕реБрдзрд╛рд░ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!

рдмреЗрд╢рдХ, рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ requests рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реАрдзреЗ рдкреНрд░рджрд╛рди рдХрд░реЗ, рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рд╣рдо рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд╣реИрдВ, рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рджрд░реНрдж рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ред

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд░ рд╕рдХреЗрдВ:

~~~
cert=("cert.pem", "key.pem", "somepassphrase") # рдЕрд▓рдЧ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ/рдХреБрдВрдЬреА

cert=("keycert.pem", None, "somepassphrase")    # combined cert/key

~~~

... рднрд▓реЗ рд╣реА рдпрд╣ рдХреЗрд╡рд▓ рдЕрдЬрдЧрд░ 3.3+ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реЛред рдпрд╣ рдПрдкреАрдЖрдИ рд╕рддрд╣ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдорд╛рдореВрд▓реА рдЬреЛрдбрд╝ рд╣реЛрдЧрд╛ред

AFAICS, рдЗрд╕рдХрд╛ рдорддрд▓рдм urllib3 рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ HTTPSConnection рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ password рддрд░реНрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗ; рдЗрд╕реЗ ssl_wrap_socket рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:

~рдЕрдЧрд░ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ:рдпрджрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛрдИ рдирд╣реАрдВ рд╣реИ:рд╕рдВрджрд░реНрдн.рд▓реЛрдб_рд╕рд░реНрдЯ_рдЪреЗрди (рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ, рдХреАрдлрд╛рдЗрд▓, рдкрд╛рд╕рд╡рд░реНрдб)рдЕрдиреНрдпрдерд╛:рд╕рдВрджрд░реНрдн.рд▓реЛрдб_рд╕рд░реНрдЯ_рдЪреЗрди (рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ, рдХреАрдлрд╛рдЗрд▓)~

рддрдм рдпрд╣ рдкреАрдЫреЗ рдХреА рдУрд░-рд╕рдВрдЧрдд рд╣реЛрдЧрд╛, рдХреЗрд╡рд▓ рдПрдХ рдЕрдкрд╡рд╛рдж рдЙрдард╛рдирд╛ рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдкреБрд░рд╛рдиреЗ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдирд┐рдЬреА рдХреБрдВрдЬреА рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ contrib/pyopenssl.py рдПрдбреЗрдкреНрдЯрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдХрд╛ load_cert_chain , рдФрд░ рдРрд╕рд╛ рд╣реА рдЕрдЬрдЧрд░ 2.7 рдХрд░рддрд╛ рд╣реИред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛: рдореИрдВ "рдЧреБрдкреНрдд" рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдХреЗрдПрдордПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреЗрдПрдордПрд╕ рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХреБрдВрдЬреА рдкрд╛рд╕рд╡рд░реНрдб рд▓реЛрдб рдХрд░реВрдВрдЧрд╛, рди рдХрд┐ рдЗрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╣рд╛рд░реНрдб-рдХреЛрдбред

рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рдЦрд┐рд▓рд╛рдл рдирд╣реАрдВ рд░рд╣реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмреЛрд░реНрдб рднрд░ рдореЗрдВ рдХрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рдХрд░реЗрдЧрд╛ред

@sigmavirus24 рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

@candlerb @kennethreitz рдХреНрдпрд╛ PKCS#12 рдорд╛рдорд▓реЗ рдХреЛ рдЙрд╕ API рдореЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛрдЧрд╛?

cert=('keycert.p12', None, 'somepassphrase')

рдЕрдВрддрд░ рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди ( *.p12 рдмрдирд╛рдо *.pem ) рджреНрд╡рд╛рд░рд╛ рдпрд╛ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкрд╣рд▓реЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рджреЗрдЦрдХрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ pkcs#12 рд▓реЗрдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдФрд░ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЬреЛ рдирд┐рдХрд╛рд▓реА рдЧрдИ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЛ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред

рдкрд╛рдпрдерди рдкреАрдХреЗрд╕реАрдПрд╕ # 12 рдХреЗ рд▓рд┐рдП рдЧреБрдЧрд▓рд┐рдВрдЧ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ:

  • рдХрд┐рд╕реА рдХрд╛ рдХреЛрдб рдЬреЛ рдирд┐рдЬреА рдХреБрдВрдЬреА рд▓рд┐рдЦрддрд╛ рд╣реИ
  • рдХреБрдЫ рдЕрдиреНрдп рдХреЛрдб рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ pkcs#12 рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП pyOpenSSL рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдФрд░ рдХреБрдВрдЬреА рдХреЛ рдбреЗрдЯрд╛ рдЖрдЗрдЯрдо рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рддреЛ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реБрдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЪреАрдЬреЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЬрд░реВрд░реА рд╣реЛрдЧрд╛ рдХрд┐ рдХреБрдВрдЬреА/рдкреНрд░рдорд╛рдг рд╕реНрд╡рдпрдВ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреЛ рдкрд╛рд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП, рди рдХрд┐ рдЙрди рдЪреАрдЬреЛрдВ рд╡рд╛рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдирд╛рдоред рдпрд╣ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рд▓рдЧрддрд╛ рд╣реИред

рдпрджрд┐ рдпрд╣ рдмрд╣реБрдд рдХрдард┐рди рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рд╕реАрдзрд╛ рд╕рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ pkcs#12 рдХреЛ PEM рдСрдл-рд▓рд╛рдЗрди рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рдмрд╣реБрдд рд╕реАрдзрд╛ рд╣реИ (рдФрд░ рдЗрд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

@candlerb рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛ (https://github.com/requests/requests/issues/1573#issuecomment-348968658), рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ requests рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдПрдХреАрдХреГрдд рд╣реИред

рддреЛ рдЖрдк рдЬрд┐рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡реЗ рдкрд╣рд▓реЗ рд╣реА рд╣рд▓ рд╣реЛ рдЪреБрдХреА рд╣реИрдВред

рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рджреВрд░ рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирдП pkcs12_* рдХреАрд╡рд░реНрдб рддрд░реНрдХ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп cert рдХреАрд╡рд░реНрдб рддрд░реНрдХ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдореЗрд░рд╛ рдкреНрд░рд╢реНрди рд╣реИ:

  • рдХреНрдпрд╛ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛрдЧрд╛?
  • рдХреНрдпрд╛ рдореЗрд░рд╛ рдареЛрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ cert=('keycert.p12', None, 'somepassphrase') рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛрдЧрд╛?
  • рд╣рдореЗрдВ PKCS#12 рдФрд░ PEM рдореЗрдВ рдХреИрд╕реЗ рдЕрдВрддрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? (рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдкреНрд░рддреНрдпрдп, рдпрд╛ рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА рджреНрд╡рд╛рд░рд╛?)

(рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреА рдЕрд▓рдЧ requests_pkcs12 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрдЬрд╛рдп requests рдореЗрдВ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рдореБрджреНрджреЗ рдХреА рдЙрдореНрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рдмрд╣реБрдд рдХрдо рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЬрд▓реНрдж рд╣реА рдКрдкрд░ рдХреА рдУрд░ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ , рдЕрдЧрд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдареЛрд╕ рдмрдпрд╛рди рдерд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЪрд╛рд╣рд┐рдП, рддреЛ рд╢рд╛рдпрдж рдореИрдВ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рддрджрдиреБрд╕рд╛рд░ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред)

рддреЛ, рдХреБрдЫ рдмрд╛рддреЗрдВ:

  1. рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдкреНрд░рдорд╛рдгрд┐рдд рдХреАрд╡рд░реНрдб рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдбреЗрдЯрд╛ рд╣реИ рдФрд░ рд▓реЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА files рдХреАрд╡рд░реНрдб рдореЗрдВ tuples рджреНрд╡рд╛рд░рд╛ рднреНрд░рдорд┐рдд рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЬреНрдЮрд╛рдд-рдмреБрд░реЗ рдкреИрдЯрд░реНрди рдХреЛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╣реИред

  2. рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХреБрдЫ рднреА, pkcs12 рдПрдбреЗрдкреНрдЯрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЕрдиреБрд░реЛрдз-рдЯреВрд▓рдмреЗрд▓реНрдЯ рдореЗрдВ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ рд╡рд╕реНрддреБ рдкрд░ рд╕реНрдореГрддрд┐ рдореЗрдВ pkcs12 рдкрд╛рд╕рд╡рд░реНрдб рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп ssl_context рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рднреА рдЕрдиреНрдп рдХрд╛рдо рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрднрд╛рд▓ рд╕рдХреЗрдВ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рдЕрдиреБрд░реЛрдз 3.0 рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдПрдкреАрдЖрдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред

@sigmavirus24 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

  1. рдареАрдХ рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рдЕрд▓рдЧ pkcs12_* рдХреАрд╡рд░реНрдб рд░рдЦрддреЗ рд╣реИрдВред
  2. рд╣рд╛рдВ, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдореИрдВрдиреЗ рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рдЯреНрд░реИрдХрд░ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрдирд╛рдИ: https://github.com/m-click/requests_pkcs12/issues/2

PKCS#12 TransportAdapter рд╡рд░реНрдЧ рдХреЛ requests рдХреИрд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдХреНрдпрд╛ рдЙрд╕ рд╡рд░реНрдЧ рдХреЛ рдХреЗрд╡рд▓ requests рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╛ рдЗрд╕реЗ "рдЧрд╣рд░реЗ" рд╕реНрддрд░ рдкрд░ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рдирд╛ рдХрд┐рд╕реА request()/get()/... рд░реИрдкрд░ рдХреЗ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЕрдиреБрдХреВрд▓рдХ?

рдореЗрд░реЗ рд╕рдВрдЧрдарди рдХреЛ PKCS12 рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╣ рдЖрдкрдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред .p12 рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ .pem рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬреЛрдЦрд┐рдо рд╡рд╛рд▓рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрджрдо рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд ssl_context рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдФрд░ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА рдЯреАрдо рдпрд╣ рдорд╛рдирдиреЗ рдХреЛ рддреИрдпрд╛рд░ рд╣реЛрдЧреА рдХрд┐ рдЗрд╕реЗ рдареАрдХ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?

рдмрд╕ рдПрдХ рддреНрд╡рд░рд┐рдд рдЕрдиреБрд╕реНрдорд╛рд░рдХ: рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ: https://github.com/m-click/requests_pkcs12

рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЗрд╕реЗ рдкреБрди: рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред

рд░рд╛рд╕реНрддреЗ рдореЗрдВ, рдЖрдк рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ: ssl_context рдХреЛ рдкреВрд░реЗ рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдореЗрдВ рдирд╣реАрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣реЛ рд╕рдХреЗ, рдХреЗрд╡рд▓ рдПрдХ рджрд┐рдП рдЧрдП рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдПред рдпрд╣ рд╕рднреА рджреЗрдЦреЗрдВ:

рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ https://github.com/m-click/requests_pkcs12 рдкрд░ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рддрд░рд╣, рд╡реЗ рд╕рднреА рд▓реЛрдЧ рдЬреЛ рдЕрднреА requests_pkcs12 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рд╕реБрдзрд╛рд░ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗ, рдмрд┐рдирд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП (рддрдм рдмреЗрд╣рддрд░) рдирдП рдПрдкреАрдЖрдИ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдП рдмрд┐рдирд╛ред

рд╣рд╛рдБ, https://github.com/m-click/requests_pkcs12 рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рдареАрдХ рд╡рд╣реА рдХрд┐рдпрд╛ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж @рд╡реЛрдЧ ! рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдз рдЕрдВрддрддрдГ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред

рдореИрдВ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП @vog рдХреЛ рднреА рдзрдиреНрдпрд╡рд╛рдж рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ S3 рдЬреИрд╕реЗ рдЧреИрд░-рд╕реБрд░рдХреНрд╖рд┐рдд рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ requests рддрдХ рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

eromoe picture eromoe  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

avinassh picture avinassh  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

brainwane picture brainwane  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

xsren picture xsren  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ReimarBauer picture ReimarBauer  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ