internet 6 l.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Internet 安全协议与标准 第 6 课 PowerPoint Presentation
Download Presentation
Internet 安全协议与标准 第 6 课

Loading in 2 Seconds...

play fullscreen
1 / 68

Internet 安全协议与标准 第 6 课 - PowerPoint PPT Presentation


  • 232 Views
  • Uploaded on

Internet 安全协议与标准 第 6 课. 唐礼勇 博士 tly@infosec.pku.edu.cn. SSL 协议及 OpenSSL. Agenda. SSL 协议基础 OpenSSL 简介. SSL 是什么 ?. SSL: Secure Socket Layer ( 安全套接层 ) 一种在两台机器间提供安全通道的协议 , 两项功能 保护传输数据 识别通信机器 安全通道是透明的 对传输的数据内容上不加变更 , 仅作了加密 透明性使得几乎所有基于 TCP 的协议稍加改动就可以在 SSL 上运行. 为什么叫这个名字 ?.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Internet 安全协议与标准 第 6 课' - ada


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
internet 6

Internet安全协议与标准第6课

唐礼勇 博士

tly@infosec.pku.edu.cn

agenda
Agenda
  • SSL协议基础
  • OpenSSL简介

Internet安全协议及标准

slide4
SSL是什么?
  • SSL:
    • Secure Socket Layer (安全套接层)
    • 一种在两台机器间提供安全通道的协议,两项功能
      • 保护传输数据
      • 识别通信机器
    • 安全通道是透明的
      • 对传输的数据内容上不加变更,仅作了加密
      • 透明性使得几乎所有基于TCP的协议稍加改动就可以在SSL上运行

Internet安全协议及标准

slide5
为什么叫这个名字?
  • 比较Berkeley sockets API

Sockets API

int socket(int, int, int);

int connect(int, const struct sockaddr*, int);

ssize_t write(int, const void*, size_t);

ssize_t read(int, void*, size_t);

OpenSSL

SSL* SSL_new(SSL_CTX*);

int SSL_connect(SSL*);

int SSL_write(SSL*, char*, int);

int SSL_read(SSL*, char*, int);

Internet安全协议及标准

slide6

HTTP

FTP

SMTP

SSL or TLS

TCP

IP

SSL在协议栈中的位置

Internet安全协议及标准

slide7
SSL谱系树

SSLv1(1994)

未发布

SSLv2(1994)

第一版

PCT(1995)

只进行认证的模式;再握手;证书链

SSLv3(1995)

只进行认证的模式;DH,DSS;

关闭握手;再握手;证书链

STLP(1996)

共享密钥认证数据及

一些性能上的优化

TLS(1997-1999)

IETF;必须支持DH,DSS;新的MAC算法;新的密钥扩展

WTLS(1998)

WAP论坛对无线协议的支持

Internet安全协议及标准

slide8
SSL协议的使用
  • 用于Web的SSL
    • https://secure.example.com
  • 在SSL上构建一切
    • ftps-data(989), ftps(990)
    • nntps (563)
    • pop3s(995)
    • telnets(992)

Internet安全协议及标准

ssl 1 tsp

Hello

Type 0, Seq 1, Data

Type 0, Seq 2, Data

Type 0, Seq 3, Data

Type 1, Seq 4, Close

Type 0, Seq 1, Data

Type 1, Seq 2, Close

Certificate,nonce

Sign(Alice,Encrypt(Bob,MS))

SSL体系结构(1)还记得TSP吗?

Bob

Alice

Internet安全协议及标准

ssl 2
SSL体系结构(2)

Internet安全协议及标准

slide11
SSL基本概念
  • 连接
  • 会话
    • 由握手协议创建
    • 定义了一组可以被多个连接共用的密码安全参数
  • 连接 vs 会话
    • 在任意一对的双方之间,也许会有多个安全连接
    • 理论上,双方可以存在多个同时会话,但在实践中并未用到这个特性

