xyuanmu / XX-Mini

:ghost: XX-Net 精简版
444 stars 126 forks source link

python3 版本 运行错误。 #52

Open cpmbwo opened 8 years ago

cpmbwo commented 8 years ago

版本是1.1。 arch linux 错误信息: Traceback (most recent call last): File "/run/media/xxx/Win-D/Applications/XX-Mini/proxy.py", line 244, in main() File "/run/media/xxx/Win-D/Applications/XX-Mini/proxy.py", line 206, in main CertUtil.init_ca() File "/run/media/xxx/Win-D/Applications/XX-Mini/pythonlib/local/cert_util.py", line 530, in init_ca CertUtil.import_ca(CertUtil.ca_keyfile) File "/run/media/xxx/Win-D/Applications/XX-Mini/pythonlib/local/cert_util.py", line 493, in import_ca CertUtil.import_debian_ca(commonname, certfile) File "/run/media/xxx/Win-D/Applications/XX-Mini/pythonlib/local/cert_util.py", line 399, in import_debian_ca sha1 = get_debian_ca_sha1(nss_path) File "/run/media/xxx/Win-D/Applications/XX-Mini/pythonlib/local/cert_util.py", line 384, in get_debian_ca_sha1 sha1 = sha1.replace(b' ', b'').replace(b':', b'').replace(b'\n', b'') TypeError: Can't convert 'bytes' object to str implicitly

Windows 错误信息: data/manual.ini load error:'gbk' codec can't decode byte 0xae in position 14: illegal multibyte sequ ence Except stack:Traceback (most recent call last): File "D:\Applications\XX-Mini\python35.zip\local\config.py", line 31, in load self.CONFIG.read(self.CONFIG_MANUAL_FILENAME) File "configparser.py", line 696, in read File "configparser.py", line 1012, in _read UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 14: illegal multibyte sequence 这个错误提示是在配置信息显示前就显示了,也就是刚打开程序就有了。manual.ini的编码是UTF-8。

python2的1.2.5版本在相同的manual.ini下(一直没改过)运行正常。

jzp820927 commented 8 years ago

你是怎么运行的? 试试终端运行 python3 proxy.py ?

xyuanmu commented 8 years ago

都是编码错误,python3的编码很烦人 Linux错误,尝试修改:pythonlib/local/cert_util.py 31行:

# 旧的
lines = out.readlines()
# 新的
lines = out.readlines().decode('utf-8')

Windows 的可以尝试改为ANSI编码,不行的话别在ini文件里输入中文。

jzp820927 commented 8 years ago

@xyuanmu 不能先判断系统类别,根据不同的系统自动使用不同的编码么 或者在内存中把编码转换到对应的操作系统格式,再读取

xyuanmu commented 8 years ago

@jzp820927 ini 文件是什么编码,那就需要对应的解码,而不是根据系统类型。win中文系统里有中文要ANSI编码才能正常读取,如果ini文件是utf-8保存而强制用ANSI读取还是会出错,所以不建议ini文件里有中文,即使有也要对应修改编码。

cpmbwo commented 8 years ago

这几个链接也许对修改本问题有帮助。 https://docs.python.org/3/howto/unicode.html#files-in-an-unknown-encoding http://pythoncentral.io/encoding-and-decoding-strings-in-python-3-x http://stackoverflow.com/questions/23917729/switching-to-python-3-causing-unicodedecodeerror 由于我已经从职业程序员转行了,所以您慢慢看。

xyuanmu commented 8 years ago

重新下载python3分支,看是否解决 arch linux 导入证书问题:https://github.com/xyuanmu/XX-Mini/archive/python3.zip

cpmbwo commented 8 years ago

刚才debug了下linux下的代码。发现变量lines和sha1是空的。继续追查发现是证书名改变导致。我是link(windows下是mklink)到python2版本的data目录的。也就是说sha1的encode()和decode()不需要加。加了反倒出错,具体是什么忘记了,大意是line无法encode()。 希望python3版本和python2版本使用同样的证书名。原因是首先2个版本都是xx-mini项目下的。其次有些用户像是我,mac linux windows都有,每个平台firefox还要再倒入一次证书,加上局域网内其他用户,真的是太麻烦。第三如果用不同的证书名,意味着要维护2分manua.ini good_ip.txt,这样不如直接link到data目录来的简单。其实我之前从xx-net过来的时候,就是link到xx-net的data下的目录的。但是考虑到毕竟项目名不同,就大折腾了一次,现在如果升级到python3版本还要再折腾一次,那真要疯了。如果以后python2被彻底淘汰又或者python4出来了,再搞,没必要。 Windows版本确实和中文有关,我把中文删掉,就不报错了。另外不知Windows下如何导入openssl模块,我已经有装python3的软件。

cpmbwo commented 8 years ago

刚才在linux下跑了下带中文manual.ini的python3的1.1版本,没问题一切正常。 其实我是建议xx-net和xx-mini都用GoAgent作为证书名,以此来纪念goagent。毕竟没有当年的gogagent也不会有今天的xx-net和xx-mini。

jzp820927 commented 8 years ago

我也同意统一所有GAE项目的证书文件,每个项目都使用不同的证书,对用户来说是灾难。

xyuanmu commented 8 years ago

