Linux之SSL安全套接字20160704

使用SSL前,先有 基本的TCP套接字连接。见demo代码

SSL_library_init();//在使用OpenSSL 之前,必须进行相应的协议初始化工作

OpenSSL_add_all_algorithms();///* 载入所有 SSL 算法 */

SSL_load_error_strings();/* 载入所有 SSL 错误消息 */

const SSL_METHOD *meth = SSLv23_client_method();创建本次会话连接所使用的协议,如果是客户端可以使用

pSockInfo->pSslCtx = SSL_CTX_new(meth);//申请SSL 会话环境

/* 以 SSL V2 和 V3 标准兼容方式产生一个 SSL_CTX ,即 SSL Content Text */

pSockInfo->pSSL = SSL_new(pSockInfo->pSslCtx);申请一个SSL 套节字;

SSL_set_fd(pSockInfo->pSSL, pSockInfo->sockFd);把SSL attach 到已经连接的套接字上了

ret = SSL_connect(pSockInfo->pSSL);//成功创建SSL 套接字后,客户端应使用函数SSL_connect( )替代传统的函数connect( )

//来完成握手过程

DebugPrintf("Connected with %s encryption\n",SSL_get_cipher(pSockInfo->pSSL));//;///*打印所有加密算法的信息(可选)*/

/* SSL 库初始化 */

SSL_library_init();

/* 载入所有 SSL 算法 */

OpenSSL_add_all_algorithms();

/* 载入所有 SSL 错误消息 */

SSL_load_error_strings();

/* 以 SSL V2 和 V3 标准兼容方式产生一个 SSL_CTX ,即 SSL Content Text */

ctx = SSL_CTX_new(SSLv23_server_method());

/* 也可以用 SSLv2_server_method() 或 SSLv3_server_method() 单独表示 V2 或 V3标准 */

详细介绍:

现行网上银行和电子商务等大型的网上交易系统普遍采用HTTP和SSL相结合的方式。服务器端采用支持SSL的Web服务器,用户端采用支持SSL的浏览器实现安全通信。

SSL是Secure Socket Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准,目前已有3.0版本。SSL采用公开密钥技术。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。目前,利用公开密钥技术的SSL协议,已成为Internet上保密通讯的工业标准。本文着重在SSL协议和SSL程序设计两方面谈谈作者对SSL的理解。

SSL协议初步介绍

安全套接层协议能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上。SSL协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP,FTP,TELNET等)能透明地建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。

通过以上叙述,SSL协议提供的安全信道有以下三个特性:

1.数据的保密性

信息加密就是把明码的输入文件用加密算法转换成加密的文件以实现数据的保密。加密的过程需要用到密匙来加密数据然后再解密。没有了密钥,就无法解开加密的数据。数据加密之后,只有密匙要用一个安全的方法传送。加密过的数据可以公开地传送。

2.数据的一致性

加密也能保证数据的一致性。例如:消息验证码(MAC),能够校验用户提供的加密信息,接收者可以用MAC来校验加密数据,保证数据在传输过程中没有被篡改过。

3.安全验证

加密的另外一个用途是用来作为个人的标识,用户的密匙可以作为他的安全验证的标识。

SSL是利用公开密钥的加密技术(RSA)来作为用户端与服务器端在传送机密资料时的加密通讯协定。目前,大部分的Web 服务器及浏览器都广泛支持SSL 技术。当浏览器试图连接一个具有SSL认证加密的服务器时,就会唤醒一个SSL会话,浏览器检查认证,必须具备下面三个条件:

1)有一个权威机构发放证书,当然可以创建自我签订的证书(x509 结构)。

2)证书不能过期。

3)证书是属于它所连接的服务器的。

只有全部具备了这三个条件,浏览器才能成功完成认证。通过这三个条件,用户能确认其浏览器连接到正确的服务器,而不是连接到一些想盗取用户密码等重要信息的虚假的服务器上。

在当今的电子商务中还有一项被广泛使用的安全协议是SET协议。SET(Secure Electronic Transaction,安全电子交易)协议是由VISA和MasterCard两大信用卡公司于1997年5月联合推出的规范。SET能在电子交易环节上提供更大的信任度、更完整的交易信息、更高的安全性和更少受欺诈的可能性。SET交易分三个阶段进行:用户向商家购物并确定支付;商家与银行核实;银行向商家支付货款。每个阶段都涉及到RSA对数据加密,以及RSA数字签名。使用SET协议,在一次交易中,要完成多次加密与解密操作,故有很高的安全性,但SET协议比SSL协议复杂,商家和银行都需要改造系统以实现互操作。

在Linux 下,比较流行支持SSL认证的是OpenSSL服务器。OpenSSL项目是一个合作的项目,开发一个健壮的、商业等级的、完整的开放源代码的工具包,用强大的加密算法来实现安全的Socket层(Secure Sockets Layer,SSL v2/v3)和传输层的安全性(Transport Layer Security,TLS v1)。这个项目是由全世界的志愿者管理和开发OpenSSL工具包和相关文档。

