2024年3月9日发(作者:)

openssl

编程入门(含完整示例)

易剑

1.

编写目的

第一次跑起openssl示例并不太简单,本文的目的是为了让这个过程变得非常简单。在

开始之前,要非常感谢周立发同学,正是通过他共享的示例,较轻松的入了门。本文档对他

共享的示例中的一个小错误进行了修正,并提供了傻瓜式的“编译-生成-KEY运行”一条龙

脚本(方法请参见压缩包中的readme文件),让跑第一个openssl程序变得轻轻松松。

2.

示例包

ssl_ssl-0.9.8h-Su

ssl_为示例源代码包,为openssl二进制包,

测试时是安装在/usr/local/ssl。

ssl_中的示例在SuSE10中测试通过,使用的是openssl-0.9.8h,它包括如

下文件:

-rw-r--r--1rootroot1346Dec518:

-rwxr-xr-x1rootroot114Dec518:11make_

-rwxr-xr-x1rootroot172Dec518:37mk_

-rwxr-xr-x1rootroot172Dec518:37mk_

-rw-r--r--1rootroot1679Dec518:

-rw-r--r--1rootroot167Dec518:39readme

-rwxr-xr-x1rootroot38Dec518:38run_

-rwxr-xr-x1rootroot64Dec518:38run_

-rwxr-xr-x1rootroot1140142Dec518:38ssl_client

-rw-r--r--1rootroot3928Dec517:31ssl_

-rwxr-xr-x1rootroot1139667Dec518:38ssl_server

-rw-r--r--1rootroot4882Dec517:31ssl_

readme为包内容说明,run_用来运行服务端,run_用来运行客户端,

mk_用来编译服务端,mk_用来编译客户端,make_用来生成钥

匙KEY。

openssl编程入门

3.什么是SSL?

在学习openssl编程之前,先了解一下什么是SSL,有助于后续的学习。SSL是一个

缩写,代表的是SecureSocketsLayer。它是支持在Internet上进行安全通信的标准,并

且将数据密码术集成到了协议之中。数据在离开您的计算机之前就已经被加密,然后只有到

达它预定的目标后才被解密。证书和密码学算法支持了这一切的运转,使用OpenSSL,您

将有机会切身体会它们。

理论上,如果加密的数据在到达目标之前被截取或窃听,那些数据是不可能被破解的。

不过,由于计算机的变化一年比一年快,而且密码翻译方法有了新的发展,因此,SSL中

使用的加密协议被破解的可能性也在增大。可以将SSL和安全连接用于Internet上任何

类型的协议,不管是HTTP、POP3,还是FTP。还可以用SSL来保护Telnet会话。虽

然可以用SSL保护任何连接,但是不必对每一类连接都使用SSL。如果连接传输敏感信

息,则应使用SSL。

4.什么是openssl?

openSSL不仅仅是SSL。它可以实现消息摘要、文件的加密和解密、数字证书、数字

签名和随机数字。关于OpenSSL库的内容非常多,远不是一篇文章可以容纳的。

OpenSSL不只是API,它还是一个命令行工具。命令行工具可以完成与API同样的工作,

而且更进一步,可以测试SSL服务器和客户机。

5.示例程序

示例的说明请参见下面这篇周立发共享的文章。

加密通讯协议SSL

编程.pdf

2

openssl编程入门

6.服务端编写步骤

开始

SSL_library_init()SSL_set_fd(ssl, newfd)

SSL 库初始化socket 加入到SSL

OpenSSL_add_all_algorithmsSSL_new(ctx)

载入所有SSL 算法产生一个新的SSL

SSL_load_error_strings()

载入所有 SSL 错误消息

newfd = accept(servfd)

SSL_CTX_new(SSLv23_server

_method())

bind(servfd)

产生一个SSL_CTX

SSL_CTX_use_certificate_file

servfd = socket((AF_INET,

载入用户的数字证书SOCK_STREAM, 0))

SSL_CTX_use_PrivateKey_file

SSL_CTX_check_private_k

载入用户私钥

ey

检查用户私钥是否正确

茶色为普通socket操作,其它为ssl增加的操作

SSL_accept(ssl)

建立SSL 连接

SSL_write(ssl, buf,

strlen(buf))

发消息给客户端

SSL_read(ssl, buf,

MAXBUF)

接收客户端的消息

SSL_shutdown(ssl)

关闭SSL 连接

SSL_free(ssl)

释放SSL

close(newfd)

结束

3

openssl编程入门

7.客户端编写步骤

开始

SSL_library_init()

SSL_read(ssl, buffer,

SSL 库初始化

MAXBUF)

接收服务器来的消息

OpenSSL_add_all_algorithmsSSL_connect(ssl)

载入所有SSL 算法建立SSL 连接

SSL_load_error_strings()SSL_set_fd(ssl, newfd)

载入所有 SSL 错误消息socket 加入到SSL

SSL_CTX_new(SSLv23_server

_method())

SSL_new(ctx)

产生一个SSL_CTX

产生一个新的SSL

sockfd = socket((AF_INET,

SOCK_STREAM, 0))

connect(sockfd)

茶色为普通socket操作,其它为ssl增加的操作

8.

相关头文件

头文件

#include

#include

#include

#include

SSL_write(ssl, buffer,

strlen(buffer))

发消息给服务器

SSL_shutdown(ssl)

关闭SSL 连接

SSL_free(ssl)

释放SSL

close(sockfd)

SL_CTX_free(ctx)

释放SSL

结束

4

openssl编程入门

头文件

#include

#include

9.结尾

上面步骤应当画得比较清楚了,结合图再对照ssl_和《加密通讯协议SSL

编程.pdf》就可以非常快地上手了。

5