Python 開啟ssl證書校驗

2022-09-20 11:39:10 字數 4356 閱讀 8247

python- ssl文件:

有啥不懂,看文件唄

1、主要方法介紹

sslcontext.load_cert_chain(certfile, keyfile=none, password=none):

"""載入私鑰和相應的證書。證書檔案字串必須是pem格式的單個檔案的路徑,其中包含證書以及建立證書真實性所需的任何數量的ca證書。

如果存在keyfile字串,則必須指向包含中私鑰的檔案。否則,私鑰也將從證書檔案中獲取。

password引數可以是乙個要呼叫的函式,以獲取用於解密私鑰的密碼。只有在私鑰已加密並且需要密碼時,才會呼叫它。

它將在沒有引數的情況下呼叫,並且它應該返回字串、位元組或位元組陣列。如果返回值是字串,在使用它解密金鑰之前,它將被編碼為utf-8。或者,字串、位元組或位元組陣列值可以直接作為密碼引數提供。

如果私鑰未加密,且不需要密碼,則將忽略此金鑰。

如果未指定password引數,並且需要密碼,則將使用openssl內建的密碼提示機制以互動方式提示使用者輸入密碼。

如果私鑰與證書不匹配,將引發sslerror。

"""sslcontext.load_verify_locations(cafile=none, capath=none, cadata=none):

"""載入一組「證書頒發機構」(ca)證書,用於在驗證模式不是cert_none時驗證其他對等體的證書。cafile和capath必須至少指定乙個。

此方法還可以載入pem或der格式的證書撤銷列表(crl)。為了使用crl,必須正確配置sslcontext.verify_flags。

cafile字串(如果存在)是pem格式的級聯ca證書檔案的路徑。有關如何在此檔案中安排證書的更多資訊,請參閱證書的討論。

capath字串(如果存在)是指向包含多個pem格式ca證書的目錄的路徑,遵循openssl特定布局。

cadata物件(如果存在)是乙個或多個pem編碼證書的ascii字串,或der編碼證書的類似位元組的物件。與capath一樣,pem編碼證書周圍的額外行將被忽略,但必須至少存在乙個證書。

"""sslcontext.get_ca_certs(binary_form=false):

"""獲取載入的「證書頒發機構」(ca)證書的列表。

如果二進位制形式引數為false,則每個列表條目都是乙個dict,就像sslsocket.getpeercert()的輸出一樣。

否則,該方法返回der編碼的證書列表。返回的列表不包含來自capath的證書,除非證書是由ssl連線請求和載入的。

"""sslcontext.set_ciphers(ciphers):

"""為使用此上下文建立的套接字設定可用密碼。它應該是openssl密碼列**式的字串。

如果無法選擇密碼(因為編譯時選項或其他配置禁止使用所有指定的密碼),將引發sslerror。

"""

2、主要模式介紹

ssl上下文

classssl.sslcontext(protocol=none

)建立新的ssl上下文。您可以傳遞協議,該協議必須是本模組中定義的協議常數之一。該引數指定要使用的ssl協議版本。通常,伺服器選擇特定的協議版本,客戶端必須適應伺服器的選擇。大多數版本都無法與其他版本互操作。如果未指定,則預設為protocol_tls;它與其他版本的相容性最好。

下面的**顯示了客戶端(下方)中的哪些版本可以連線到伺服器(頂部)中的哪些版本:

client /server

sslv2

sslv3

tls3

tlsv1

tlsv1.1

tlsv1.2

sslv2

yesno

no 1

nono

nosslv3

noyes

no 2

nono

notls (sslv23) 3

no 1

no 2

yesyes

yesyes

tlsv1

nono

yesyes

nono

tlsv1.1

nono

yesno

yesno

tlsv1.2

nono

yesno

noyes

sslcontext.verify_mode:認證模式

ssl.cert_none

sslcontext.verify_mode的可能值,或包裝_socket()的cert_reqs引數。除protocol_tls_clent外,它是預設模式。

