织梦CMS - 轻松建站从此开始!

罗索

HTTPS服务器的快速开发

落鹤生 发布于 2010-09-01 09:09 点击:次 
SSL协议分为Handshake和Record两个部分,Handshake负责服务器客户端的建立连接,Record处理压缩,加密等具体操作。在正常的HTTP服务器中加入SSL功能,则可以在TCP处理之后,HTTP处理之前,加入SSL的功能。
TAG:

注:以下代码未经验证

名词解释:
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
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等等。
SSL
(这个图比正常流程好像少了一个Server的步骤,似乎因为截图的是单向认证模式)

关于数字证书:
数字证书包含了服务器的一些安全信息,比如服务器的证书序列号,颁发机构,有效期,证书持有人标识,发布者数字签名等等。
一个HTTPS服务器,需要两个安全文件,一个是X.509数字证书,包含自己的公钥,另一个是自己的私钥文件。创建数字证书,据说可以用makecert.exe这样一些工具,具体不是很清楚。

参考资料:
OpenSSL documents
OpenSSL 编程入门
SSL/TLS/WTLS原理

(fanged)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201009/10067.html]
本文出处:fanged.ycool.com 作者:fanged
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容