Python使用SSL版本3请求lib

时间:2016-01-21 17:12:26

标签: python django ssl https

我尝试使用python请求lib访问SOAP服务器,我发现了这个问题

  

[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败(_ssl.c:600)

一切都是正确的,使用在PHP中编写的类似应用程序中使用的相同url,证书和标头,工作正常,除了在python中我没有设置SSL版本,我想知道什么可能是我的代码错了

header = {
    'Content-Type': 'application/soap+xml;charset=utf-8',
    'SOAPAction': '"nfeConsultaNF2"',
    'Content-length': len(requisicao)
}    
chave = "43160189823918000144550020000200401010200408"
requisicao = '<?xml version="1.0" encoding="utf-8"?><soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"><soap12:Header><nfeCabecMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeConsulta2"><cUF>43</cUF><versaoDados>3.10</versaoDados></nfeCabecMsg></soap12:Header><soap12:Body><nfeDadosMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeConsulta2"><consSitNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="3.10"><tpAmb>1</tpAmb><xServ>CONSULTAR</xServ><chNFe>'+chave+'</chNFe></consSitNFe></nfeDadosMsg></soap12:Body></soap12:Envelope>';

s = requests.session()
s.mount(url.web_url,Ssl3HttpAdapter())

response = s.post(
    "https://nfe.sefazrs.rs.gov.br/ws/NfeConsulta/NfeConsulta2.asmx",
    data=requisicao,
    headers=header,
    cert=("C:\\xampp\htdocs\consultar\cert.pem","C:\\xampp\htdocs\consultar\priv.pem")
)

Ssl3Adapter由此类

定义
class Ssl3HttpAdapter(HTTPAdapter):
""""Transport adapter" that allows us to use SSLv3."""

def init_poolmanager(self, connections, maxsize, block=False):
    self.poolmanager = PoolManager(num_pools=connections,
                                   maxsize=maxsize,
                                   block=block,
                                   ssl_version=ssl.PROTOCOL_SSLv3)

有什么建议吗? PS。我无法提供我的证书

1 个答案:

答案 0 :(得分:1)

  

[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败(_ssl.c:600)

证书无法通过python验证,其他人无法验证,您可以在this report from SSLLabs中看到。

  

PHP,工作正常,..

PHP明确信任的证书或其颁发者,或者您使用的是较旧版本的PHP,默认情况下不会验证证书,因此验证不会失败。

  

SSL_VERSION = ssl.PROTOCOL_SSLv3)

此服务器实际上支持TLS 1.0(但不支持TLS 1.1或TLS 1.2),正如您可以从SSLLabs的报告中看到的那样。因此,不需要将版本限制为SSL 3.0。