首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Urllib和服务器证书的验证

Urllib和服务器证书的验证
EN

Stack Overflow用户
提问于 2011-07-11 10:46:22
回答 2查看 21.5K关注 0票数 15

我使用python 2.6并请求Facebook API (https)。我猜我的服务可以成为中间人攻击的目标。今天早上我再次阅读urllib模块文档时发现:引用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Warning : When opening HTTPS URLs, it is not attempted to validate the server certificate. Use at your own risk!

您是否有完成完整证书验证的提示/ url / examples?

谢谢你的帮忙

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-14 14:20:50

您可以创建一个urllib2打开程序,它可以使用自定义处理程序为您执行验证。下面的代码是一个使用Python 2.7.3的示例。它假定您已将http://curl.haxx.se/ca/cacert.pem下载到保存脚本的同一文件夹中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
import urllib2
import httplib
import ssl
import socket
import os

CERT_FILE = os.path.join(os.path.dirname(__file__), 'cacert.pem')


class ValidHTTPSConnection(httplib.HTTPConnection):
        "This class allows communication via SSL."

        default_port = httplib.HTTPS_PORT

        def __init__(self, *args, **kwargs):
            httplib.HTTPConnection.__init__(self, *args, **kwargs)

        def connect(self):
            "Connect to a host on a given (SSL) port."

            sock = socket.create_connection((self.host, self.port),
                                            self.timeout, self.source_address)
            if self._tunnel_host:
                self.sock = sock
                self._tunnel()
            self.sock = ssl.wrap_socket(sock,
                                        ca_certs=CERT_FILE,
                                        cert_reqs=ssl.CERT_REQUIRED)


class ValidHTTPSHandler(urllib2.HTTPSHandler):

    def https_open(self, req):
            return self.do_open(ValidHTTPSConnection, req)

opener = urllib2.build_opener(ValidHTTPSHandler)


def test_access(url):
    print "Acessing", url
    page = opener.open(url)
    print page.info()
    data = page.read()
    print "First 100 bytes:", data[0:100]
    print "Done accesing", url
    print ""

# This should work
test_access("https://www.google.com")

# Accessing a page with a self signed certificate should not work
# At the time of writing, the following page uses a self signed certificate
test_access("https://tidia.ita.br/")

运行此脚本,您应该会看到如下所示的输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Acessing https://www.google.com
Date: Mon, 14 Jan 2013 14:19:03 GMT
Expires: -1
...

First 100 bytes: <!doctype html><html itemscope="itemscope" itemtype="http://schema.org/WebPage"><head><meta itemprop
Done accesing https://www.google.com

Acessing https://tidia.ita.br/
Traceback (most recent call last):
  File "https_validation.py", line 54, in <module>
    test_access("https://tidia.ita.br/")
  File "https_validation.py", line 42, in test_access
    page = opener.open(url)
  ...
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1177, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed>
票数 9
EN

Stack Overflow用户

发布于 2011-08-10 22:34:41

如果您有一个受信任的证书颁发机构(CA)文件,则可以使用Python2.6和更高版本的ssl库来验证证书。下面是一些代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os.path
import ssl
import sys
import urlparse
import urllib

def get_ca_path():
    '''Download the Mozilla CA file cached by the cURL project.

    If you have a trusted CA file from your OS, return the path
    to that instead.
    '''
    cafile_local = 'cacert.pem'
    cafile_remote = 'http://curl.haxx.se/ca/cacert.pem'
    if not os.path.isfile(cafile_local):
        print >> sys.stderr, "Downloading %s from %s" % (
            cafile_local, cafile_remote)
    urllib.urlretrieve(cafile_remote, cafile_local)
    return cafile_local

def check_ssl(hostname, port=443):
    '''Check that an SSL certificate is valid.'''
    print >> sys.stderr, "Validating SSL cert at %s:%d" % (
        hostname, port)

    cafile_local = get_ca_path()
    try:
        server_cert = ssl.get_server_certificate((hostname, port),
            ca_certs=cafile_local)
    except ssl.SSLError:
        print >> sys.stderr, "SSL cert at %s:%d is invalid!" % (
            hostname, port)
        raise 

class CheckedSSLUrlOpener(urllib.FancyURLopener):
    '''A URL opener that checks that SSL certificates are valid

    On SSL error, it will raise ssl.
    '''

    def open(self, fullurl, data = None):
        urlbits = urlparse.urlparse(fullurl)
        if urlbits.scheme == 'https':
            if ':' in urlbits.netloc:
                hostname, port = urlbits.netloc.split(':')
            else:
                hostname = urlbits.netloc
                if urlbits.port is None:
                    port = 443
                else:
                    port = urlbits.port
            check_ssl(hostname, port)
        return urllib.FancyURLopener.open(self, fullurl, data)

# Plain usage - can probably do once per day
check_ssl('www.facebook.com')

# URL Opener
opener = CheckedSSLUrlOpener()
opener.open('https://www.facebook.com/find-friends/browser/')

# Make it the default
urllib._urlopener = opener
urllib.urlopen('https://www.facebook.com/find-friends/browser/')