Internet安全协议及标准

slide12
会话状态参数

Internet安全协议及标准

slide13
连接状态参数

Internet安全协议及标准

slide14

master secret

Client write MAC secret

Client write secret

Client write IV

Server write MAC secret

Server write secret

Server write IV

各种密钥

pre_master_secret

Internet安全协议及标准

slide15
SSL握手协议报文格式

Internet安全协议及标准

slide16

Client

Server

Internet安全协议及标准

cipher suite alternatives
Data Encryption:

AES

RC2-40

RC4-128

DES

DES 40

3DES

IDEA

Fortezza

Message Digest:

MD5

SHA

Key Exchange.

RSA

Fixed Diffie-Hellman

Ephemeral Diffie-Hellman

Anonymous Diffie-Hellman

Fortezza

Data Compression:

PKZip

WinZip

gzip

StuffIt

Cipher Suite Alternatives

Internet安全协议及标准

slide18

pre_master

_secret

客户端

随机数

服务器

随机数

KDF

master

_secret

KDF

密钥分组

客户端

MAC

服务器

MAC

客户端

输出

服务器

输出

客户端

IV

服务器

IV

密钥导出

Internet安全协议及标准

slide19
重用SSL会话

Internet安全协议及标准

ssl changecipherspec alert
SSL - ChangeCipherSpec及Alert
  • Change Cipher Spec Protocol
    • 指示在此之后的所有消息都将使用刚刚商定的密码进行加密
    • 单个报文,报文值为1
  • Alert Protocol
    • 允许一方向另一方报告异常情况
    • close_nitify警示用来指示发送方已经发送了所有要在该连接上发送的数据

Internet安全协议及标准

slide21

ClientHello

应用数据

Finished

ChangeCipherSpec

Warning, close_notify

ChangeCipherSpec

ServerHelloDone

ServerHello

应用数据

Certificate

Finished

ClientKeyExchange

一次真实的连接

Server

Client

Internet安全协议及标准

slide22
各种消息协同工作

应用

数据

Alert

握手

change_

cipher_

spec

记录层

TCP

Internet安全协议及标准

ssl 1
SSL记录协议如何操作(1)

Internet安全协议及标准

ssl 224
SSL记录协议如何操作(2)

Internet安全协议及标准

ssl 3

无损压缩

  • 不会增加1024字节

以上长度的内容

  • 没有默认压缩算法
SSL记录协议如何操作(3)

Internet安全协议及标准

ssl mac
SSL记录协议MAC计算

Internet安全协议及标准

slide27
SSL记录协议加密

Internet安全协议及标准

slide28
SSL记录协议封装

Internet安全协议及标准

ssl 129
SSL的安全(1)
  • SSL提供了什么
    • SSL提供了通道级别的安全: 连接的两端知道所传输的数据是保密的,而且没有被篡改
    • 几乎总是要对服务器进行认证
    • 可选的客户端认证
    • 针对异常情况的安全通知
      • 错误警示
      • 关闭连接
    • 所有这些依赖于某些对系统的假定
      • 假定已经正确产生了密钥数据并且
      • 该密钥已被安全地保管

Internet安全协议及标准

ssl 230
SSL的安全(2)
  • 保护master_secret
    • 几乎协议的所有安全都依赖于master_secret的保密
    • 在内存中保护秘密
  • 保护服务器的私有密钥
    • 最常被违反的规则,很难保证做到
    • 要求安全地存储私有密钥
      • 多数实现都对磁盘上的私有密钥进行加密,而且提供口令保护
      • 其他实现在受保护的硬件中存储密钥
    • 上述两种方案在启动服务器时都要求管理员的介入,从而使得在系统崩溃或电力故障恢复时无法实现无人看管的重新启动
  • 使用良好的随机数生成器

Internet安全协议及标准

