亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python獲取域名ssl證書信息和到期時間

 更新時間:2023年09月17日 08:45:47   作者:Python技術(shù)  
這篇文章主要為大家詳細介紹了如何利用python實現(xiàn)獲取域名ssl證書信息和到期時間,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下

文檔

https://docs.python.org/zh-cn/3/library/socket.html

https://docs.python.org/zh-cn/3/library/ssl.html

1、通過openssl證書獲取

openssl x509 -in <cert>.pem -noout -dates

2、通過openssl域名獲取

echo | openssl s_client -servername <doman> -connect <doman>:443 2>/dev/null | openssl x509 -noout -dates

3、通過腳本獲取curl

#?coding:?utf-8?
#?查詢域名證書到期情況
import?re
import?subprocess
from?datetime?import?datetime
def?get_re_match_result(pattern,?string):
????match?=?re.search(pattern,?string)
????return?match.group(1)
def?parse_time(date_str):
????return?datetime.strptime(date_str,?"%b?%d?%H:%M:%S?%Y?GMT")
def?format_time(date_time):
????return?datetime.strftime(date_time,?"%Y-%m-%d?%H:%M:%S")
def?get_cert_info(domain):
????"""獲取證書信息"""
????cmd?=?f"curl?-Ivs?https://{domain}?--connect-timeout?10"
????exitcode,?output?=?subprocess.getstatusoutput(cmd)
????#?正則匹配
????start_date?=?get_re_match_result('start?date:?(.*)',?output)
????expire_date?=?get_re_match_result('expire?date:?(.*)',?output)
????#?解析匹配結(jié)果
????start_date?=?parse_time(start_date)
????expire_date?=?parse_time(expire_date)
????return?{
????????'start_date':?start_date,
????????'expire_date':?expire_date
????}
def?get_cert_expire_date(domain):
????"""獲取證書剩余時間"""
????info?=?get_cert_info(domain)
????print(info)
????expire_date?=?info['expire_date']
????#?剩余天數(shù)
????return?(expire_date?-?datetime.now()).days
if?__name__?==?"__main__":
????domain?=?'www.baidu.com'
????expire_date?=?get_cert_expire_date(domain)
????print(expire_date)

4、通過socket 獲取域名ssl 證書信息

核心代碼

#?-*-?coding:?utf-8?-*-
import?socket
import?ssl
def?get_domain_cert(domain):
????"""
????獲取證書信息
????:param?domain:?str
????:return:?dict
????"""
????socket.setdefaulttimeout(5)
????cxt?=?ssl.create_default_context()
????skt?=?cxt.wrap_socket(socket.socket(),?server_hostname=domain)
????skt.connect((domain,?443))
????cert?=?skt.getpeercert()
????skt.close()
????return?cert
if?__name__?==?"__main__":
????print(get_domain_cert("www.baidu.com"))

還有一種方式也記錄一下

import?socket
import?ssl
def?get_domain_cert(host,?port=443,?timeout=3):
????"""
????獲取證書信息
????存在問題:沒有指定主機ip,不一定能獲取到正確的證書信息
????:param?host:?str
????:param?port:?int
????:param?timeout:?int
????:return:?dict
????"""
????context?=?ssl.create_default_context()
????with?socket.create_connection(address=(host,?port),?timeout=timeout)?as?sock:
????????with?context.wrap_socket(sock,?server_hostname=host)?as?wrap_socket:
????????????return?wrap_socket.getpeercert()

輸出

{
'subject': ((('countryName', 'CN'),), (('stateOrProvinceName', 'beijing'),), (('localityName', 'beijing'),), (('organizationalUnitName', 'service operation department'),), (('organizationName', 'Beijing Baidu Netcom Science Technology Co., Ltd'),), (('commonName', 'baidu.com'),)), 
'issuer': ((('countryName', 'BE'),), (('organizationName', 'GlobalSign nv-sa'),), (('commonName', 'GlobalSign RSA OV SSL CA 2018'),)), 
'version': 3, 
'serialNumber': '4417CE86EF82EC6921CC6F68', 
'notBefore': 'Jul  5 05:16:02 2022 GMT', 
'notAfter': 'Aug  6 05:16:01 2023 GMT', 
'subjectAltName': (('DNS', 'baidu.com'), ), 
'OCSP': ('http://ocsp.globalsign.com/gsrsaovsslca2018',), 
'caIssuers': ('http://secure.globalsign.com/cacert/gsrsaovsslca2018.crt',), 
'crlDistributionPoints': ('http://crl.globalsign.com/gsrsaovsslca2018.crl',)
}

