mbedtls的ssl x509协议API

Nginx+openssl的web https访问:

1证书的生成:

openssl genrsa -des3 -out host.key 2048

生成签发机构密钥

openssl req -new -x509 -days 7305 -key host.key -out host.crt

生成签发用证书

openssl genrsa -des3 -out applier.pem 1024

请求认证的公司生成私钥

openssl rsa -in applier.pem -out applier.key

生成applier.pem对应的解密密钥applier.key

openssl req -new -key applier.pem -out applier.csr

请求认证的证书申请

openssl ca -policy policy_anything -days 1460 -cert host.crt -keyfile host.key -in applier.csr -out applier.crt

Ca对applier.csr签名并发布证书applier.crt

//认证环境

mkdir -p CA/newcerts

touch CA/index.txt

touch CA/serial

echo "01" > CA/serial


2 Nginx的配置

Server{

Listen 443 ssl default_server;

Index index.html index.htm;

Location / {

Root /rootdir

}

Ssl on

Ssl_certificate /path/applier.crt   #提供证书

Ssl_certificate_key /path/applier.key  #提供解密私钥

}

访问时通过https协议直接访问localhost,此时浏览器会与服务器握手并收到证书消息,由于试验中使用的自签名证书,因此浏览器会提示证书不可信,将此证书添加到exception中即可访问。在服务器发给客户机的证书报文段中,包含有服务器证书的公钥;客户机接收到该报文段后,按照协议规定,从报文段的对应位置中读取出服务器证书的公钥存入相关变量中。

与网站建立SSL安全连接时使用https协议,即采用https://ip:port/的方式来访问。浏览器与Web Server之间要经过一个握手的过程来完成身份鉴定与密钥交换,从而建立安全连接。具体过程如下:

1用户浏览器将其SSL版本号、加密设置参数、与session有关的数据以及其它一些必要信息发送到服务器。

服务器将其SSL版本号、加密设置参数、与session有关的数据以及其它一些必要信息发送给浏览器,同时发给浏览器的还有服务器的证书。如果配置服务器的SSL需要验证用户身份,还要发出请求要求浏览器提供用户证书。

2客户端检查服务器证书,如果检查失败,提示不能建立SSL连接。如果成功,那么继续。客户端浏览器为本次会话生成pre-master secret,并将其用服务器公钥加密后发送给服务器。如果服务器要求鉴别客户身份,客户端还要再对另外一些数据签名后并将其与客户端证书一起发送给服务器。

如果服务器要求鉴别客户身份,则检查签署客户证书的CA是否可信。如果不在信任列表中,结束本次会话。如果检查通过,服务器用自己的私钥解密收到的pre-master secret,并用它通过某些算法生成本次会话的master secret。

3客户端与服务器均使用此master secret生成本次会话的会话密钥(对称密钥)。在双方SSL握手结束后传递任何消息均使用此会话密钥。这样做的主要原因是对称加密比非对称加密的运算量低一个数量级以上,能够显著提高双方会话时的运算速度。  客户端通知服务器此后发送的消息都使用这个会话密钥进行加密。并通知服务器客户端已经完成本次SSL握手。 服务器通知客户端此后发送的消息都使用这个会话密钥进行加密。并通知客户端服务器已经完成本次SSL握手。

x509协议api

证书的初始化函数:

void mbedtls_x509_crt_init( mbedtls_x509_crt *crt ){

memset( crt, 0, sizeof(mbedtls_x509_crt) );}

证书的空间释放函数

void mbedtls_x509_crt_free( mbedtls_x509_crt *crt )

证书结构:

typedef struct mbedtls_x509_crt

{

mbedtls_x509_buf raw;随机数据

mbedtls_x509_buf tbs;签名

int version;版本

mbedtls_x509_buf serial;           CA颁发的唯一序列号

mbedtls_x509_buf sig_oid;签名算法,比如. sha1RSA *

mbedtls_x509_time valid_from;证书有效起始时间

mbedtls_x509_time valid_to;证书失效时间

mbedtls_pk_context pk;公钥容器

int ext_types;              /**< Bit string containing detected and parsed extensions */

int max_pathlen;最大路径长度

mbedtls_x509_buf sig;用私钥加密后的签名

mbedtls_md_type_t sig_md;信息摘要生成算法名称. MBEDTLS_MD_SHA256mbedtls_pk_type_t sig_pk;签名加密算法集的名称MBEDTLS_PK_RSA */

struct mbedtls_x509_crt *next;指向下一个证书的指针

}

Mbedtls中的握手:

客户端函数

int mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl )

输入参数为ssl_context为安全连接的配置参数,包含了握手状态、握手参数、会话数据、客户端ID以及相关回调入口等参数。

以下程序摘自ssl_tls.c文件,可以看出mbed根据宏定义分别实现了server端和client端

#if defined(MBEDTLS_SSL_CLI_C)

if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )

ret = mbedtls_ssl_handshake_client_step( ssl );

#endif

#if defined(MBEDTLS_SSL_SRV_C)

if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )

ret = mbedtls_ssl_handshake_server_step( ssl );

#endif

Client端的逻辑:

Client发起clienthello请求后,server回serverhello包以及certificate(如果对客户端有认证需求则会跟随发送一个certificate request包来请求客户端的证书),之后client开始分析传来的server证书是否有效合法:

首先确认是否需要证书验证,通过判断ssl->transform_negotiate->ciphersuite_info字段

MBEDTLS_KEY_EXCHANGE_ECJPAKE,

MBEDTLS_KEY_EXCHANGE_PSK,

MBEDTLS_KEY_EXCHANGE_DHE_PSK,

MBEDTLS_KEY_EXCHANGE_ECDHE_PSK

以上四种psk加密套件不需要证书交互,需要证书的加密套件如下:

MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,

MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,

MBEDTLS_KEY_EXCHANGE_ECDH_RSA,

MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,

其次验证证书的有效性:mbedtls_x509_crt_verify_with_profile是x509_crt.c中的验证函数,其输入参数是会话的peer证书、证书链、可信ca列表、认证配置文件、以及认证参数等。

1、对比CN字段是否匹配,若不匹配返回CN_MISMATCH错误---x509_memcasecmp函数

2、根据配置文件检查密钥大小和类型是否正确,不正确返回BAD_KEY错误----x509_profile_check_key函数

3、判断CA的签发方以及父签发方(签发链)是否可信-----x509_crt_check_parent函数

验证完毕后,会判断证书使用的是否是EC密钥,如果是的话会使用函数mbedtls_ssl_check_curve来验证椭圆曲线是否正确。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容