数据传输中记录层(Record layer)用于封装更高层的HTTP等协议。记录层数据可以被随意压缩、加密,与消息验证码压缩在一起。每个记录层包都有一个Content-Type段用以记录更上层用的协议。
使用SSL层接口函数有以下几个步骤:
1、初始化OpenSSL库
初始化函数列出如下:
#define OpenSSL_add_ssl_algorithms()SSL_library_init()
#define SSLeay_add_ssl_algorithms() SSL_library_init()
2、选择会话协议
客户端使用下面的函数选择会话协议:
const SSL_METHOD *SSLv2_client_method(void);/* SSLv2 */
const SSL_METHOD *SSLv3_client_method(void);/* SSLv3 */
const SSL_METHOD *SSLv23_client_method(void);/* SSLv3 but can rollback to v2 */
const SSL_METHOD *TLSv1_client_method(void);/* TLSv1.0 */
const SSL_METHOD *DTLSv1_client_method(void);/* DTLSv1.0 */
服务器端使用下面的函数选择会话协议:
const SSL_METHOD *SSLv2_server_method(void);/* SSLv2 */
const SSL_METHOD *SSLv3_server_method(void); /* SSLv3 */
const SSL_METHOD *SSLv23_server_method(void); /* SSLv3 but can rollback to v2 */
const SSL_METHOD *TLSv1_server_method(void); /* TLSv1.0 */
const SSL_METHOD *DTLSv1_server_method(void); /* DTLSv1.0 */
3、创建会话环境
创建会话环境:
SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth);
设置证书验证方式:
void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,
int (*callback)(int, X509_STORE_CTX *));
给会话环境加载CA证书:
int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x);
int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, const unsigned char *d);
给会话环境加载用户私钥:
int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey);
int SSL_CTX_use_PrivateKey_ASN1(int pk,SSL_CTX *ctx,
const unsigned char *d, long len);
验证私钥和证书是否相符:
int SSL_CTX_check_private_key(const SSL_CTX *ctx);
4、建立SSL套接字
SSL套接字建立在普通的TCP套接字基础上,应用程序在创建普通套接字、得到套接字描述符fd之后,再创建SSL套接字,并将fd绑定在SSL套接字上。
SSL *SSL_new(SSL_CTX *ctx);
intSSL_set_fd(SSL *s, int fd);
int SSL_set_rfd(SSL *s, int fd);
int SSL_set_wfd(SSL *s, int fd);
5、完成SSL握手
与普通socket编程类似,创建SSL套接字后,客户端使用SSL_connect替代普通socket的connect函数,服务器端则以SSL_accept代替普通socket的accept()函数。
int SSL_accept(SSL *ssl);
int SSL_connect(SSL *ssl);
握手完成之后,询问通信双方的证书信息:
X509 *SSL_get_peer_certificate(const SSL *s);
X509_NAME *X509_get_subject_name(X509 *a); // <openssl/x509.h>
6、数据传输
对数据的安全传输包括了加密/解密、压缩/解压缩的过程。
int SSL_read(SSL *ssl,void *buf,int num);
int SSL_peek(SSL *ssl,void *buf,int num);
int SSL_write(SSL *ssl,const void *buf,int num);
7、SSL通信结束
关闭SSL套接字、释放会话环境。
int SSL_shutdown(SSL *s);
voidSSL_free(SSL *ssl);
voidSSL_CTX_free(SSL_CTX *);