結(jié)構(gòu)化輸出內(nèi)容后的完整代碼

#?-*-?coding:?utf-8?-*-
import?socket
import?ssl
from?dateutil?import?parser
#?requests.packages.urllib3.disable_warnings()
try:
????_create_unverified_https_context?=?ssl._create_unverified_context
except?AttributeError:
????#?Legacy?Python?that?doesn't?verify?HTTPS?certificates?by?default
????pass
else:
????#?Handle?target?environment?that?doesn't?support?HTTPS?verification
????ssl._create_default_https_context?=?_create_unverified_https_context
DATETIME_FORMAT?=?'%Y-%m-%d?%H:%M:%S'
socket.setdefaulttimeout(5)
def?get_domain_ip(domain):
????"""
????獲取ip地址
????:param?domain:?str
????:return:?str
????"""
????try:
????????addrinfo?=?socket.getaddrinfo(domain,?None)
????????return?addrinfo[0][-1][0]
????except?Exception?as?e:
????????pass
????return?None
def?get_domain_cert(domain):
????"""
????獲取證書信息
????:param?domain:?str
????:return:?dict
????"""
????cxt?=?ssl.create_default_context()
????skt?=?cxt.wrap_socket(socket.socket(),?server_hostname=domain)
????skt.connect((domain,?443))
????cert?=?skt.getpeercert()
????skt.close()
????return?cert
def?get_cert_info(domain):
????"""
????獲取證書信息
????:param?domain:?str
????:return:?dict
????"""
????cert?=?get_domain_cert(domain)
????issuer?=?_tuple_to_dict(cert['issuer'])
????subject?=?_tuple_to_dict(cert['subject'])
????return?{
????????'domain':?domain,
????????'ip':?get_domain_ip(domain),
????????'subject':?_name_convert(subject),
????????'issuer':?_name_convert(issuer),
????????#?'version':?cert['version'],
????????#?'serial_number':?cert['serialNumber'],
????????'start_date':?_parse_time(cert['notBefore']),
????????'expire_date':?_parse_time(cert['notAfter']),
????}
def?_tuple_to_dict(cert_tuple):
????"""
????cert證書?tuple轉(zhuǎn)dict
????:param?cert_tuple:?tuple
????:return:
????"""
????data?=?{}
????for?item?in?cert_tuple:
????????data[item[0][0]]?=?item[0][1]
????return?data
def?_name_convert(data):
????"""
????名字轉(zhuǎn)換
????:param?data:?dict
????:return:?dict
????"""
????name_map?=?{
????????'C':?'countryName',
????????'CN':?'commonName',
????????'O':?'organizationName',
????????'OU':?'organizationalUnitName',
????????'L':?'localityName',
????????'ST':?'stateOrProvinceName'
????}
????dct?=?{}
????for?key,?value?in?name_map.items():
????????dct[key]?=?data.get(value,?'')
????return?dct
def?_parse_time(time_str):
????"""
????解析并格式化時間
????:param?time_str:?str
????:return:?str
????"""
????return?parser.parse(time_str).astimezone().strftime(DATETIME_FORMAT)
if?__name__?==?"__main__":
????print(get_cert_info("www.baidu.com"))

輸出

{
  "domain": "www.baidu.com",
  "ip": "39.156.66.14",
  "subject": {
    "C": "CN",
    "CN": "baidu.com",
    "O": "Beijing Baidu Netcom Science Technology Co., Ltd",
    "OU": "service operation department",
    "L": "beijing",
    "ST": "beijing"
  },
  "issuer": {
    "C": "BE",
    "CN": "GlobalSign RSA OV SSL CA 2018",
    "O": "GlobalSign nv-sa",
    "OU": "",
    "L": "",
    "ST": ""
  },
  "start_date": "2022-07-05 13:16:02",
  "expire_date": "2023-08-06 13:16:01"
}

