mbedtls的sslx509协议API
Nginx+openssl的web https访问:
1证书的⽣成:
openssl genrsa -des3 -out host.key 2048
⽣成签发机构密钥
openssl req -new -x509 -days 7305 -key host.key -
⽣成签发⽤证书
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 - -keyfile host.key -in applier.csr - Ca对applier.csr签名并发布证书
//认证环境
mkdir -p CA/newcerts
touch
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 / #提供证书
Ssl_certificate_key /path/applier.key #提供解密私钥
}
访问时通过https协议直接访问localhost,此时浏览器会与服务器握⼿并收到证书消息,由于试验中使⽤的⾃签名证书,因此浏览器会提⽰证书不可信,将此证书添加到exception中即可访问。在服务器发给客户机的证书报⽂段中,包含有服务器证书的公钥;客户机接收到该报⽂段后,按照协议规定,从报⽂段的对应位置中读取出服务器证书的公钥存⼊相关变量中。
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;⽤私钥加密后的签名nginx ssl证书配置
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来验证椭圆曲线是否正确。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论