文档库 最新最全的文档下载
当前位置:文档库 › 用openssl进行SSL编程

用openssl进行SSL编程

主要介绍openssl进行ssl通信的一些函数以及过程,主要是初始化过程,至于数据的接收以及后续处理可以具体问题具体分析。
load所有的ssl算法
openssl_add_ssl_algorithms();
建立ssl所用的method
ssl_method *meth=sslv23_method();
初始化上下文情景
ssl_ctx *ctx=ssl_ctx_new(meth);
ret->quiet_shutdown=1;默认的是ret->quiet_shutdown=0;他相当于ssl_set_shutdown函数将参数设置为ssl_sent_shutdown|ssl_received_shutdown
当设置为1时,假如关闭后,不通知对方,这样不适合tls标准
ssl_ctx_set_quiet_shutdown(ctx,1);
ctx->options|=ssl_op_all,ssl/tls有几个公认的bug,这样设置会使出错的可能更小
ssl_ctx_set_options(ctx,ssl_op_all);
设置cache的大小,默认的为1024*20=20000,这个也就是可以存多少个session_id,一般都不需要更改的。假如为0的话将是无限
ssl_ctx_sess_set_cache_size(ctx,128);
ssl_ctx_load_verify_locations用于加载受信任的ca证书,cafile如果不为null,则他指向的文件包含pem编码格式的一个或多个证书,可以用e.g.来简要介绍证书内容
capath如果不为null,则它指向一个包含pem格式的ca证书的目录,目录中每个文件包含一份ca证书,文件名是证书中ca名的hash值
可以用c-rehash来建立该目录,如cd /some/where/certs(包含了很多可信任的ca证书) c_rehash .。返回一成功,0 失败。ssl_ctx_set_default_verify_paths找寻默认的验证路径,在这里肯定找不到的。
这里主要set cert_store
char *cafile=null,*capath=null;
ssl_ctx_load_verify_locations(ctx,cafile,capath);
当需要客户端验证的时候,服务器把cafile里面的可信任ca证书发往客户端。
if(cafile !=null )ssl_ctx_set_client_ca_list(ctx,ssl_load_client_ca_file(cafile));
设置最大的验证用户证书的上级数。
ssl_ctx_set_verify_depth(ctx,10);
当使用rsa算法鉴别的时候,会有一个临时的dh密钥磋商发生。这样会话数据将用这个临时的密钥加密,而证书中的密钥中做为签名。
所以这样增强了安全性,临时密钥是在会话结束消失的,所以就是获取了全部信息也无法把通信内容给解密出来。
static unsigned char dh512_p[]={
0xda,0x58,0x3c,0x16,0xd9,0x85,0x22,0x89,0xd0,0xe4,0xaf,0x75,
0x6f,0x4c,0xca,0x92,0xdd,0x4b,0xe5,0x33,0xb8,0x04,0xfb,0x0f,
0xed,0x94,0xef,0x9c,0x8a,0x44,0x03,0xed,0x57,0x46,0x50,0xd3,
0x69,0x99,0xdb,0x29,0xd7,0x76,0x27,0x6b,0xa2,0xd3,0xd4,0x12,
0xe2,0x18,0xf4,0xdd,0x1e,0x08,0x4c,0xf6,0xd8,0x00,0x3e,0x7c,
0x47,0x74,0xe8,0x33,
};
static unsigned char dh512_g[]={0x02,};
dh *dh=dh_new();
dh->p=bn_bin2bn(dh512_p,sizeof(dh512_p),null);
dh->g=bn_bin2bn(dh512_g,sizeof(dh512_g),null);
ssl_ctx_set_tmp_dh(ctx,dh);
下面加载服务器的证书和私钥,私钥可以和证书在一个文件之中。判断私钥和证书是否匹配。
char *s_cert_file="server.pem";

char *s_key_file=null;
ssl_ctx_use_certificate_file(ctx,s_cert_file,ssl_filetype_pem);
获取私钥之前先把私钥的密码给写上
char *pkeypasswd="serve";
ssl_ctx_set_default_passwd_cb_userdata(ctx, pkeypasswd);
ssl_ctx_use_privatekey_file(ctx,s_cert_file,ssl_filetype_pem);
ssl_ctx_check_private_key(ctx);
设置一个临时的rsa,在出口算法中,有规定需要这么做的。
rsa *rsa=rsa_generate_key(512,rsa_f4,null,null);
ssl_ctx_set_tmp_rsa(ctx,rsa);
用于设置验证方式。s_server_verify是以下值的逻辑或
ssl_verify_none表示不验证,ssl_verify_peer用于客户端时要求服务器必须提供证书,用于服务器时服务器会发出证书请求消息要求客户端提供证书,但是客户端也可以不提供
ssl_verigy_fail_if_no_peer_cert只适用于服务器且必须提供证书。他必须与ssl_verify_peer一起使用
当ssl_verify_peer被设置时verify_callback可以控制验证的行为。任何一个验证失败信息都会终止tls连接
static int s_server_verify=ssl_verify_none;
ssl_ctx_set_verify(ctx,ssl_verify_peer,null/*verify_callback*/);
为了从自己本身的程序中产生一个session_id,所以要给本程序设定一个session_id_context,否则程序从外部获取session_id_context来得到session_id,那很容易产生错误
长度不能大于ssl_max_ssl_session_id_length
const unsigned char s_server_session_id_context[100]="1111asdfd";
ssl_ctx_set_session_id_context(ctx,s_server_session_id_context,sizeof s_server_session_id_context);
return ctx;

相关文档
相关文档 最新文档