ssl 1 ssl
使用SSL进行设计(1)不同应用结合,SSL本身毫无用处使用SSL进行设计(1)不同应用结合,SSL本身毫无用处
  • 了解要保证什么样的安全

没有必要让SSL来提供所有的安全服务!!

    • 保密性
      • 在大多数应用中保密性都是有用的
    • 消息完整性
      • 对是否使用本项功能应不存在疑问
      • 消息完整性不是可有可无的
    • 服务器认证
      • 惟一不需要服务器认证的SSL模式为匿名DH模式
      • 几乎所有的SSL应用都要求服务器证书
    • 客户端认证
      • 使用SSL往往将用户锁定在使用基于证书的服务器模式
      • 许多应用协议均集成了自己的客户端认证机制

Internet安全协议及标准

ssl 232
使用SSL进行设计(2)客户端认证
  • 用户名/口令
    • SSL可以阻止线路嗅探
    • 但不能防止反复猜测口令
  • 用户名/口令的变种
    • S/Key, SecureID
    • 在使用SSL的环境中没有什么优势
    • 在既有非安全连接又有安全连接的环境中,还是有用的
  • SSL客户端认证
    • 可操作性方面比服务器认证困难,操作负担大
    • 另一个附加问题是将证书映射为用户标识
  • 经验法则
    • 在大多数情况下,提供用户名/口令认证更容易一些
    • 口令更易于与其他基础设施集成在一起,也易于被用户理解

Internet安全协议及标准

ssl 333
使用SSL进行设计(3)引用完整性
  • 服务器身份
    • 要确保SSL安全连接的安全就必须验证服务器的身份
    • 不仅要对服务器的证书进行验证,还要验证这个服务器就是你期望与之交互的服务器
    • 需要掌握所期望的关于服务器身份的信息,通常以服务器域名的形式出现
  • 安全属性
    • 出于安全的原因,客户端需要验证连接属性是否符合其安全期望
    • 需要有指示要求使用SSL
    • 安全连接的实施一般应在客户端完成

Internet安全协议及标准

ssl 4
使用SSL进行设计(4)不适合的任务
  • 不可抵赖性(Nonrepudiation)
    • 无法使用SSL来完成的一种常见任务就是提供数据的不可抵赖性
    • SSL连接上传送的数据无法拿给任何别的人看,也不能让他人在SSL这外对内容进行验证
  • 端到端安全
    • 由于SSL握手是交互性的,因此不可能向无法同其建立网络连接的机器发送加密或鉴别数据
    • SSL在任何涉及以先存储对象并保持其加密属性的不变,而后又加以恢复、验证的方式 ,来保护对象的任务时表现很差
      • 邮件就是一个很典型的例子

Internet安全协议及标准

ssl 5
使用SSL进行设计(5)协议的选择
  • 如何同时运行同一种应用协议的安全与非安全版本
    • 两个要求
      • 必须能够明确区分安全与非安全连接
      • 没有安全意识的客户端与服务器必须能够正确地与有安全意识的客户端和服务器进行互操作
    • 两种协议选择方案
      • 独立端口
        • http 80  https 443; pop3 110  pop3s 995
        • stunnel是一个很好的SSL工具
      • 磋商升级
        • SMTP: STARTTLS

Internet安全协议及标准

agenda36
Agenda
  • SSL协议基础
  • OpenSSL简介

Internet安全协议及标准

openssl
OpenSSL是什么?
  • 一套密码学工具箱,实现了SSLv2/v3、TLSv1以及与SSL/TLS相关的若干密码标准
  • 不仅仅是SSL
    • 加密算法库
    • Hash算法库
    • 数字签名算法库
    • X.509证书处理库
    • CA工具库
    • SSL处理库
    • EVP算法封装库
    • BIO抽象I/O封装库
    • openssl工具包

Internet安全协议及标准

