注:以下代码未经验证
名词解释:
HTTPS Secure Hypertext Transfer Protocol 安全超文本传输协议
SSL secure socket layer 安全套接字
OpenSSL Open Source toolkit implementing the SSL SSL的开放源码实现
CA certificate authority 授权证书
X.509 由国际电信联盟(ITU-T)制定的数字证书标准
BIO OpenSSL的IO抽象层
设计思想:
HTTP服务器是正常的CS模型,一来一回模式,Client发出HTTP请求,服务器处理HTTP请求,并将结果按照HTTP封装返回。
而SSL在协议栈中位置如下:
SSL协议分为Handshake和Record两个部分,Handshake负责服务器客户端的建立连接,Record处理压缩,加密等具体操作。
在正常的HTTP服务器中加入SSL功能,则可以在TCP处理之后,HTTP处理之前,加入SSL的功能。
网络上比较知名的SSL库有openssl库,可以很方便的实现SSL功能,主页为http://www.openssl.org/
测试代码服务器为基本的HTTP服务器,使用最原始的非并发套接字,Socket流程,HTTP流程略过。
基本代码:
- void main ()
- {
- SSL *ssl;
- BIO *io, *ssl_bio;
- SSL_METHOD *method;
- SSL_CTX *ctx;
- SSL_library_init(void); /* load & register all cryptos, etc. */
- SSL_load_error_strings (); /* load all error messages */
- //设定SSL的版本
- method = SSLv2_server_method (); /* create new server-method instance */
- //得到SSL上下文对象,内部包含了很多SSL的属性和回调函数
- ctx = SSL_CTX_new (method); /* create new context from method */
- LoadCertificates (ctx, "/webs/CA/newreq.ca", "/webs/CA/newreq.key"); /* load certs */
- /***********************
- //初始化Socket
- //将端口设置为443
- //accept一个Socket
- ***********************/
- //创建SSL对象
- ssl = SSL_new (ctx);
- //将SSL对象和Socket句柄绑定
- SSL_set_fd (ssl, conn_fd);
- io = BIO_new (BIO_f_buffer ());
- ssl_bio = BIO_new (BIO_f_ssl ());
- //将SSL和BIO绑定,使用BIO接口处理SSL数据
- //否则使用SSL_read和SSL_write来处理
- BIO_set_ssl (ssl_bio, ssl, BIO_CLOSE);
- BIO_push (io, ssl_bio);
- SSL_accept (ssl);
- //读取
- char line[10000];
- BIO_gets (io, line, sizeof (line));
- //正常处理HTTP协议
- //写入,返回报文。
- BIO_puts(io,"HTTP/1.0 200 OK\r\n");
- //或者直接在buf里面处理
- BIO_write(io, buf, length);
- //关闭SSL
- SSL_free (ssl);
- }
编译时需要-lssl -lcrypto
关于SSL加密:
基本代码便是以上内容,其实SSL一个关键的内容在于数据的加密,参考网上的一些内容,SSL加密的步骤如下:
1 Clent发出Client Hello,包含了自己的加密算法和其他一些信息。
2 Server发出Server Hello,确定这次通信使用的加密算法。Server发出自己的证书,其中包含了自己的身份和自己的公钥。
3 Client收到之后使用Server的公钥加密生成一个消息,发到Server。
4 Server使用自己的私钥解密,协商完成。此部分的加密使用非对称加密,算法可能为RAS。
SSL Handshake这部分的功能应该是在SSL_accept这个函数里面完成。
5 交换数据。此时使用Handshake中传输的密钥进行对称加密,算法可能为DES或者3DE等等。
(这个图比正常流程好像少了一个Server的步骤,似乎因为截图的是单向认证模式)
关于数字证书:
数字证书包含了服务器的一些安全信息,比如服务器的证书序列号,颁发机构,有效期,证书持有人标识,发布者数字签名等等。
一个HTTPS服务器,需要两个安全文件,一个是X.509数字证书,包含自己的公钥,另一个是自己的私钥文件。创建数字证书,据说可以用makecert.exe这样一些工具,具体不是很清楚。
参考资料:
OpenSSL documents
OpenSSL 编程入门
SSL/TLS/WTLS原理