#coding=utf-8
'''
Created on 2016年1月5日
@author: duqiong
'''
企业1,服务器,假设,银行
import socket, ssl,pprint
import time
#cacrtf="ca/ca.crt
cacrtf ="ca-cert.pem"#客户端证书CA,服务端用来验证,客户端的client-cert.pem是有效的,是可信任的!所以ca-cert.pem应该是client-cert.pem签发根证书的上游,也可以是根证书。,
crtf="ca/server.crt"#公钥,也代表服务端的唯一认证
keyf="ca/server.key"#私钥,#在ssl握手时服务器将公钥发给客户端,客户端用公钥加密之后发给服务端,服务端可以通过私钥解密
server_sc = socket.socket()
server_sc.bind(('', 10023))
server_sc.listen(5)
newsocket, addr = server_sc.accept()
sc = ssl.wrap_socket(newsocket,
server_side=True,#表示是服务端行为,必须参数
certfile=crtf,#自己的公钥,必须参数
keyfile=keyf,#自己的私钥,必须参数
cert_reqs=ssl.CERT_REQUIRED,#客户端必须要带自己的证书过来,即公钥,如果单向认证,这个cert_reqs, ca_certs两个参数没有。
ca_certs=cacrtf)#并且用这个根证校验客户商上传过来的证书是否可信任的
data = sc.read()
print data
print pprint.pformat(sc.getpeercert())
sc.write('Back time: ' + str(time.time()))
sc.close()
server_sc.close()
#coding=utf-8
'''
Created on 2016年1月4日
@author: duqiong
'''
发起支付,客房端
import socket, ssl, pprint
import time
cacrtf="ca/ca.crt"#服务端证书CA,或者root证书,或者load_defaultpath_certs /etc/certs/*
crtf = "client-cert.pem"#客户端的公钥
keyf = "client-key.pem"#客户端的私钥
在ssl握手时将公钥发给服务端,服务端用公钥加密之后发给过来,通过私钥解密,这些发生在tcp上层ssl/stl实现的
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_socket = ssl.wrap_socket(socket, ca_certs=cacrtf,#可选,用这个校验服务端的证书是否可信任的,如果单向认证,这个cert_reqs, ca_certs两个参数没有。
certfile=crtf,#可选,如服务端cert_reqs=ssl.CERT_REQUIRED,则这个为必须填
keyfile=keyf,#可选,如服务端cert_reqs=ssl.CERT_REQUIRED,则这个为必须填
cert_reqs=ssl.CERT_REQUIRED)#可选,是否校验服务端的证书可信任。如果不校验就用charles抓https包,否则被客户端因为ssl_handshake失败而关闭连接。
print ssl_socket.context.get_ca_certs(binary_form=False)#打印自己能识别的多个证书的信息
ssl_socket.connect(('192.168.1.105', 10023))
print ssl_socket.cipher()#打印客户端与服务端最终确定的加密组合
print repr(ssl_socket.getpeername())
print pprint.pformat(ssl_socket.getpeercert())#打印服务商的证书信息
ssl_socket.write("Time: %s\r\n" % time.time())
data = ssl_socket.read()
print data
ssl_socket.close()