openssl38
OpenSSL包括些什么?
  • 源代码
    • 形如 openssl-0.9.7b.tar.gz
  • 编译后的版本
    • C语言包含文件
      • 如#include <openssl/ssl.h>
    • 两个动态共享库
      • Win32下
        • libeay32.dll
        • ssleay32.dll
      • Linux/Unix/FreeBSD下
        • libcrypto.so
        • libssl.so
    • 可执行文件
      • openssl[.exe]

Internet安全协议及标准

openssl39
OpenSSL命令行工具
  • The openssl program is a command line tool for using the various cryptography functions of OpenSSL's crypto library from the shell. It can be used for
    • Creation of RSA, DH and DSA key parameters
    • Creation of X.509 certificates, CSRs and CRLs
    • Calculation of Message Digests
    • Encryption and Decryption with Ciphers
    • SSL/TLS Client and Server Tests
    • Handling of S/MIME signed or encrypted mail

Internet安全协议及标准

openssl 1
OpenSSL标准命令(1)
  • Asn1parse - Parse an ASN.1 sequence.
  • Ca - Certificate Authority (CA) Management.
  • Ciphers - Cipher Suite Description Determination.
  • Crl - Certificate Revocation List (CRL) Management.
  • Crl2pkcs7 - CRL to PKCS#7 Conversion.
  • Dgst - Message Digest Calculation.
  • Dh - Diffie-Hellman Parameter Management. Obsoleted by dhparam.
  • Dsa - DSA Data Management.

Internet安全协议及标准

openssl 2
OpenSSL标准命令(2)
  • Dsaparam - DSA Parameter Generation.
  • Enc - Encoding with Ciphers.
  • Errstr - Error Number to Error String Conversion.
  • Dhparam - Generation and Management of Diffie-Hellman Parameters.
  • Gendh - Generation of Diffie-Hellman Parameters. Obsoleted by dhparam.
  • Gendsa - Generation of DSA Parameters.
  • Genrsa - Generation of RSA Parameters.

Internet安全协议及标准

openssl 3
OpenSSL标准命令(3)
  • Ocsp - Online Certificate Status Protocol utility.
  • Passwd - Generation of hashed passwords.
  • Pkcs7 - PKCS#7 Data Management.
  • Rand - Generate pseudo-random bytes.
  • Req - X.509 Certificate Signing Request (CSR) Management.
  • Rsa - RSA Data Management.
  • Rsautl - RSA utility for signing, verification, encryption, and decryption.

Internet安全协议及标准

openssl 4
OpenSSL标准命令(4)
  • s_client - This implements a generic SSL/TLS client which can establish a transparent connection to a remote server speaking SSL/TLS. It's intended for testing purposes only and provides only rudimentary interface functionality but internally uses mostly all functionality of the OpenSSL ssl library.

Internet安全协议及标准

openssl 5
OpenSSL标准命令(5)
  • s_server - This implements a generic SSL/TLS server which accepts connections from remote clients speaking SSL/TLS. It's intended for testing purposes only and provides only rudimentary interface functionality but internally uses mostly all functionality of the OpenSSL ssl library. It provides both an own command line oriented protocol for testing SSL functions and a simple HTTP response facility to emulate an SSL/TLS-aware webserver.

Internet安全协议及标准

openssl45
OpenSSL应用程序接口
  • 底层函数
    • 加密/解密
    • 大整数运算、公开密钥算法
    • 消息摘要
    • 文件I/O、Sockets I/O、Memory I/O
    • ASN.1、PKCS
  • EVP
    • 密码算法封装
  • BIO
    • I/O封装
  • SSL
  • PEM

Internet安全协议及标准

openssl46
OpenSSL函数调用方法
  • 直接调用相关函数
    • 如可以直接调用MD5、DES等算法实现的底层函数
  • 通过抽象接口
    • 类似于面向对象的多态
    • EVP
    • BIO

Internet安全协议及标准

slide47
EVP系列

一系列封装了openssl加密库中所有加密算法的函数,通过这样的统一的封装,使得只需要在初始化参数的时候做很少的改变,就可以使用相同的代码但采用不同的加密算法进行数据的加密和解密。

  • 公开密码算法
    • EVP_Seal*...*,EVP_Open*...*
  • 数字签名算法
    • EVP_Sign*...*,EVP_Verify*...*
  • 对称加密算法
    • EVP_Encrypt*...*
  • 信息摘要算法
    • EVP_Digest*...*
  • 信息编码算法
    • EVP_Encode*...*

Internet安全协议及标准

slide48
EVP加密算法结构

typedef struct evp_cipher_st

{

int nid;

int block_size;

int key_len;

int iv_len;

unsigned long flags;

int (*init)(EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char *iv, int enc);

int (*do_cipher)(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl);

int (*cleanup)(EVP_CIPHER_CTX *);

int ctx_size;

int (*set_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *);

int (*get_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *);

int (*ctrl)(EVP_CIPHER_CTX *, int type, int arg, void *ptr); /* Miscellaneous operations */

void *app_data;

} EVP_CIPHER;

Internet安全协议及标准

bio 1 bio io
BIO简明指南(1)BIO-抽象IO接口
  • BIO
    • 在隐藏了不同类型I/O接口细节的一种应用程序接口,通过BIO可以和SSL、非加密的网络连接、文件、内存等进行透明的访问
  • 两种不同类型的BIO
    • source/sink类型
      • 数据源/数据矢
    • filter类型
      • 当数据流过filter类型BIO的过程中,可能进行格式转换改变内容,也可能不改变内容,而仅改变BIO的内部状态
  • BIO可组织成链的形式
    • 一个source/sink类型,多个filter类型
    • 对比
      • 网络协议层、STREAMS机制
  • 通常过一指向BIO结构的指针访问BIO接口

Internet安全协议及标准

bio 2 bio
BIO简明指南(2)BIO的创建和释放
  • BIO的创建
    • BIO* BIO_new(BIO_METHOD *type);
    • int BIO_set(BIO* bio,BIO_METHOD *type);
    • 示例:
      • BIO* mem = BIO_new(BIO_s_mem());
  • BIO的释放
    • int BIO_free(BIO* bio);
    • void BIO_vfree(BIO* bio);
    • void BIO_free_all(BIO* bio);

Internet安全协议及标准

bio 3 bio method
BIO简明指南(3)BIO_METHOD结构

typedef struct bio_method_st

{

int type;

const char *name;

int (*bwrite)(BIO *, const char *, int);

int (*bread)(BIO *, char *, int);

int (*bputs)(BIO *, const char *);

int (*bgets)(BIO *, char *, int);

long (*ctrl)(BIO *, int, long, void *);

int (*create)(BIO *);

int (*destroy)(BIO *);

long (*callback_ctrl)(BIO *, int, bio_info_cb *);

} BIO_METHOD;

Internet安全协议及标准

bio 4 bio method
BIO简明指南(4)BIO_METHOD结构示例

static BIO_METHOD mem_method=

{

BIO_TYPE_MEM,

"memory buffer",

mem_write,

mem_read,

mem_puts,

mem_gets,

mem_ctrl,

mem_new,

mem_free,

NULL,

};

Internet安全协议及标准

bio 5 source sink bio
BIO简明指南(5)source/sink类型BIO
  • BIO_s_accept()
    • 是一个封装了类似TCP/IP socket Accept规则的接口,并且使TCP/IP操作对于BIO接口是透明的
  • BIO_s_connect()
    • 是一个封装了类似TCP/IP socket Connect规则的接口,并且使TCP/IP操作对于BIO接口是透明的
  • BIO_s_bio()
    • 封装了一个BIO对,数据从其中一个BIO写入,从另外一个BIO读出
  • BIO_s_fd()
    • 是一个封装了文件描述符的BIO接口,提供类似文件读写操作的功能
  • BIO_s_file()
    • 封装了标准的文件接口的BIO,包括标志的输入输出设备如stdin等
  • BIO_s_mem()
    • 封装了内存操作的BIO接口,包括了对内存的读写操作
  • BIO_s_null()
    • 返回空的sink型BIO接口,写入这种接口的所有数据读被丢弃,读的时候总是返回EOF
  • BIO_s_socket()
    • 封装了socket接口的BIO类型

