1. 如何用 python 解析 ssl 证书文件
PyOpenSSL
OpenSSL.SSL.Connection()
get_peer_certificate()
get_peer_cert_chain()
2. python报错urllib.error.URLError: <urlopen error unknown url type: src="https>,Windows系统怎么解决
jango站点使用django_cas接入SSO(单点登录系统),配置完成后登录,抛出“urlopen error unknown url type: https”异常。寻根朔源发现是python内置的urllib模块不支持https协议。
>>> import urllib
>>> urllib.urlopen('htom')
<addinfourl at 269231456 whose fp = <socket._fileobject object at 0xff98250>>
>>> urllib.urlopen('hm')
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
File "/usr/local/python27/lib/python2.7/urllib.py", line 86, in urlopen
return opener.open(url)
File "/usr/local/python27/lib/python2.7/urllib.py", line 204, in open
return self.open_unknown(fullurl, data)
File "/usr/local/python27/lib/python2.7/urllib.py", line 216, in open_unknown
raise IOError, ('url error', 'unknown url type', type)
IOError: [Errno url error] unknown url type: 'https'
之所以python内置的urllib模块不支持https协议是因为编译安装python之前没有编译安装类似于openssl这样的SSL库,以至于python不支持SSL
因为我用的是Centos系统所以安装openssl-devel
sudo yum install openssl-devel
之后重新编译Python
./configure(可选,因为之前已经配置过,按之前的配置来就行了,而且最好按之前的配置配编译安装以免依赖的库需要重新编译安装。)
make
make install
>>> import urllib
>>> urllib.urlopen('htt.com')
没有再报同样的错误。
在安装完openssl-devel后重新编译python前也有说需要编辑Moles文件夹内Setup.dist文件的
修改
# Socket mole helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
#SSL=/usr/local/ssl
#_ssl _ssl.c \
# -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
# -L$(SSL)/lib -lssl -lcrypto
为
# Socket mole helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
SSL=/usr/local/ssl
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto
但实际测试下来好像并不需要修改这个文件,编译的时候能自动将SSL库编译进python中。
另外需要特别注意的是,重新编译安装python后,通过可执行文件名(可能是个连接文件)运行python可能运行的还是老的python,这是因为可执行文件名没有连接到新的python可执行程序。因此要用最新的python可执行文件名或指向该名字的连接来运行python。
重新编译安装python后有可能导致需要重新编译django,MySQLdb,pycrypto,python-ldap,django-auth-ldap,django_cas,django_cas,pymongo等一些列依赖python的模块。这里要特别注意
3. python环境设置ssl
爬取数据需要用python请求网络数据, https的加密实现依赖openssl
利用源码直接安装
安装zlib库
安装openssl到 /usr/local/openssl 目录,安装之后,编译
安装结束后执行以下命令
进入/usr/local目录下,执行以下命令
在/etc/ld.so.conf文件的最后面,添加如下内容:/usr/local/openssl/lib
然后执行以下命令
添加OPESSL的环境变量,在etc/的profile的最后一行,添加:
查看openssl版本
使用源码按过于繁琐,如果对软件版本没有特殊要求的话可以使用yum命令安装和更新,既方便又快捷
先看下ssl有没有被引入
报错是因为python没有带--with-ssl 选项编译
修改Setup.dist文件 (把Setup这个不带后缀的也一起改了)
修改结果如下:(去掉最后4行的注释)
切到python文件夹下
完成之后
没有报错, 大功告成
参考链接
ImportError: No mole named _ssl
linux上安装Openssl步骤详解
4. Anaconda python 中 SSL模块无法正常使用
2.conda创建的环境中因为pip缺少ssl无法安装包,可将
从 D:\miniconda\envs\py37\Library\bin 粘贴至 D:\miniconda\envs\py37\DLLs
5. 怎么样在windows上安装Python的SSL mole
1、说明:win7安装python非常简单,只要到官方网站下载然后直接安装即可。2、步骤:1)打开python官方网站windows版下载地址https://www.python.org/downloads/windows/
以python2.7为例,选择python2.7.11,打开下载页面,按操作系统位(32或者64)选择相应版本下载,等待下载完成。
2)下载完成后,双击下载的安装文件。
3)选择Install for all users即可,点Next
4)选择安装的路径,默认即可。
5)选择安装的组件,默认即可,也可以把选上Add Python.exe to Path,就是添加到环境变量,可以使用户直接在cmd下执行python。选好后点下一步。
6)等待安装完成后,点Finish即可。
3、验证安装安装完成后开始菜单会出现如下菜单
点击菜单IDLE (Python GUI),出现IDLE窗口,输入一个简单的程序,回车运行如下,就说明安装成功
6. 321.【python】_ssl 模块支持
记录一下搭建环境是遇到的 python 里出现的 缺少 _ssl 模块的问题。
当我们直接配置的时候,会缺少 _ssl ,所以我们在使用 configure 配置前,先编辑 ${python_install_dirctory}/Mole/Setup 文件,如下所示:
将第210、215、216、217 行的注释去了,去了之后,再执行配置安装即可。
Linux 的学习是使用基本上都得面临枯燥的黑窗口,慢慢来吧。
7. 解决Python找不到ssl模块问题 No mole named _ssl
python安装完毕后,提示找不到ssl模块:
解决方法:
查看安装结果
[ [email protected] ~]$ rpm -aq|grep openssl
openssl-devel-1.0.1e-57.el6.x86_64
openssl-1.0.1e-57.el6.x86_64
8. 如何验证在Python SSL证书
importos
importglob
fromOpenSSL.SSLimportContext,TLSv1_METHOD,VERIFY_PEER,VERIFY_FAIL_IF_NO_PEER_CERT,OP_NO_SSLv2
fromOpenSSL.cryptoimportload_certificate,FILETYPE_PEM
fromtwisted.python.urlpathimportURLPath
fromtwisted.internet.sslimportContextFactory
fromtwisted.internetimportreactor
fromtwisted.web.clientimportgetPage
certificateAuthorityMap={}
forcertFileNameinglob.glob("/etc/ssl/certs/*.pem"):
#,solet'smakesureit'sreal.
ifos.path.exists(certFileName):
data=open(certFileName).read()
x509=load_certificate(FILETYPE_PEM,data)
digest=x509.digest('sha1')
#Now,de-.
certificateAuthorityMap[digest]=x509
(ContextFactory):
def__init__(self,hostname):
self.hostname=hostname
isClient=True
defgetContext(self):
ctx=Context(TLSv1_METHOD)
store=ctx.get_cert_store()
.values():
store.add_cert(value)
ctx.set_verify(VERIFY_PEER|VERIFY_FAIL_IF_NO_PEER_CERT,self.verifyHostname)
ctx.set_options(OP_NO_SSLv2)
returnctx
defverifyHostname(self,connection,x509,errno,depth,preverifyOK):
ifpreverifyOK:
ifself.hostname!=x509.get_subject().commonName:
returnFalse
returnpreverifyOK
defsecureGet(url):
returngetPage(url,HTTPSVerifyingContextFactory(URLPath.fromString(url).netloc))
defdone(result):
print'Done!',len(result)
secureGet("https://google.com/").addCallback(done)
reactor.run()
这个验证要安装Twisted 库。
当然这样的库好多,如:pycurl,requests,M2Crypto
importrequests
requests.get('https://somesite.com',cert='/path/server.crt',verify=True)
9. 如何使用证书存储在python中的字符串变量打开ssl套接字
查看源代码,ssl.wrap_socket直接调用本地代码(openssl)函数SSL_CTX_use_cert_chain_file,它需要一个文件的路径,因此您无法做的是尝试做的。
参考:
在ssl / init .py中,我们看到:
def wrap_socket(sock,keyfile =无,certfile =无,
server_side = False,cert_reqs = CERT_NONE,
ssl_version = PROTOCOL_SSLv23,ca_certs = None,
do_handshake_on_connect = True):
return SSLSocket sock,keyfile = keyfile,certfile = certfile,
server_side = server_side,cert_reqs = cert_reqs,
ssl_version = ssl_version,ca_certs = ca_certs,
do_handshake_on_connect = do_handshake_on_connect)
将我们指向SSLSocket构造函数(它在同一个文件中),我们看到以下情况:
self._sslobj = _ssl2.sslwrap(self._sock,server_side,
keyfile,certfile,
cert_reqs,ssl_version,ca_certs)
_ssl2在C(_ssl2.c)中实现
查看sslwrap函数,我们看到它正在创建一个新对象:
return(PyObject *)newPySSLObject(Sock,key_file ,cert_file,
server_side,verification_mode,
protocol,cacerts_file);
查看该对象的构造函数,我们最终会看到:
ret = SSL_CTX_use_certificate_chain_file(self-> ctx,
cert_file);
这个函数在openssl中定义,所以现在我们需要切换到那个代码库。
在ssl / ssl_rsa.c中,我们最终在函数中找到:
BIO_read_filename in,file)
如果你深入到BIO代码(openssl的一部分)最终成为正常的fopen():
fp = fopen(ptr,p)
所以它看起来像它当前写的。它必须在C的fopen()可打开的文件中。
此外,由于python的ssl库很快跳转到C,我在一个解决方法中看不到一个明显的monkeypatch的地方。