证书如果同名就无法导入火狐了,试过火狐有同名证书的情况下只能删除后再导入,也就意味着P2和P3切换的时候就要不停更换证书。 我没有arch linux,只是模拟测试,发现不加encode,sha1 = sha1.replace(b' ', b'').replace(b':', b'').replace(b'\n', b'') 就会提示 TypeError: Can't convert 'bytes' object to str implicitly ,但是P3 1.1版本在ubuntu是没任何问题的,所以只有找有 arch linux 的测试一遍,到底要不要加encode。 还有 ini 文件中文问题只有Windows才会有,测试了,保存为ANSI编码就不会,如果保存为UTF-8编码,就必须强制用UTF-8编码读取,而这样会引起不必要的问题如保存为其他编码就无法读取了。

jzp820927 commented 8 years ago

其实我觉得统一证书问题可以这样解决,比如我 goproxy,或者 goagent,或者 XXNET,之前生成过证书了,也导入证书到系统了。现在我把 goproxy,或者 goagent,或者 XXNET,之前生成过的证书复制到 XXMINI 的data 目录下,然后 XXMINI 运行的时候,先检查 data 目录有没有 CA.crt 证书文件,如果有能不能直接调用这个证书。

也就是 XX 能不能兼容其他客户端生成的证书,这样就不存在冲突了(因为之前用 GOP,GOA,XXNET 的时候,已经导入证书了,现在就不用再导入证书,也就不存在冲突的问题)。如果 data 目录没有检查到旧证书,再生成自己独有的证书?

其实我早就想,单独发个 issuse 来提这个建议,赶脚这种模式对用户比较友好,现在一般情况也都是备份旧证书用,很少有需求生成独立的新证书,不知道 @xyuanmu 兄,能否实现这种证书的兼容性?(我觉得目前最主要是能够兼容 Goproxy 的证书,因为GOP的性能比较好了,goagent 和 XXNET,可以不兼容,goagent 已经停止开发,XXNET,和MINI是同一系软件,一般不会同时用)

xyuanmu commented 8 years ago

我并不了解证书是如何生成的,为何要为一份证书弄得这般复杂?

jzp820927 commented 8 years ago

算了吧,既然复杂就不管了,P大自己的 goproxy 和 goagent 现在的证书都不兼容,更何况还是不同人开发的。

cpmbwo commented 8 years ago

正像 jzp820927 所说,以前生成过的证书,只要复制到新的GAE工作目录下就可以用,不管是谁生成的,只要名字相同就可以,不管是系统的还是火狐的,都无需再次导入。一次导入,处处使用。

不需要加encode。TypeError: Can't convert 'bytes' object to str implicitly 这个是因为变量lines和sha1是空的。

cpmbwo commented 8 years ago

to jzp820927 “之前生成过的证书复制到 XXMINI 的data 目录下,然后 XXMINI 运行的时候,先检查 data 目录有没有 CA.crt 证书文件,如果有能不能直接调用这个证书。” 现在的代码就是这么做的,所以直接复制就可以。改了证书名反倒是画蛇添足。

cpmbwo commented 8 years ago

https://docs.python.org/3/howto/unicode.html#files-in-an-unknown-encoding 我觉得这个是可以解决编码问题的,因为GBK和UTF-8都是ASCII兼容的。看原文的意思,只要在打开文件的时候加上errors="surrogateescape就可以了。

jzp820927 commented 8 years ago

@cpmbwo 我知道目前是这么设计的,但是估计是证书格式不兼容,goproxy 证书拿给 XX用,或者XX证书拿给 goproxy 用,访问 https 会报错,不知道你实测过没有,反正我是实测过的。

xyuanmu commented 8 years ago

@cpmbwo 既然sha1是空的那就好办了,证书还是分类导入比较妥,这样不容易出问题,理论上 XX-Net,XX-Mini,XX-Mini-P3证书是可以通用的。

config 的解码问题,不用这么纠结了,直接用国际标准 'iso-8859-1',只要不是什么牛鬼蛇神的编码都能正常读取。

hwx7hao commented 8 years ago

请问python3 的pyopenssl 怎么装的?

shaoyan177 commented 8 years ago

opkg install pyopenssl python-openssl --force-depends --force-overwrite openwrt里面直接输入这个指令就行,如果软件源有问题就去网上找个软件源。

hwx7hao commented 8 years ago

我用的debian,openwrt要运行drcom的登陆脚本,cpu不够给力

hwx7hao commented 8 years ago

pip3 install pyopenssl cryptography的时候出现很多警告,最后能运行python3 proxy.py了,但是不能启用log_file,但是网页都连不上

shaoyan177 commented 8 years ago

应该不是cpu的问题吧,我的是路由器都可以,应该是你支持库没有安装齐吧。

hwx7hao commented 8 years ago

openwrt能用,但是效果不好,内存不够(运行的东西有点多),我是用beaglebone black装的debian来运行XX-Mini的,2.7版的可以用(就是我ipad不能看youtube,所以想试一下p3版的),p3的却出了这么多问题

jzp820927 commented 8 years ago

youtube 和 py 的版本,八杆子扯不上关系吧

hwx7hao commented 8 years ago

少装了个python-crypto,为什么会部分能看部分不能看能,(现在能看了)