Skip to content
This repository has been archived by the owner on Jan 17, 2021. It is now read-only.

python3 版本 运行错误。 #52

Open
cpmbwo opened this issue Apr 17, 2016 · 26 comments
Open

python3 版本 运行错误。 #52

cpmbwo opened this issue Apr 17, 2016 · 26 comments

Comments

@cpmbwo
Copy link

cpmbwo commented Apr 17, 2016

版本是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
Copy link

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

@xyuanmu
Copy link
Owner

xyuanmu commented Apr 18, 2016

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

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

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

@jzp820927
Copy link

jzp820927 commented Apr 18, 2016

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

@xyuanmu
Copy link
Owner

xyuanmu commented Apr 18, 2016

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

@cpmbwo
Copy link
Author

cpmbwo commented Apr 18, 2016

xyuanmu added a commit that referenced this issue Apr 19, 2016
xyuanmu added a commit that referenced this issue Apr 19, 2016
@xyuanmu
Copy link
Owner

xyuanmu commented Apr 19, 2016

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

@cpmbwo
Copy link
Author

cpmbwo commented Apr 19, 2016

刚才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
Copy link
Author

cpmbwo commented Apr 20, 2016

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

@jzp820927
Copy link

jzp820927 commented Apr 20, 2016

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

@xyuanmu
Copy link
Owner

xyuanmu commented Apr 20, 2016

证书如果同名就无法导入火狐了,试过火狐有同名证书的情况下只能删除后再导入,也就意味着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
Copy link

jzp820927 commented Apr 20, 2016

其实我觉得统一证书问题可以这样解决,比如我 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
Copy link
Owner

xyuanmu commented Apr 20, 2016

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

@jzp820927
Copy link

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

@cpmbwo
Copy link
Author

cpmbwo commented Apr 20, 2016

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

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

@cpmbwo
Copy link
Author

cpmbwo commented Apr 20, 2016

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

@cpmbwo
Copy link
Author

cpmbwo commented Apr 20, 2016

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

@jzp820927
Copy link

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

xyuanmu added a commit that referenced this issue Apr 21, 2016
@xyuanmu
Copy link
Owner

xyuanmu commented Apr 21, 2016

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

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

@hwx7hao
Copy link

hwx7hao commented Apr 25, 2016

请问python3 的pyopenssl 怎么装的?

@shaoyan177
Copy link

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

@hwx7hao
Copy link

hwx7hao commented Apr 25, 2016

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

@hwx7hao
Copy link

hwx7hao commented Apr 25, 2016

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

@shaoyan177
Copy link

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

@hwx7hao
Copy link

hwx7hao commented Apr 25, 2016

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

@jzp820927
Copy link

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

@hwx7hao
Copy link

hwx7hao commented Apr 30, 2016

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

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants