一:简介:
SSL(Secure Socket Layer)是
netscape
公司提出的主要用于
web
的安全通信标准
,
分为
2.0
版和
3.0
版
.TLS(Transport Layer Security)
是
IETF
的
TLS
工作组在
SSL3.0
基础之上提出的安全通信标准
,
目前版本是
1.0,
即
RFC2246.SSL/TLS
提供的安全机制可以保证应用层数据在互联网络传输不
被监听
,
伪造和窜改
.
openssl(www.openssl.org) 是 sslv2,sslv3,tlsv1 的一份完整实现 , 内部包含了大量加密算法程序 . 其命令行提供了丰富的加密 , 验证 , 证书生成等功 能 , 甚至可以用其建立一个完整的 CA. 与其同时 , 它也提供了一套完整的库函数 , 可用开发用 SSL/TLS 的通信程序 . Apache 的 https 两种版本 mod_ssl 和 apachessl 均基于它实现的 .openssl 继承于 ssleay, 并做了一定的扩展 , 当前的版本是 0. 9.5a .
openssl 的缺点是文档太少 , 连一份完整的函数说明都没有 ,man page 也至今没做完整 :-(, 如果想用它编程序 , 除了熟悉已有的文档 ( 包括 ssleay,mod_ssl,apachessl 的文档 ) 外 , 可以到它的 maillist 上找相关的帖子 , 许多问题可以在以前的文章中找到答案 .
编程 :
程序分为两部分 , 客户端和服务器端 , 我们的目的是利用 SSL/TLS 的特性保证通信双方能够互相验证对方身份 ( 真实性 ), 并保证数据的完整性 , 私密性 .
1. 客户端程序的框架为 :
/* 生成一个 SSL 结构 */
meth = SSLv23_client_method();
ctx = SSL_CTX_new (meth);
ssl = SSL_new(ctx);
/* 下面是正常的 socket 过程 */
fd = socket();
connect();
/* 把建立好的 socket 和 SSL 结构联系起来 */
SSL_set_fd(ssl,fd);
/*SSL 的握手过程 */
SSL_connect(ssl);
/* 接下来用 SSL_write(), SSL_read() 代替原有的 write(),read() 即可 */
SSL_write(ssl,"Hello world",strlen("Hello World!"));
2. 服务端程序的框架为 :
/* 生成一个 SSL 结构 */
meth = SSLv23_server_method();
ctx = SSL_CTX_new (meth);
ssl = SSL_new(ctx);
/* 下面是正常的 socket 过程 */
fd = socket();
bind();
listen();
accept();
/* 把建立好的 socket 和 SSL 结构联系起来 */
SSL_set_fd(ssl,fd);
/*SSL 的握手过程 */
SSL_connect(ssl);
/* 接下来用 SSL_write(), SSL_read() 代替原有的 write(),read() 即可 */
SSL_read (ssl, buf, sizeof(buf));
根据 RFC2246(TLS1.0) 整个 TLS(SSL) 的流程如下 :
Client Server
ClientHello -------->
ServerHello
Certificate*
ServerKeyExchange*
CertificateRequest*
<-------- ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished -------->
[ChangeCipherSpec]
<-------- Finished
Application Data <-------> Application Data
对程序来说 ,openssl 将整个握手过程用一对函数体现 , 即客户端的 SSL_connect 和服务端的 SSL_accept. 而后的应用层数据交换则用 SSL_read 和 SSL_write 来完成 .
openssl(www.openssl.org) 是 sslv2,sslv3,tlsv1 的一份完整实现 , 内部包含了大量加密算法程序 . 其命令行提供了丰富的加密 , 验证 , 证书生成等功 能 , 甚至可以用其建立一个完整的 CA. 与其同时 , 它也提供了一套完整的库函数 , 可用开发用 SSL/TLS 的通信程序 . Apache 的 https 两种版本 mod_ssl 和 apachessl 均基于它实现的 .openssl 继承于 ssleay, 并做了一定的扩展 , 当前的版本是 0. 9.5a .
openssl 的缺点是文档太少 , 连一份完整的函数说明都没有 ,man page 也至今没做完整 :-(, 如果想用它编程序 , 除了熟悉已有的文档 ( 包括 ssleay,mod_ssl,apachessl 的文档 ) 外 , 可以到它的 maillist 上找相关的帖子 , 许多问题可以在以前的文章中找到答案 .
编程 :
程序分为两部分 , 客户端和服务器端 , 我们的目的是利用 SSL/TLS 的特性保证通信双方能够互相验证对方身份 ( 真实性 ), 并保证数据的完整性 , 私密性 .
1. 客户端程序的框架为 :
/* 生成一个 SSL 结构 */
meth = SSLv23_client_method();
ctx = SSL_CTX_new (meth);
ssl = SSL_new(ctx);
/* 下面是正常的 socket 过程 */
fd = socket();
connect();
/* 把建立好的 socket 和 SSL 结构联系起来 */
SSL_set_fd(ssl,fd);
/*SSL 的握手过程 */
SSL_connect(ssl);
/* 接下来用 SSL_write(), SSL_read() 代替原有的 write(),read() 即可 */
SSL_write(ssl,"Hello world",strlen("Hello World!"));
2. 服务端程序的框架为 :
/* 生成一个 SSL 结构 */
meth = SSLv23_server_method();
ctx = SSL_CTX_new (meth);
ssl = SSL_new(ctx);
/* 下面是正常的 socket 过程 */
fd = socket();
bind();
listen();
accept();
/* 把建立好的 socket 和 SSL 结构联系起来 */
SSL_set_fd(ssl,fd);
/*SSL 的握手过程 */
SSL_connect(ssl);
/* 接下来用 SSL_write(), SSL_read() 代替原有的 write(),read() 即可 */
SSL_read (ssl, buf, sizeof(buf));
根据 RFC2246(TLS1.0) 整个 TLS(SSL) 的流程如下 :
Client Server
ClientHello -------->
ServerHello
Certificate*
ServerKeyExchange*
CertificateRequest*
<-------- ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished -------->
[ChangeCipherSpec]
<-------- Finished
Application Data <-------> Application Data
对程序来说 ,openssl 将整个握手过程用一对函数体现 , 即客户端的 SSL_connect 和服务端的 SSL_accept. 而后的应用层数据交换则用 SSL_read 和 SSL_write 来完成 .