Internet安全协议及标准

bio 6 filter bio
BIO简明指南(6)filter类型BIO
  • BIO_f_base64()
    • 封装了base64编码方法的BIO,写的时候进行编码,读的时候解码
  • BIO_f_buffer()
    • 封装了缓冲区操作的BIO,写入该接口的数据一般是准备传入下一个BIO接口的,从该接口读出的数据一般也是从另一个BIO传过来的。
  • BIO_f_cipher()
    • 封装了加解密方法的BIO,写的时候加密,读的时候解密
  • BIO_f_md()
    • 封装了信息摘要方法的BIO,通过该接口读写的数据都是已经经过摘要的。
  • BIO_f_null()
    • 一个不作任何事情的BIO,对它的操作都简单传到下一个BIO去了,相当于不存在。
  • BIO_f_ssl()
    • 封装了openssl 的SSL协议的BIO类型,也就是为SSL协议增加了一些BIO操作方法。

Internet安全协议及标准

bio 7 bio
BIO简明指南(7)BIO基本操作
  • int BIO_read(BIO *b, void *data, int len);
  • int BIO_gets(BIO *bp, char *buf, int size);
  • int BIO_write(BIO *b, const void *data, int len);
  • int BIO_puts(BIO *bp,const char *buf);
  • long BIO_ctrl(BIO *b, int cmd, long larg, void *parg);
    • int BIO_reset(BIO *b);
    • int BIO_seek(BIO *b, int ofs);
    • int BIO_tell(BIO *b);
    • int BIO_flush(BIO *b);
    • int BIO_eof(BIO *b);
    • int BIO_set_close(BIO *b,long flag);
    • int BIO_get_close(BIO *b);

Internet安全协议及标准

bio 8 bio
BIO简明指南(8)BIO链操作
  • BIO* BIO_push(BIO *b,BIO *append);
  • BIO* BIO_pop(BIO *b);
  • 示例:

假设md1、md2是digest类型的BIO,b64是Base64类型的BIO,而f是file类型的BIO

BIO_push(b64, f);

将形成一条链b64-f

再运行

BIO_push(md2, b64);

BIO_push(md1, md2);

就会形成一条md1-md2-b64-f的BIO链

Internet安全协议及标准

bio 1 bio
BIO示例(1)内存型BIO
  • 创建一个内存型BIO并写入数据

BIO* mem = BIO_new(BIO_s_mem());

BIO_puts(mem, "Hello World\n");

  • 创建一个只读的内存型BIO

char data[] = "Hello World";

BIO *mem;

mem = BIO_new_mem_buf(data, -1);

Internet安全协议及标准

bio 2 base64
BIO示例(2)base64编码
  • 将字符串"Hello World\n"进行base64编码并写入到标准输出

BIO *bio, *b64;

char message[] = "Hello World \n";

b64 = BIO_new(BIO_f_base64());

bio = BIO_new_fp(stdout, BIO_NOCLOSE);

bio = BIO_push(b64, bio);

BIO_write(bio, message, strlen(message));

BIO_flush(bio);

BIO_free_all(bio);

Internet安全协议及标准

bio 3 base64
BIO示例(3)base64解码
  • 将base64编码的数据从标准输入设备并解码后输出到标准输出

BIO *bio, *b64, bio_out;

char inbuf[512];

int inlen;

b64 = BIO_new(BIO_f_base64());

bio = BIO_new_fp(stdin, BIO_NOCLOSE);

