【问题标题】:How do I actually verify a given url's SSL certificate?我如何实际验证给定 url 的 SSL 证书?
【发布时间】:2021-12-05 00:40:30
【问题描述】:

我正在编写一段代码来验证给定 URL 的 SSL 证书是否有效,但是,请求库似乎无法正常工作。代码如下:

import requests
    try:
        response = str(requests.get(url, verify=True, allow_redirects=True))
        print(response)
        if "SSL: CERTIFICATE_VERIFY_FAILED" in response:
            print("url \"" + url + "\" has an invalid SSL certificate")
        else:
            valid = True
            for command in commands:
                if command.title == "get info":
                    if command.expirationDate > datetime.date:
                        print("url has an expired SSL certificate.")
                        valid = False
            if valid:
                print("url \"" + url + "\" has a valid SSL certificate")
    except requests.exceptions.InvalidURL:
        print("Invalid url \"" + url + "\"")
    except requests.exceptions.MissingSchema:
        print("Invalid url \"" + url + "\"")
    except (socket.gaierror, urllib3.exceptions.NewConnectionError, urllib3.exceptions.MaxRetryError, requests.exceptions.ConnectionError):
        print("Could not resolve url \"" + url + "\" to host")

输入网址“https://expired.badssl.com/”返回 Could not resolve url "https://expired.badssl.com/" to host 但是,我实际上可以导航到此页面。 此外,没有有效证书的页面显示为有效。我的一个朋友在他的牛肉 xss 服务器上运行了这个确切的代码,输出是它有一个有效的证书。我看过很多教程都说了同样的话,但是,鉴于我没有尝试过任何工作,我一定会遗漏一些东西。

【问题讨论】:

  • 如果证书验证失败,为什么你认为SSL: CERTIFICATE_VERIFY_FAILED 会被requests.get() 返回?
  • 根据 Geeks for Geeks 的说法,当您打印出响应时,如果验证失败,输出字符串将包含该响应。不确定这是否是最佳做法,但这是我能找到的最佳方法。
  • ...根据 Geeks for Geeks... 请提供该声明的链接。
  • 啊,我明白你的困惑了。正如下面的答案所指出的,该字符串不是由对requests.get() 的调用返回,它是调用引发的异常的一部分。如果您不熟悉异常,则它们很奇怪,您应该阅读有关它们的教程。有几个,here is one

标签: python ssl python-requests


【解决方案1】:

您的问题似乎是您的 IF 语句没有被评估,因为当 SSL 验证失败时请求已经抛出异常。

您可能需要使用专用的 try-except 块来处理它,例如:

import requests

def has_valid_ssl_req(url):
    try:
        response = str(requests.get(url, verify=True, allow_redirects=True))
        print(response)
        print(url+" has valid SSL, response: "+response)

    except Exception as e:
        print(url+": has INVALID SSL, error:"+str(e))

has_valid_ssl_req('http://expired.badssl.com')
has_valid_ssl_req('http://google.com')

基于:How can i get Certificate issuer information in python? 我可能会直接使用 SSL

import socket
import ssl

def has_valid_ssl(url):
    try:
        ctx = ssl.create_default_context()
        with ctx.wrap_socket(socket.socket(), server_hostname=url) as s:
            s.connect((url, 443))

        print(url+" has valid SSL")

    except Exception as e:
        print(url+": has INVALID SSL, error:"+str(e))

has_valid_ssl('expired.badssl.com')
has_valid_ssl('google.com')

【讨论】:

  • 这似乎行得通。如何区分 URL 无法解析和 URL 没有有效的 SSL 证书?
  • 您可能需要查看不同的异常并根据您的用例以不同方式处理它们。
  • 听起来不错。谢谢!
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 2017-05-27
  • 2013-09-26
  • 2010-09-16
  • 2017-06-13
  • 2019-03-29
  • 2018-06-11
相关资源
最近更新 更多