5、通過pyOpenSSL獲取證書信息

該方式,不校驗證書合法性,只獲取證書信息

文檔:https://pyopenssl.org/en/0.15.1/index.html#

依賴

pip?install?pyOpenSSL

示例

#?-*-?coding:?utf-8?-*-
import?ssl
import?OpenSSL
def?get_ssl_expire_date(host,?port=443):
????cert?=?ssl.get_server_certificate((host,?port))
????x509?=?OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM,?cert)
????return?x509.get_notAfter().decode()
if?__name__?==?'__main__':
????print(get_ssl_expire_date('www.baidu.com'))
????#?20230806051601Z

6、Domain Admin可視化管理域名證書到期

項目地址:https://github.com/mouday/domain-admin

運行環(huán)境:Python 3.7.0

$?pip?install?domain_admin
#?升級到最新版本,可選
$?pip3?install?-U?domain-admin?-i?https://pypi.org/simple
#?啟動運行
$?gunicorn?'domain_admin.main:app'

訪問地址:http://127.0.0.1:8000

默認的管理員賬號:admin 密碼:123456

以上就是python獲取域名ssl證書信息和到期時間的詳細內(nèi)容,更多關(guān)于python ssl的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python實現(xiàn)分段線性插值

    Python實現(xiàn)分段線性插值

    這篇文章主要為大家詳細介紹了Python實現(xiàn)分段線性插值,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Flask中嵌套啟動子線程的方法示例詳解

    Flask中嵌套啟動子線程的方法示例詳解

    這篇文章主要為大家介紹了Flask中嵌套啟動子線程的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 用Python自動下載網(wǎng)站所有文件

    用Python自動下載網(wǎng)站所有文件

    這篇文章主要介紹了如何用Python自動下載網(wǎng)站所有文件,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • Django模型序列化返回自然主鍵值示例代碼

    Django模型序列化返回自然主鍵值示例代碼

    這篇文章主要給大家介紹了關(guān)于Django模型序列化返回自然主鍵值的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Django具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 一步步教你用Python實現(xiàn)2048小游戲

    一步步教你用Python實現(xiàn)2048小游戲

    相信2048這個游戲?qū)Υ蠹襾碚f一定不陌生,下面這篇文章就主要給大家介紹了怎么用Python實現(xiàn)2048小游戲,文中通過注釋與示例代碼介紹的很詳細,相信對大家的理解和學(xué)習(xí)具有一定的參考借鑒價值,有需要的朋友們一起來看看吧。
    2017-01-01
  • Python編程之多態(tài)用法實例詳解

    Python編程之多態(tài)用法實例詳解

    這篇文章主要介紹了Python編程之多態(tài)用法,以實例形式詳細分析了Python中多態(tài)的使用技巧,需要的朋友可以參考下
    2015-05-05
  • Python?if?判斷語句詳解

    Python?if?判斷語句詳解

    這篇文章主要介紹了Python?if?判斷語句,包括流程控制,順序結(jié)構(gòu)和分支結(jié)構(gòu),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-11-11
  • Python實現(xiàn)享元模式的示例代碼

    Python實現(xiàn)享元模式的示例代碼

    享元模式是一種結(jié)構(gòu)型設(shè)計模式,旨在通過共享盡可能多的相似對象來減少內(nèi)存使用,提高性能,下面我們就來看看如何使用Python實現(xiàn)享元模式吧
    2024-02-02
  • Python利用fastapi實現(xiàn)上傳文件

    Python利用fastapi實現(xiàn)上傳文件

    FastAPI是一個現(xiàn)代的,快速(高性能)python?web框架。本文將利用fastapi實現(xiàn)上傳文件功能,文中的示例代碼講解詳細,需要的可以參考一下
    2022-06-06
  • Python返回真假值(True or False)小技巧

    Python返回真假值(True or False)小技巧

    這篇文章主要介紹了Python返回真假值(True or False)小技巧,本文探討的是最簡潔的條件判斷語句寫法,本文給出了兩種簡潔寫法,需要的朋友可以參考下
    2015-04-04

最新評論