Pergunta

Estou tentando verificar se o destino expõe um serviço da Web HTTPS. Eu tenho código para conectar via HTTP, mas não tenho certeza de como me conectar via HTTPS. Eu li você usa SSL, mas também li que ele não suportou erros de certificado. O código que tenho é dos documentos Python:

import httplib
conn = httplib.HTTPConnection("www.python.org")
conn.request("GET", "/index.html")
r1 = conn.getresponse()
print r1.status, r1.reason

Alguém sabe como se conectar ao HTTPS?

Eu já experimentei o HTTPSCONENCTION, mas ele responde com um código de erro que afirma que o HTTPLIB não possui o atributo httpSceNcnection. Eu também não tenho soquete.SSL disponível.

Eu instalei o Python 2.6.4 e não acho que tenha suporte SSL compilado. Existe uma maneira de integrar essa suposição no python mais recente sem precisar instalá -lo novamente.

Eu instalei OpenSSL e PyoPenssl e tentei o código abaixo de uma das respostas:

import urllib2
from OpenSSL import SSL
try: 
    response = urllib2.urlopen('https://example.com')  
    print 'response headers: "%s"' % response.info() 
except IOError, e: 
    if hasattr(e, 'code'): # HTTPError 
        print 'http error code: ', e.code 
    elif hasattr(e, 'reason'): # URLError 
        print "can't connect, reason: ", e.reason 
    else: 
        raise

Eu tenho um erro:

    Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 87, in urlopen
    return opener.open(url)
  File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 203, in open
    return self.open_unknown(fullurl, data)
  File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 215, in open_unknown
    raise IOError, ('url error', 'unknown url type', type)
IOError: [Errno url error] unknown url type: 'https'

Alguém sabe como fazer isso funcionar?

-- UPDATE

Eu descobri qual era o problema, a versão Python que eu estava usando não tinha suporte para o SSL. Eu encontrei esta solução atualmente em: http://www.webtop.com.au/compiling-python-with-sl-support.

O código agora funcionará após esta solução, o que é muito bom. Quando eu importo SSL e HttpSConnection, sei, não receba um erro.

Obrigado pela ajuda a todos.

Foi útil?

Solução

Python 2.x: docs.python.org/2/library/httplib.html:

NOTA: O suporte HTTPS está disponível apenas se o módulo de soquete foi compilado com o suporte SSL.

Python 3.x: docs.python.org/3/library/http.client.html:

Nota O suporte HTTPS está disponível apenas se o Python foi compilado com o suporte SSL (através do módulo SSL).

#!/usr/bin/env python

import httplib
c = httplib.HTTPSConnection("ccc.de")
c.request("GET", "/")
response = c.getresponse()
print response.status, response.reason
data = response.read()
print data
# => 
# 200 OK
# <!DOCTYPE html ....

Para verificar se o SSL está ativado, tente:

>>> import socket
>>> socket.ssl
<function ssl at 0x4038b0>

Outras dicas

Para verificar Suporte SSL no Python 2.6+:

try:
    import ssl
except ImportError:
    print "error: no ssl support"

Para conectar -se via https:

import urllib2

try:
    response = urllib2.urlopen('https://example.com') 
    print 'response headers: "%s"' % response.info()
except IOError, e:
    if hasattr(e, 'code'): # HTTPError
        print 'http error code: ', e.code
    elif hasattr(e, 'reason'): # URLError
        print "can't connect, reason: ", e.reason
    else:
        raise
import requests
r = requests.get("https://stackoverflow.com") 
data = r.content  # Content of response

print r.status_code  # Status code of response
print data

Por que você não experimentou httplib.httpsconnection? Ele não faz validação SSL, mas isso não é necessário para conectar -se ao HTTPS. Seu código funciona bem com a conexão HTTPS:

>>> import httplib
>>> conn = httplib.HTTPSConnection("mail.google.com")
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
200 OK

Se estiver usando httplib.httpsconnection:

Por favor, dê uma olhada em: Alterado na versão 2.7.9:

Esta classe agora executa todos os certificados necessários e verificações de nome do host por padrão. Para reverter para o comportamento anterior, não verificado, SSL._Create_Unverifed_Context () pode ser passado para o parâmetro de contexto. Você pode usar:

if hasattr(ssl, '_create_unverified_context'):
            ssl._create_default_https_context = ssl._create_unverified_context

Supondo que o suporte SSL esteja ativado para o socket módulo.

connection1 = httplib.HTTPSConnection('www.somesecuresite.com')

Eu tinha algum código que estava falhando com um HTTPConnection (MOVED_PERMANENTLY error), mas assim que eu mudei para HTTPS Funcionou perfeitamente novamente, sem outras mudanças necessárias. Essa é uma correção muito simples!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top