一般情况下ssl加密连接都只是单向认证,是客户端验证服务端的证书。例如常见的web服务,是客户端验证服务端的证书,防止遇到假冒的网站,正规的网站都有权威机构签名的证书,浏览器会帮助用户校验服务端的证书,如果证书是可信的,说明网站是可信的可如果证书不可信,浏览器会有提示,提示一般在地址栏前面有个锁形符号。
服务端在发送完server hello后将自己的证书发送给客户端,客户端此时可选的验证服务端的证书。客户端虽然是可选验证,但是连接仍然是加密连接,只是没有验证连接对端的身份。客户端用服务端证书的公钥加密一个预主密钥发送给服务端,以供双方后续产生加密密钥。
双向认证是在建立一个加密连接时,双方互相验证对方的身份,此时在上述一般情况下ssl加密连接的基础上,客户端也要提供自己的证书以供服务端验证,如果证书不正确,服务端会断开连接。双向认证时双方可以使用密钥协商算法协商出一个预主密钥,供后续产生加密密钥。
服务端的代码如下:
int loadCertFile(SSL_CTX* ctx, const char* CertFile, const char* KeyFile, const char* caFile)
{
if(!ctx)
{
return errcode;
}
// load cert
if(CertFile && SSL_CTX_use_certificate_file(ctx, CertFile, SSL_FILETYPE_PEM) <= 0)
{
return errcode;
}
// load private key
if(KeyFile && SSL_CTX_use_PrivateKey_file(ctx,KeyFile, SSL_FILETYPE_PEM) <= 0)
{
return errcode;
}