如何在Linux下配置OpenSSL服务器,首先从OpenSSL的主页()上下载openssl-version.tar.gz软件包来编译安装,与Apache服务器配合可以建立支持SSL的Web服务器,并可以使用自我签订的证书做认证,关于如何编译、安装OpenSSL服务器,可以参考一下OpenSSL HOWTO文档。

SSL 程序设计初步介绍

SSL 通讯模型为标准的C/S 结构,除了在 TCP 层之上进行传输之外,与一般的通讯没有什么明显的区别。在这里,我们主要介绍如何使用OpenSSL进行安全通讯的程序设计。关于OpenSSL 的一些详细的信息请参考OpenSSL的官方主页 。

在使用OpenSSL前,必须先对OpenSSL 进行初始化,以下的三个函数任选其一:

SSL_library_init(void);

OpenSSL_add_ssl_algorithms();

SSLeay_add_ssl_algorithms();

事实上 后面的两个函数只是第一个函数的宏。

如果要使用OpenSSL的出错信息,使用SSL_load_error_strings (void)进行错误信息的初始化。以后可以使用void ERR_print_errors_fp(FILE *fp) 打印SSL的错误信息。

一次SSL连接会话一般要先申请一个SSL 环境,基本的过程是:

1. SSL_METHOD* meth = TLSv1_client_method(); 创建本次会话连接所使用的协议,如果是客户端可以使用

SSL_METHOD* TLSv1_client_method(void); TLSv1.0 协议

SSL_METHOD* SSLv2_client_method(void); SSLv2 协议

SSL_METHOD* SSLv3_client_method(void); SSLv3 协议

SSL_METHOD* SSLv23_client_method(void); SSLv2/v3 协议

服务器同样需要创建本次会话所使用的协议:

SSL_METHOD *TLSv1_server_method(void);

SSL_METHOD *SSLv2_server_method(void);

SSL_METHOD *SSLv3_server_method(void);

SSL_METHOD *SSLv23_server_method(void);

需要注意的是客户端和服务器需要使用相同的协议。

2.申请SSL会话的环境 CTX,使用不同的协议进行会话,其环境也是不同的。申请SSL会话环境的OpenSSL函数是

SSLK_CTX* SSL_CTX_new (SSL_METHOD*); 参数就是前面我们申请的 SSL通讯方式。返回当前的SSL 连接环境的指针。

然后根据自己的需要设置CTX的属性,典型的是设置SSL 握手阶段证书的验证方式和加载自己的证书。

void SSL_CTX_set_verify (SSL_CTX* , int , int* (int, X509_STORE_CTX*) )

设置证书验证的方式。

第一个参数是当前的CTX 指针,第二个是验证方式,如果是要验证对方的话,就使用 SSL_VERIFY_PEER。不需要的话,使用SSL_VERIFY_NONE.一般情况下,客户端需要验证对方,而服务器不需要。第三个参数是处理验证的回调函数,如果没有特殊的需要,使用空指针就可以了。

void SSL_CTX_load_verify_locations(SSL_CTX*, const char* , const char*);

加载证书;

第一个参数同上,参数二是证书文件的名称,参数三是证书文件的路径;

int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type);

加载本地的证书;type 指明证书文件的结构类型;失败返回-1

int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type);

加载自己的私钥;type 参数指明私钥文件的结构类型;失败返回-1

加载了证书和文件之后,就可以验证私钥和证书是否相符:

BOOl SSL_CTX_check_private_key (SSL_CTX*);

3.既然SSL 使用TCP 协议,当然需要把SSL attach 到已经连接的套接字上了:

SSL* SSL_new (SSL_CTX*); 申请一个SSL 套节字;

int SSL_set_rfd (SSL*); 绑定只读套接字

int SSL_set_wfd (SSL*); 绑定只写套接字

int SSL_set_fd ( SSL*); 绑定读写套接字

绑定成功返回 1, 失败返回0;

4. 接下来就是SSL 握手的动作了

int SSL_connect (SSL*); 失败返回 -1

5. 握手成功之后,就可以进行通讯了,使用SSL_read 和SS_write 读写SSL 套接字代替传统的read 、write

int SSL_read (SSL *ssl, char *buf, int num );

int SSL_write (SSL *ssl, char *buf, int num);

如果是服务器,则使用 SSL_accept 代替传统的 accept 调用

int SSL_accept(SSL *ssl);

6. 通讯结束,需要释放前面申请的 SSL资源

int SSL_shutdown(SSL *ssl); 关闭SSL套接字;

void SSL_free (ssl); 释放SSL套接字;

void SSL_CTX_free (ctx); 释放SSL环境;

OpenSSL 虽然已经发展到了0.9.96版本,但是它的文档还很少,甚至连最基本的man 函数手册都没有完成。所以,本文紧紧是讲述了使用OpenSSL 进行程序设计的框架。更加详细的资料可以参考OpenSSL 的文档或者 Apache mod_ssl 的文档。