對於客戶端套接字,幾乎接受任何證書。驗證錯誤,如不受信任或過期的證書,將被忽略,並且不會中止tls/ssl握手。

在伺服器模式下,沒有向客戶端請求證書,因此客戶端不會傳送任何客戶端證書身份驗證。

ssl.cert_optional

sslcontext.verify_mode的可能值,或包裝_socket()的cert_reqs引數。

在客戶端模式下,cert_optional與cert_required的含義相同。建議對客戶端套接字使用cert_required。

在伺服器模式下,向客戶端傳送客戶端證書請求。客戶端可以忽略請求,也可以傳送證書,以便執行tls客戶端證書身份驗證。

如果客戶端選擇傳送證書,則會對其進行驗證。任何驗證錯誤都會立即中止tls握手。

使用此設定需要將一組有效的ca證書傳遞給sslcontext.load_verify_locations(),或作為ca_certs引數的值傳遞給包裝_socket()。

ssl.cert_required

sslcontext.verify_mode的可能值,或包裝_socket()的cert_reqs引數。

在此模式下,需要從套接字連線的另一端獲得證書;如果未提供證書或其驗證失敗,將引發ssl錯誤。

此模式不足以在客戶端模式下驗證證書,因為它與主機名不匹配。還必須啟用check_hostname才能驗證證書的真實性。protocol_tls_clent使用cert_required,預設情況下啟用check_hostname。

對於伺服器套接字,此模式提供強制性的tls客戶端證書身份驗證。服務端向客戶端發起客戶端證書請求發,客戶端必須提供有效的可信證書。

使用此設定需要將一組有效的ca證書傳遞給sslcontext.load_verify_locations(),或作為ca_certs引數的值傳遞給包裝_socket()。

sslcontext.verify_flags:吊銷列表校驗

ssl.verify_default

sslcontext.verify_flags的可能值。在此模式下,不檢查證書吊銷列表(crl)。預設情況下,openssl既不要求也不驗證crl。

ssl.verify_crl_check_leaf

sslcontext.verify_flags的可能值。在這種模式下,只檢查對端證書,不檢查中間ca證書。

該模式需要由對等證書頒發者(其直接祖先ca)簽名的有效crl。如果沒有正確的crl載入sslcontext.load_verify_locations,則驗證將失敗。

ssl.verify_crl_check_chain

sslcontext.verify_flags的可能值,在這種模式下,會檢查對端證書鏈中所有證書的crl。

1、服務端

2、客戶端

from urllib import request
context.check_hostname = false
req = request.request(url, method=method)

sys.stdout.write("訪問url:%s; request method: %s \n" % (url, method))

with request.urlopen(req, context=context) as fp:

print(fp.headers)

print(fp.code)

print(fp.msg)

print(fp.read().decode("utf-8"))

print(fp.code)

kafka的SSL證書校驗不通過

目前開源日誌 最新版本有的會對ssl握手進行common name的校驗,如logstash 6.x 所以在部署的時候如果採用證書方式進行部署的話需要把連線的網域名稱和common name對應上。推薦採用阿里雲的訊息服務kafka 採用了sasl ssl的方式進行ssl加密 如何檢驗common ...

ssl證書申請並開啟https服務

注意 單網域名稱版,如果保護的的是以www為字首的網域名稱,預設情況下連去除www為字首的網域名稱也保護,例如申請保護www.mysite.com,其實連mysite.com也保護。但是其它型別的單網域名稱保護則不行,例如shopping.car.net buy.product.cn都只保護它們本身...

Python爬蟲(四)SSL證書

我們可以發現,現在大部分的 都是以https開頭的。我們知道http是指從www伺服器傳輸超文字到本地瀏覽器的傳輸協議。那https中多出的s又代表著什麼呢?這就是本文要講的ssl。https是以安全為目標的http通道,也就是說在http的基礎加上了ssl層,使資料傳輸更加的安全。ssl ssl證...