bio_out = BIO_new_fp(stdout, BIO_NOCLOSE);

bio = BIO_push(b64, bio);

while((inlen = BIO_read(bio, inbuf, sizeof(inbuf))) > 0)

BIO_write(bio_out, inbuf, inlen);

BIO_free_all(bio);

Internet安全协议及标准

bio 4 messagedigest i
BIO示例(4)MessageDigest - I
  • 从摘要类型BIO读数据

BIO *bio, *mdtmp;

char buf[1024];

int rdlen;

bio = BIO_new_file(file, "rb");

mdtmp = BIO_new(BIO_f_md());

BIO_set_md(mdtmp, EVP_sha1());

bio = BIO_push(mdtmp, bio);

mdtmp = BIO_new(BIO_f_md());

BIO_set_md(mdtmp, EVP_md5());

bio = BIO_push(mdtmp, bio);

do {

rdlen = BIO_read(bio, buf, sizeof(buf));

/* 可以在这里面加入处理数据的代码 */

} while(rdlen > 0);

Internet安全协议及标准

bio 5 messagedigest ii
BIO示例(5)MessageDigest - II
  • 从BIO链中读取摘要并输出(可同上例配合)

unsigned char mdbuf[EVP_MAX_MD_SIZE];

int mdlen;

int i;

mdtmp = bio; /* 这里假设BIO已经设置好了*/

do {

EVP_MD *md;

mdtmp = BIO_find_type(mdtmp, BIO_TYPE_MD);

if(!mdtmp) break;

BIO_get_md(mdtmp, &md);

printf("%s digest", OBJ_nid2sn(EVP_MD_type(md)));

mdlen = BIO_gets(mdtmp, mdbuf, EVP_MAX_MD_SIZE);

for(i = 0; i < mdlen; i++) printf(":%02X", mdbuf[i]);

printf("\n");

mdtmp = BIO_next(mdtmp);

} while(mdtmp);

BIO_free_all(bio);

Internet安全协议及标准

bio 6 ssl i
BIO示例(6)SSL客户端 - I

#include <openssl/ssl.h>

int main()

{

BIO *sbio, *out;

int len;

char tmpbuf[1024];

SSL_CTX *ctx;

SSL *ssl;

ERR_load_crypto_strings();

ERR_load_SSL_strings();

OpenSSL_add_all_algorithms();

ctx = SSL_CTX_new(SSLv23_client_method());

/*通常应该在这里设置一些验证路径和模式等,因为这里没有设置,所以该例子可以跟使用任意CA签发证书的任意服务器建立连接*/

sbio = BIO_new_ssl_connect(ctx);

BIO_get_ssl(sbio, &ssl);

if (!ssl) {

fprintf(stderr, "Can't locate SSL pointer\n");

}

Internet安全协议及标准

bio 7 ssl ii
BIO示例(7)SSL客户端 - II

/* 不需要任何重试请求*/

SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);

/*这里你可以添加对SSL的其它一些设置*/

BIO_set_conn_hostname(sbio, "localhost:4433");

out = BIO_new_fp(stdout, BIO_NOCLOSE);

if (BIO_do_connect(sbio) <= 0) {

fprintf(stderr, "Error connecting to server\n");

ERR_print_errors_fp(stderr);

}

if (BIO_do_handshake(sbio) <= 0) {

fprintf(stderr, "Error establishing SSL connection\n");

ERR_print_errors_fp(stderr);

}

/* 这里可以添加检测SSL连接的代码,得到一些连接信息*/

BIO_puts(sbio, "GET / HTTP/1.0\n\n");

for (;;) {

len = BIO_read(sbio, tmpbuf, 1024);

if (len <= 0)

break;

BIO_write(out, tmpbuf, len);

}

BIO_free_all(sbio);

BIO_free(out);

}

Internet安全协议及标准

bio 8 ssl i
BIO示例(8)SSL服务器端 - I