这段代码有一些危险:

  1. 您必须信任cURL项目(http://curl.haxx.se/ca/cacert.pem)中的CA文件,它是Mozilla的CA文件的缓存版本。它也是基于HTTP的,因此存在潜在的MITM攻击。最好用返回本地CA文件的文件替换get_ca_path
  2. 不会尝试查看CA文件是否已更新。最终,根证书将过期或被停用,并将添加新证书。一个好主意是使用cron作业来删除缓存的CA文件,这样每天都会下载一个新的文件。
  3. 每次检查证书可能都有点过分了。您可以在每次运行时手动检查一次,或者在运行过程中保留一个“已知良好”主机的列表。或者,疑神疑鬼!
票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6648952

复制
相关文章
format python保留小数点后几位_python四舍五入保留两位小数
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169805.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
1.2K0
format python保留小数点后几位_python四舍五入保留两位小数
java 四舍五入保留小数的几种方式
(new BigDecimal()).setScale()方法用于格式化小数点,有多种小数保留模式,如下:
全栈程序员站长
2022/08/31
2.4K0
【Java】Java四舍五入保留1位小数、2位小数…
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/143140.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/25
2.8K0
java四舍五入保留小数「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/139172.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/02
3780
java float四舍五入保留两位小数,java四舍五入float保留两位小数
摘要 腾兴网为您分享:java四舍五入float保留两位小数,远离手机,相机美颜,未来屋,微视等软件知识,以及流光,证券从业随身学,老a工具箱,polarr,特斯拉app,ae插件合集,福奈特,app名称,哈士奇表情,电视台直播源,思兔,门海,电子台账软件,3c电池,smartflashrecovery等软件it资讯,欢迎关注腾兴网。四舍五入我们大家都知道是什么但在java中四舍五入函数是什么如何实现float保留指定位数?具体我们来看小编整理的一些例子。 例子1 float f = 34.237323f; BigDecimal b = new BigDecimal(f); float f…
全栈程序员站长
2022/08/31
8330
MySQL对小数进行四舍五入等操作
FLOOR(X) 返回不大于X的最大整数。 CEIL(X)、CEILING(X) 返回不小于X的最小整数。
翎野君
2023/08/25
5480
java四舍五入(保留两位小数)[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/145899.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/29
5950
java四舍五入取整算法(小数四舍五入取整公式)
static double ceil(double a):天花板函数,返回大于等于a的最小整数(但是以浮点数形式存储)。
全栈程序员站长
2022/07/31
2.2K0
java四舍五入取整算法(小数四舍五入取整公式)
Java四舍五入保留两位小数
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/143295.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/31
1.1K1
sql 四舍五入 保留两位小数
数据库里的 float momey 类型,都会精确到多位小数。但有时候 我们不需要那么精确,例如,只精确到两位有效数字。
全栈程序员站长
2022/09/06
5.3K0
js保留两位小数四舍五入_parsefloat保留两位小数
如果大家想对javascript有系统深入的学习,可以参阅 JavaScript启示录 PDF原书完整版 这本经典书籍
全栈程序员站长
2022/09/23
5.1K0
bigdecimal保留最多小数位_bigdecimal四舍五入保留两位小数
参考:https://www.cnblogs.com/jpfss/p/8072379.html
全栈程序员站长
2022/11/09
9030
Python3 四舍五入问题详解
“就本质来说,浮点算术是不精确的,而且程序员们很容易滥用它,从而使计算的结果几乎全部由噪声组成”
用户9077582
2021/10/11
3.5K0
Java四舍五入保留小数点后几位
银行家算法: 四舍:舍弃的数值:0.000、0.001、0.002、0.003、0.004,因为是舍弃的,对银行家来说,就不用付款给储户了,那每舍弃一个数字就会赚取相应的金额:0.000、0.001、0.002、0.003、0.004。 五入:进位的数值:0.005、0.006、0.007、0.008、0.009,因为是进位,对银行家来说,每进一位就会多付款给储户,也就是亏损了,那亏损部分就是其对应的10进制补数:0.005、0.004、0.003、0.002、0.001。 因为舍弃和进位的数字是在0到9之间均匀分布的,所以对于银行家来说,每10笔存款的利息因采用四舍五入而获得的盈利是:
全栈程序员站长
2022/08/31
1.4K0
Java四舍五入保留小数点后几位
php 保留两位小数,不四舍五入
高久峰
2023/06/03
1.7K0
java保留两位小数不四舍五入_java截取两位小数
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/08
1.3K0
JAVA保留两位小数(四舍五入)「建议收藏」
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
1.7K0
JAVA保留两位小数(四舍五入)「建议收藏」
Java之float取2位小数,末位四舍五入
JAVA如何把一个float四舍五入到小数点后2位,4位,或者其它指定位数. 以前以为很容易,一直没在意,今天突然用到了,才发现,系统没有这样的函数.狂晕,同事们用的方法为,先转成String,再取其中几位,再转成float型,(如:String.valueOf(c).substring(0,String.valueOf(c).indexOf(".") + 3)):
IT工作者
2022/03/30
2K0
恶心的0.5四舍五入问题
四舍五入是财务类应用中常见的需求,按中国人的财务习惯,遇到0.5统一向上进位,但是c#与java中默认的却不是这样。 见c#代码: 1 static void Main(string[] args) 2 { 3 Decimal d = 301353.05M; 4 Console.WriteLine(d);//301353.05 5 Console.WriteLine(Math.Round(d, 1));/
菩提树下的杨过
2018/01/19
1.3K0
Python保留小数的方法
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169776.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/21
2.6K0

相似问题

python小数四舍五入问题

114

Python大小数四舍五入问题

19

小数四舍五入的问题

12

MySQL小数四舍五入问题

20

KendoNumericTextBox小数四舍五入问题

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文