处处使用https的规则检查器

https-everywhere-checker的Python项目详细描述


https Everywhere规则检查器
==


作者:Ondrej Mikle,cz.nic(Ondrej.Mikle,位于nic.cz的Ondrej.Mikle)


————

将``checker.config.sample``复制到``checker.config``并更改```[rulesets]``下的
``rulesdir``以指向包含https everywhere规则的xml
文件的目录(通常是https的本地签出git树的
``src/chrome/content/rules``在这里)。

running
--


修改配置后,运行:





check https rules checker.config


输出将写入选定的日志文件,信息/警告/错误
包含有用信息。

features
--

-a尝试尽可能地遵循firefox的行为(包括根据规则重写http重定向;除了javascript和元重定向之外)
-idn域支持
-目前实现的两个资源的"距离"有两个度量,一个是纯stri。基于ng,另一个尝试测量"dom树形状的相似性"
-多线程扫描仪
-对各种"平台"的支持(例如cacert),即在重定向之后可以切换的ca
证书集集静态限制为一个ca
证书集(请参阅配置文件中的"static_ca_path")


可以检测到规则集中的哪些错误
---------------------------

-HTML页结构中的大差异
-规则集中的错误-声明的目标没有规则重写tes,错误的regexp
(通常捕获组是错误的),不完整的fqdns,不存在的

-原始页中的http 200,而重写页返回4xx/5xx
-重定向中的周期检测
-传输有效证书(不完整链)
-其他无效证书de检测(自签名、过期、cn
不匹配…

根据目标主机的猜测,在规则集中设置
URL测试集将提高其覆盖率(更好地覆盖率)

如果两个fqdn具有相同的
IP地址,则会错误地处理此情况,请使用服务器名称指示并尝试使用相同的会话ID恢复TLS会话
。即使通过将
``pycurl.ssl\u session id\u cache``设置为零来关闭SSL会话缓存也不会有帮助(libcurl/pycurl会忽略它出于某种原因)。pycurl+nss没有看到服务器
没有应答sni(参见下面的rfc 4366参考),因此http中的
"主机"头和服务器看到的sni是不同的,因此http
404。

Bug关闭了。

testcase
^^^^^^


请参阅"curl_test_nss/curl_nss sni.py``脚本,该脚本演示了该Bug。


技术细节
^^^^^^^^^^^^^^^^^^^

pycurl为第一台主机发送与sni的TLS握手。这样可以工作。
连接随后关闭,但pycurl+nss会记住ssl会话id。
稍后连接到同一ip上的第二个主机时,它将尝试使用相同的会话id。

在tls握手过程中使用不正确的会话id恢复的pts。因此会话被"恢复"到第一个主机的sni。

边观察:当pycurl+nss中的验证被关闭时,它也会将会话恢复作为副作用关闭(代码在curl的nss.c中)。

见"RFC 4366,第3.1节"最后四段,https://tools.ietf.org/html/rfc4366,第3.1节。与
`RFC 6066第3节<;https://tools.ietf.org/html/rfc6066\section-3>;`\uuu,
最后两段相比。在TLS 1.2中,逻辑是相反的-服务器不能
恢复此类连接,必须再次进行完全握手。


在支持的规则中,最多有9个捕获组
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~::

<;规则来自"^http://(www)"?01\.org/"to="https://$101.org/"/>;

`$101``实际上意味着101 ST组,因此我们假设只有`$``
后面的第一个数字表示组(在JavaScript中似乎是这样工作的)。


在Windows下可能不工作` pycurl
文档<;http://curl.haxx.se/libcurl/c/curl_easy_setopt.html curloptcapath>;`,
在Windows下使用capath可能不起作用。我想这是由于openssl的
``c\u rehash``实用程序创建了指向pem证书的符号链接。
假设如果符号链接被具有相同名称的常规
文件替换,但还没有尝试,那么它可以工作。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

python线程和openssl/gnutls存在一些竞争条件,这可能是由于sigpipe或sigsegv引起的。虽然libcurl代码似乎已经实现了必要的回调,但在某些地方还是有一个bug:-)

默认情况下,"使用子进程"处于启用状态。

(在进程调用之间不保留SSL会话ID缓存)。

有些curl和ssl库版本的组合可以做到这一点。生成单独的
子进程可防止任何缓存积累和占用太多内存。


假设使用子进程可能会导致死锁,原因是

大型HTML页的情况下,通过stdin/stdout交换数据时缓冲区大小不足,但对任何规则的
(我尝试在
https everywhere nov 2 2012 commit
c343f230a49d960dba90424799c3bacc2325fc94中包含的完整批规则集上运行它们)。尽管在发生死锁
的情况下,增加"subprocess.popen"调用中的缓冲区大小,
"http_client.py"调用中的缓冲区大小。

ssl库的一般错误/怪癖F怪癖。gnutls对于相关的rfc来说似乎是最严格的一个
,它不会容忍证书
链顺序错误,也不会原谅服务器没有发送"关闭通知"`
警报。

使用一个库时,它可能会与另一个库断开。

transvalid证书(根证书和中间证书的传递闭包)
——后期常见的缓存中间证书的浏览器行为。该目录包含
ff的内置证书和从ff的
内置证书(传递闭包)验证的所有中间证书。

sh``and is
相当粗糙,肯定需要对健全性进行一些双重检查(请参见脚本中的注释)。


脚本算法的快速大纲:

1。intermediateset 0:={来自
firefox}
2的干净安装的可信内置证书。具有基本约束ca=true或x509版本1的证书是从ssl observatory等数据库导出的。遍历所有导出的证书,添加新的唯一证书,该证书尚未包含在intermediateset中,并根据最新的intermediateset进行验证,形成intermediateset{n+1}
4。n+=1
5。如果在步骤3中添加了任何证书,则转到3,否则结束

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java optaplanner如何动态添加或编辑规则   java使用“public”是什么情况   java在selenium框架中,上下转换背后的逻辑是什么?   在Oracle ADF中使用EAR文件的java安装应用程序   java在Gradle中对现有的未签名apk进行签名   java spring事务超时不起作用   java是类级注释的定义类加载器始终是该类的初始类加载器的父级?   java在mysql中使用LIKE查询获取带撇号的记录   java CallableOrg。postgresql。util。日期参数未知的PSQLException   java我无法向jframe添加多个swing组件   java如何用数学在卡片对象中洗牌。随机的   java JavaFX 8将图形添加到右侧的标题窗格中   java NoClassDefFoundError。为什么?我该怎么修?   java重构Windows、UNIX、URI路径混合   关于java的服务。util。同时发生的ScheduledExecutorService。scheduleAtFixedRate:它执行任务的频率是多少?   TLS连接中ServerHelloDone之后的java SocketTimeoutException   java将多个图像上载到firebase并检索到viewpage   java有没有一种方法可以在不使用AWS SDK for 安卓的情况下在安卓应用程序上多部分上传到我的S3存储桶?