#include <openssl/ssl.h>

int main()

{

BIO *sbio, *bbio, *acpt, *out;

int len;

char tmpbuf[1024];

SSL_CTX *ctx;

SSL *ssl;

ERR_load_crypto_strings();

ERR_load_SSL_strings();

OpenSSL_add_all_algorithms();

ctx = SSL_CTX_new(SSLv23_server_method());

if (!SSL_CTX_use_certificate_file(ctx, "server.pem", SSL_FILETYPE_PEM)

|| !SSL_CTX_use_PrivateKey_file(ctx, "server.pem", SSL_FILETYPE_PEM)

|| !SSL_CTX_check_private_key(ctx)) {

fprintf(stderr, "Error setting up SSL_CTX\n");

ERR_print_errors_fp(stderr);

return 0;

}

/*可以在这里设置验证路径,DH和DSA算法的临时密钥回调函数等等*/

Internet安全协议及标准

bio 9 ssl ii
BIO示例(9)SSL服务器端 - II

/* 创建一个新的服务器模式的SSL类型BIO*/

sbio = BIO_new_ssl(ctx, 0);

BIO_get_ssl(sbio, &ssl);

if (!ssl) {

fprintf(stderr, "Can't locate SSL pointer\n");

}

/* 不需要任何重试请求 */

SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);

/* 创建一个Buffer类型BIO,并加到BIO链上 */

bbio = BIO_new(BIO_f_buffer());

sbio = BIO_push(bbio, sbio);

/*

当一个新连接建立的时候,我们可以将sbio链自动插入到连接所在的BIO链中去。这时候,这个BIO链(sbio)就被accept类型BIO吞并了,并且当accept类型BIO释放的时候,它会自动被释放。

*/

acpt = BIO_new_accept("4433");

BIO_set_accept_bios(acpt, sbio);

out = BIO_new_fp(stdout, BIO_NOCLOSE);

Internet安全协议及标准

bio 10 ssl iii
BIO示例(10)SSL服务器端 - III

/* 设置 accept BIO */

if (BIO_do_accept(acpt) <= 0) {

fprintf(stderr, "Error setting up accept BIO\n");

ERR_print_errors_fp(stderr);

return 0;

}

/* 等待连接的建立 */

if (BIO_do_accept(acpt) <= 0) {

fprintf(stderr, "Error in connection\n");

ERR_print_errors_fp(stderr);

return 0;

}

/* 因为我们只想处理一个连接,所以可以删除和释放 accept BIO了*/

sbio = BIO_pop(acpt);

BIO_free_all(acpt);

if(BIO_do_handshake(sbio) <= 0) {

fprintf(stderr, "Error in SSL handshake\n");

ERR_print_errors_fp(stderr);

return 0;

}

Internet安全协议及标准

bio 11 ssl
BIO示例(11)SSL服务器端

BIO_puts(sbio, "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n");

BIO_puts(sbio, "<pre>\r\nConnection Established\r\nRequest headers:\r\n");

BIO_puts(sbio, "--------------------------------------------------\r\n");

for (;;) {

len = BIO_gets(sbio, tmpbuf, 1024);

if (len <= 0)

break;

BIO_write(sbio, tmpbuf, len);

BIO_write(out, tmpbuf, len);

/* 查找请求头的结束标准空白行*/

if ((tmpbuf[0] == '\r') || (tmpbuf[0] == '\n'))

break;

}

BIO_puts(sbio, "--------------------------------------------------\r\n");

BIO_puts(sbio, "</pre>\r\n");

/* 因为使用了buffer类型的BIO,我们最好调用BIO_flush函数 */

BIO_flush(sbio);

BIO_free_all(sbio);

}

Internet安全协议及标准

changelog
ChangeLog
  • 2003.7.14 v1.0 By T.L.Yong
    • Initialize from Hu Jianbin’s PPT and other resources

Internet安全协议及标准