处处使用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第三方库


热门话题
在Android应用程序中处理新活动时出现java NullPointerException   从PSV文件读取Java   在JavaSwing中将方法从一个类传递到另一个类   带有MongoDB错误的java Vertx ClassNotFoundException:com。mongodb。联系溪流工厂   在java中替换2D数组中的数字?   java Avro方案空布尔和双整数布尔的写并集   java导入组织。neo4j无法解决?   从另一个获取变量。使用反射的java文件   Java:以格式化字符串的形式返回具有非常不同的条目长度的2D数组   java客户端应用程序正在从IBMMQ接收不同格式的消息体   java在我的主循环中的步骤有问题   java如何正确安装来自sslforfree的证书。tomcat服务器上的com   java RecyclerView变更单永久   java如何获得屏幕的精确中间位置,即使调整了大小