通过以上的介绍,我想读者对SSL协议已经有了一定的了解,作者有机会将会继续给大家介绍SSL协议的其他方面的内容。

框架图:

时间: 2024-11-05 20:45:58

Linux之SSL安全套接字20160704的相关文章

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

由于项目中必须得用JDK6来作为Java环境,于是连接SQLServer时出现了com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接.错误:"Java.lang.RuntimeException: Could not generate DH keypair".这样的错误. 这个在JDK7中是修复了的,所以如果项目允许的话就换成JDK7吧,但有些只能用JDK6

Java安全套接字扩展——JSSE

上节已经介绍了SSL/TLS协议的通信模式,而对于这些底层协议,如果要每个开发者都自己去实现显然会带来不必要的麻烦,正是为了解决这个问题Java为广大开发者提供了Java安全套接字扩展--JSSE,它包含了实现Internet安全通信的一系列包的集合,是SSL和TLS的纯Java实现,同时它是一个开放的标准,每个公司都可以自己实现JSSE,通过它可以透明地提供数据加密.服务器认证.信息完整性等功能,就像使用普通的套接字一样使用安全套接字,大大减轻了开发者的负担,使开发者可以很轻松将SSL协议整合

第10章 网络安全(3)_SSL安全套接字层

4. 安全套接字层 4.1 安全套接字层(SSL)和传输层安全(TLS) (1)SSL/TLS提供的安全服务 ①SSL服务器鉴别,允许用户证实服务器的身份.支持SSL的客户端通过验证来自服务器的证书,来鉴别服务器的真实身份,并获取服务器的公钥. ②SSL客户鉴别,允许服务器证实客户身份.这个信息对服务器很重要的.例如,当银行把有关财务的保密信息发送给客户时,就必须检验接收者的身份. ③加密的SSL会话,客户和服务器交互的所有数据都在发送方加密,在接收方解密.第三方无法窃听.同时SSL具有校验机制

SSL安全套接层

SSL安全套接层: 是一种在两台机器之间提供安全通道的协议,它具有保护传输数据识别通信机器的功能. SSL协议由两层组成: SSL记录协议(它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装.压缩.加密等基本功能的支持) SSL握手协议(它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证.协商加密算法.交换加密密钥等) ssl握手主要是为了得到会话密钥,握手本身属于非对称加密,当得到会话密钥后,以后的数据传输都会使用对称算法进行 SSL握手过程: 1.客户端

linux网络编程——套接字(socket)入门

1.套接字的基本结构 struct sockaddr 这个结构用来存储套接字地址. 数据定义: struct sockaddr { unsigned short sa_family; /* address族, AF_xxx */ char sa_data[14]; /* 14 bytes的协议地址 */ }; sa_family 一般来说,都是"AFINET". sa_data 包含了一些远程电脑的地址.端口和套接字的数目,它里面的数据是杂溶在一切的. 为了处理struct socka

Linux之socket套接字编程20160704

介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的 区别,我觉得这是没有从本质上弄清楚网络通信! TCP/IP协议是一个协议簇.里面包括很多协议的.UDP只是其中的一个.之所以命名为TCP/IP协议,因为TCP,IP协议是 两个很重要的协议,就用他两命名了. TCP/IP协议集包括应用层,传输层,网络层,网络访问层. 其中应用层包括: 超文

Linux进程间通信 -- 数据报套接字 socket()、bind()、sendto()、recvfrom()、close()

前一篇文章,Linux进程间通信——使用流套接字介绍了一些有关socket(套接字)的一些基本内容,并讲解了流套接字的使用,这篇文章将会给大家讲讲,数据报套接字的使用. 一.简单回顾——什么是数据报套接字 socket,即套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行.也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信.也因为这样,套接字明确地将客户端和服务器区分开来. 相对于流套接字,数据报套接字的

Linux Socket 原始套接字编程

对于linux网络编程来说,可以简单的分为标准套接字编程和原始套接字编程,标准套接字主要就是应用层数据的传输,原始套接字则是可以获得不止是应用层的其他层不同协议的数据.与标准套接字相区别的主要是要开发之自己构建协议头.对于原始套接字编程有些细节性的东西还是需要注意的. 1. 原始套接字创建 原始套接字的编程和udp网络编程的流程有点类似,但是原始套接字编程中不需要bind操作,因为在数据接收和发送过程中使用sendto和recvfrom函数实现数据的接收和发送.不过不是说原始套接字不能使用bin

Linux 网络编程——套接字的介绍

套接字是一种通信机制(通信的两方的一种约定),凭借这种机制,不同主机之间的进程可以进行通信.我们可以用套接字中的相关函数来完成通信过程. 套接字的特性有三个属性确定,它们是:域(domain),类型(type),和协议(protocol). 套接字的域 域指定套接字通信中使用的网络介质.最常见的套接字域是 AF_INET,它是指 Internet 网络,许多 Linux 局域网使用的都是该网络,当然,因特网自身用的也是它. 套接字类型 流套接字(SOCK_STREAM): 流套接字用于提供面向连