Archives
-
网络安全通讯(5)—-支持客户端验证的python web server
前面我们说道很多的场景是需要客户端验证(Client Certificate)的,而python的web server如何支持呢?大多数的python web server都是符合WSGI标准的,也就是他们提供WSGI标准支持的功能,也就是他们几乎都不支持WSGI不支持的功能。很遗憾,客户端验证不在此列。换句话说,Cherrypy,webpy等常用的python web server都无法支持客户端验证。 我终于找到了Twisted(他怎么一下从2.5就蹦到了8.0.1)的web模块可以作为一个单独的web server。而这个web模块是包装的很底层的,使用pyopenssl,并且不是WSGI的一个实现。也就是说,他很可能是支持客户端验证的。经过一番google,发现了支持的办法。如下:首先我们看一下如何让Twisted支持HTTPS,他需要执行reactor.listenSSL方法, class Hello(Resource) : isLeaf = True def render(self, request) : return ‘Hello, SSL’root = server.Site(Hello())ctxFactory = ssl.DefaultOpenSSLContextFactory( ‘/path/to/server.key’, ‘/path/to/server.crt’ )reactor.listenSSL(443, root, contextFactory = ctxFactory)reactor.run() 这是最基本的支持HTTPS的方法,我们看,他需要一个contextFactory,深入到Twisted里面发现这个contextFactory是SSL进行设置。我们想要他支持客户端验证,就要从这里下手了。DefaultOpenSSLContextFactory的cacheContext方法是对context进行的操作。我们重写这个方法。 class SSLClientCertificateFactory(ssl.DefaultOpenSSLContextFactory) : def __init__(self, privateKeyFileName, certificateFileName, sslmethod=SSL.SSLv23_METHOD) : ssl.DefaultOpenSSLContextFactory.__init__(self, privateKeyFileName, certificateFileName, sslmethod) def _verify(self, connection, x509, errnum, errdepth, [...]
-
网络安全通讯(4)—-为Python Webserver添加HTTPS支持
前面我们说的都是为Apache服务器添加HTTPS的支持,今天我们讨论一下为Python的Webserver添加HTTPS的支持。 Python的Webserver基本上都是遵循Python的WSGI标准,包括我使用的CherryPy和webpy。在这两个Webserver的源代码中都有一个package叫做wsgiserver,里面只有__init__.py。这两个Webserver的wsgiserver内容几乎一样,而且明显有CherryPy的痕迹,看来CherryPy可能是WSGI标准的一个(半)官方实现,就好像Tomcat至于Servlet。 WSGI标准写的很是笼统,他只是说可以支持SSL,无他。只好阅读源代码,代码里面写的倒不是很差。需要同时给出ssl需要的服务器端的私钥和证书,分别使用如下两个变量存放。ssl_certificate: the filename of the server SSL certificate. 服务器端的SSL证书ssl_privatekey: the filename of the server’s private key file. 服务器端的私钥我们只要遵循每个服务器的文档设置上就可以了。我们以CherryPy为例。(好吧,我说实话,我只会这个。) 在CherryPy的配置文件里面,可以设置这两个变量,分别指向文件系统的文件。[global]server.socket_port : 8081server.socket_host : “0.0.0.0″server.ssl_certificate : “conf/cert/server.crt”server.ssl_private_key : “conf/cert/server.key”这样,当我们重新启动的时候,我们的webserver就已经开始支持HTTPS了。如果这两个变量有一个没有设置的话,HTTPS就不会起作用。 这里我不得不说一下,CherryPy的文档已经算是不错的了,但是还是不行,只有在ServerAPI里面稍微提及了一下这两个变量而已。想要完整的搞明白,就只能祭出hack源代码大发,还得有连蒙带唬的功能。 至于webpy,就最好看看他的文档了。
-
网络安全通讯(3)—-相信你的客户
在前两篇文章中网络安全通讯(1)—-给你的Webserver启用SSL网络安全通讯(2)—-让别人相信你的服务器我们探讨了如何让你的客户相信你的服务器,这篇文章我们探讨一下你如何去相信你的客户。 在很多场景下,我们是需要关心客户的身份的,一个很安全的做法就是给你的客户发放一个签名的证书,让你的客户拿着证书来,这时候你验证了证书,你也就相信了你的客户。我们可以使用Apache提供的客户端验证(Client Certificate)功能。 生成客户端的私钥和CSR文件openssl genrsa -out client.key 1024openssl req -new -key client.key -out client.csr 用前面我们自己的CA签发客户的证书openssl x509 -req -days 360 -in client.csr -CA ca.crt -CAkey ca.key -CAserial ca.srl -out client.crt 此时客户端的证书已经制作完毕(和制作Server的一样),但是我们的浏览器需要pkcs12格式的文件,所以我们需要签一个pkcs12格式的文件openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12 -name your_certificate_client_name这里需要你的client的CSR文件设置的密码,还有your_certificate_client_name替换成你client的名字 打开Apache需要客户验证的设置SSLVerifyClient requireSSLVerifyDepth 1SSLCACertificateFile “/path_to/ca.crt” 重新启动apache,尝试一下访问,此时访问并不成功Firefox会包一个-12227的错误,IE干脆显示不出来,说明客户端验证没有通过 把生成的客户端pkcs12文件导入到浏览器,Firefox Tools->Options->Advanced->Encryption->View Certificates->Your Certificates->ImportIE Tools->Internet Options->Content->Certificates->Personal->Import 再次访问服务器,It works. 此时你的客户端(也就是浏览器)可以通过服务器的验证了。你也可以相信你的客户了。
Mar 3rd, 2008 | Filed under 安全 -
网络安全通讯(2)—-让别人相信你的服务器
上文(网络安全通讯(1)—-给你的Webserver启用SSL)我们讲解了我们如何能够保证我们的服务器和客户端之间的安全通讯。 但是有些时候,用户凭什么相信你呢,你总得想办法证明你的身份吧。该CA(Certificate Authority)出场了,CA是一个大家都相信的第三方,因为你的客户相信CA,而CA又说你(你的服务器)是可以被信任的,那么你的客户就会相信你。所以刚才那个自签名的证书可是不行,你需要ca用他的key给你签个名字,这样别人才相信不是。Q:我们不认识CA怎么办?A:去公认的CA申请啊!Q:难道就我们自己用也要申请?A:好吧,我们可以自己假装自己就是CA,只要大家相信你就好。 我们开始假装CA,创建自己的CA。 1. 建立CA私钥 openssl genrsa -out ca.key 1024 2. 建立自己的CRT文件 openssl req -new -x509 -key ca.key -out ca.crt -days 3600 3. 用自己的CA文件签署刚刚的服务器CSR,生成服务器证书 openssl x509 -req -days 360 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt 注意,这里的参数-CAcreateserial会建立一个serial文件ca.srl,用来记录ca的serial number,如果你已经有了这个文件,那么请使用-CAserial serial_file替换-CAcreateserial参数。 4. 使用新的server.key和server.crt文件,重启apache,再次访问。看一下你的浏览器说什么,是不是此时的Issuer已经是你自己的CA了? 如果你是使用第三方的CA,你就需要把你的server.csr发给他们,然后他们会签一个证书发挥给你的。 此时我们的客户已经相信了你的服务器了。好了本本没电了,明天我们再讨论如何相信你的客户吧。
Mar 3rd, 2008 | Filed under 安全 -
网络安全通讯(1)—-给你的Webserver启用SSL
互联网很危险,你还是回火星吧。好吧,我们还有SSL,你可以等一下了。 先说一下这里面用到的库OpenSSL 0.9.8gApache Httpd 2.2 SSL是一个可以保证你的通讯安全的机制,采用公钥私钥的非对加密机制,具体机制我就不说了,网上一抓一大把。你可以使用openssl建立自己的密钥,并使用在Apache Webserver上,让你的服务器支持https。 建立你自己的服务器私钥,一个1024位的就够了openssl genrsa -des3 -out server.key 1024 生成CSR文件,Certificate Signing Requestopenssl req -new -key server.key -out server.csr 生成证书CRT文件,X509协议openssl x509 -req -in server.csr -signkey server.key -out server.crt注意,这是一个自签名的证书 修改你apache的ssl配置,SSLCertificateFile “/path-to/server.crt”SSLCertificateKeyFile “/path-to/server.key” 启动你的apache,使用https访问试试看,是不是要你确认是否允许证书通过 这时候,你的服务器已经支持SSL了,刚才浏览器问你是否通过你服务器提供的证书是表示客户端(浏览器)信任了你的服务器,这里也就是服务器认证。你们之间的通讯已经是加密的了。
Mar 2nd, 2008 | Filed under 安全