Python3處理HTTPS請求 SSL證書驗證

Python3處理HTTPS請求 SSL證書驗證html

金融類的公司網站通常都是https 開頭的網站,urllib.request能夠爲 HTTPS 請求驗證SSL證書,就像web瀏覽器同樣,若是網站的SSL證書是通過CA認證的,則可以正常訪問,如:web

  1. 平安好夥伴出單系統:https://icore-pts.pingan.com.cn/ebusiness/login.jsp
  2. 浙商保險出單系統:https://core.zsins.com/pcis//core/main.jsp

例子一:編寫一個https請求程序訪問(平安好夥伴出單系統)瀏覽器

from urllib import parse安全

import urllib.request服務器

 

url = 'https://icore-pts.pingan.com.cn/ebusiness/login.jsp'jsp

headers ={網站

"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",url

}操作系統

# url 做爲Request()方法的參數,構造並返回一個Request對象code

request = urllib.request.Request(url,headers=headers)

# Request對象做爲urlopen()方法的參數,發送給服務器並接收響應

response = urllib.request.urlopen(request)

html = response.read().decode('utf-8')

print(html)

經過例子,是能夠正常訪問的,由於網站的SSL證書是通過CA認證的。

若是SSL證書驗證不經過,或者操做系統不信任服務器的安全證書,好比瀏覽器在訪問12306網站如:https://www.12306.cn/mormhweb/的時候,會警告用戶證書不受信任。(聽說 12306 網站證書是本身作的,沒有經過CA認證)

例子二:編寫一個https請求程序訪問(12306網站)

 

from urllib import parse

import urllib.request

 

url = 'https://www.12306.cn/mormhweb/'

headers ={

"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",

}

# url 做爲Request()方法的參數,構造並返回一個Request對象

request = urllib.request.Request(url,headers=headers)

# Request對象做爲urlopen()方法的參數,發送給服務器並接收響應

response = urllib.request.urlopen(request)

html = response.read().decode('utf-8')

print(html)

 

運行結果:

運行報錯:ssl.CertificateError: hostname 'www.12306.cn' doesn't match either of 'webssl.chinanetcenter.com'

 

經過查看urllib.request庫源碼文件

若是網站的SSL證書是通過CA認證,就須要單獨處理SSL證書,讓程序忽略SSL證書驗證錯誤,便可正常訪問。

 

例子三:12306網站或略SSL證書驗證

 

from urllib import parse

import urllib.request

# 1. 導入Python SSL處理模塊

import ssl

 

# 2. 表示忽略未經覈實的SSL證書認證

context = ssl._create_unverified_context()

 

url = 'https://www.12306.cn/mormhweb/'

headers ={

"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",

}

# url 做爲Request()方法的參數,構造並返回一個Request對象

request = urllib.request.Request(url,headers=headers)

# Request對象做爲urlopen()方法的參數,發送給服務器並接收響應

# 3. 在urlopen()方法裏 指明添加 context 參數

response = urllib.request.urlopen(request,context = context)

html = response.read().decode('utf-8')

print(html)

 

運行結果:

經過例子,證實咱們的處理是成功的。

相關文章
相關標籤/搜索