HTTPS Connection Python
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.
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
usando
class httplib.HTTPSConnection
http://docs.python.org/library/httplib.html#httplib.httpsconnection
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!