双向认证实例

#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()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值