使用OPENSSL编写服务器和客户端代码实例
- 格式:docx
- 大小:23.76 KB
- 文档页数:5
OpenSSL命令---s_client/as3luyuan123/article/details/16812071⽤途:s_client为⼀个SSL/TLS客户端程序,与s_server对应,它不仅能与s_server进⾏通信,也能与任何使⽤ssl协议的其他服务程序进⾏通信。
⽤法:[cpp]1. openssl s_client [-host host] [-port port] [-connect host:port] [-verify depth] [-cert filename]2. [-certform DER|PEM] [-key filename] [-keyform DER|PEM] [-pass arg] [-CApath directory] [-CAfile filename]3. [-reconnect][-pause] [-showcerts] [-debug] [-msg] [-state] [-nbio_test] [-nbio][-crlf] [-ign_eof] [-no_ign_eof]4. [-quiet] [-ssl2] [-ssl3] [-tls1_1] [-tls1_2] [-tls1] [-dtls1] [-no_ssl2][-no_ssl3] [-no_tls1] [-no_tls1_1]5. [-no_tls1_2] [-bugs] [-cipher cipherlist] [-starttls protocol] [-engine id] [-tlsextdebug] [-no_ticket]6. [-sess_out filename] [-sess_in filename] [-rand file(s)]选项说明:-host host:设置服务地址。
-port port:设置服务端⼝,默认为4433。
-connect host:port:设置服务器地址和端⼝号。
OpenSSL 是一个强大的安全套接字层密码库,包含了各种加密算法的实现,提供了通用的密码安全服务。
下面是一个简要的OpenSSL 操作手册,包括一些常用的命令和选项:1. 生成密钥对:```openssl genpkey -algorithm RSA -out private_key.pemopenssl rsa -pubout -in private_key.pem -out public_key.pem```2. 生成自签名证书:```cssopenssl req -new -x509 -key private_key.pem -out cert.pem -days 365```3. 生成证书签名请求(CSR):```openssl req -new -key private_key.pem -out request.csr```4. 验证证书签名:```bashopenssl x509 -in cert.pem -text -noout```5. 导出证书为PEM 格式:```bashopenssl x509 -in cert.der -inform DER -outform PEM -out cert.pem```6. 加密数据:```cssopenssl enc -aes-256-cbc -salt -in plaintext.txt -out ciphertext.enc```7. 解密数据:```cssopenssl enc -aes-256-cbc -d -in ciphertext.enc -out plaintext.txt```8. 生成随机数:```openssl rand -out random.bin 1024```9. 验证数字签名:```cssopenssl dgst -sha256 -sign private_key.pem -in file.txt -out signature.bin openssl dgst -sha256 -verify public_key.pem -signature signature.bin file.txt```10. 生成Diffie-Hellman 密钥交换参数:```openssl dhparam -out dhparam.pem 2048```11. 生成CA 证书:```cssopenssl req -new -x509 -days 365 -extensions v3_ca -key private_ca_key.pem -out ca.pem```12. 生成服务器证书:```cssopenssl req -new -key private_server_key.pem -out server.reqopenssl x509 -req -days 365 -in server.req -CA ca.pem -CAkey private_ca_key.pem -CAcreateserial -out server.pem```13. 生成客户端证书:```cssopenssl req -new -key private_client_key.pem -out client.reqopenssl x509 -req -days 365 -in client.req -CA ca.pem -CAkey private_ca_key.pem -CAcreateserial -out client.pem```这只是一些常见的OpenSSL 命令示例,OpenSSL 还提供了许多其他功能和选项,具体可以参考官方文档或使用`man openssl` 命令来获取完整的操作手册。
openssl编程入门(含完整示例)易剑1.编写目的第一次跑起openssl示例并不太简单,本文的目的是为了让这个过程变得非常简单。
在开始之前,要非常感谢周立发同学,正是通过他共享的示例,较轻松的入了门。
本文档对他共享的示例中的一个小错误进行了修正,并提供了傻瓜式的“编译-生成-KEY运行”一条龙脚本(方法请参见压缩包中的readme文件),让跑第一个openssl程序变得轻轻松松。
2.示例包ssl_test.tar.gz openssl-0.9.8h-SuSE10.tar.gzssl_test.tar.gz为示例源代码包,openssl-0.9.8h-SuSE10.tar.gz为openssl二进制包,测试时是安装在/usr/local/ssl。
ssl_test.tar.gz中的示例在SuSE10中测试通过,使用的是openssl-0.9.8h,它包括如下文件:-rw-r--r--1root root1346Dec518:11cacert.pem-rwxr-xr-x1root root114Dec518:11make_key.sh-rwxr-xr-x1root root172Dec518:37mk_client.sh-rwxr-xr-x1root root172Dec518:37mk_server.sh-rw-r--r--1root root1679Dec518:11privkey.pem-rw-r--r--1root root167Dec518:39readme-rwxr-xr-x1root root38Dec518:38run_client.sh-rwxr-xr-x1root root64Dec518:38run_server.sh-rwxr-xr-x1root root1140142Dec518:38ssl_client-rw-r--r--1root root3928Dec517:31ssl_client.cpp-rwxr-xr-x1root root1139667Dec518:38ssl_server-rw-r--r--1root root4882Dec517:31ssl_server.cppreadme为包内容说明,run_server.sh用来运行服务端,run_client.sh用来运行客户端,mk_server.sh用来编译服务端,mk_client.sh用来编译客户端,make_key.sh用来生成钥匙KEY。
OpenSSL使用指南目录1.介绍2.编译3.运行OpenSSL.exe4.算法编程API4.1 对称算法4.1.1 DES4.1.2 AES4.1.3 RC44.1.4 EVP_4.2 公钥算法4.3 Hash算法4.4 随机数算法5.SSL协议编程API6.CA和证书7.8.参考网址9.A.示例程序B.1.介绍OpenSSL是使用非常广泛的SSL的开源实现。
由于其中实现了为SSL所用的各种加密算法,因此OpenSSL也是被广泛使用的加密函数库。
1.1 SSLSSL(Secure Socket Layer)安全协议是由Netscape公司首先提出,最初用在保护Navigator浏览器和Web服务器之间的HTTP通信(即HTTPS)。
后来SSL协议成为传输层安全通信事实上的标准,并被IETF吸收改进为TLS(Transport Layer Security)协议。
SSL/TLS协议位于TCP协议和应用层协议之间,为传输双方提供认证、加密和完整性保护等安全服务。
SSL作为一个协议框架,通信双方可以选用合适的对称算法、公钥算法、MAC 算法等密码算法实现安全服务。
1.2 OpenSSLOpenSSL是著名的SSL的开源实现,是用C语言实现的。
OpenSSL的前身是SSLeay,一个由Eric Young开发的SSL的开源实现,支持SSLv2/v3和TLSv1。
伴随着SSL协议的普及应用,OpenSSL被广泛应用在基于TCP/Socket的网络程序中,尤其是OpenSSL和Apache相结合,是很多电子商务网站服务器的典型配置。
2.编译和安装OpenSSLOpenSSL开放源代码,这对学习、分析SSL和各种密码算法提供了机会,也便于在上面进一步开发。
2.1 获得OpenSSL到OpenSSL的网站即可下载当前版本的OpenSSL源代码压缩包。
当前版本openssl-0.9.8.tar.gz,只有3M多,比较精简。
openssl编程示例以OpenSSL编程示例为标题的文章是关于如何使用OpenSSL库进行编程的。
OpenSSL是一个开源的加密工具包,提供了许多密码学功能,如加密、解密、签名和验证等。
在本文中,我将介绍OpenSSL 库的基本使用方法,并提供一些编程示例来帮助读者更好地理解。
OpenSSL是一个功能强大且广泛使用的加密库,可以用于开发各种应用程序,包括网络安全、数据传输和身份验证等。
它支持许多密码学算法,如对称加密算法(如AES和DES)、非对称加密算法(如RSA和ECC)以及哈希函数(如MD5和SHA-256)等。
在开始使用OpenSSL之前,我们需要安装OpenSSL库并配置开发环境。
安装OpenSSL库的具体方法因操作系统而异,可以在OpenSSL 官方网站上找到相关的安装指南。
配置开发环境主要包括设置编译器参数和链接库文件等。
一旦环境配置完成,我们就可以开始使用OpenSSL库进行编程了。
下面是一些常用的OpenSSL编程示例:1. 生成密钥对使用OpenSSL库生成非对称加密算法所需的密钥对是一个常见的操作。
以下是一个生成RSA密钥对的示例代码:```c#include <openssl/rsa.h>int main() {RSA* rsa = RSA_generate_key(2048, RSA_F4, NULL, NULL);if (rsa == NULL) {printf("Failed to generate RSA key pair\n");return -1;}// 打印公钥和私钥printf("Public Key:\n%s\n", BN_bn2hex(rsa->n));printf("Private Key:\n%s\n", BN_bn2hex(rsa->d));RSA_free(rsa);return 0;}```2. 加密和解密数据使用OpenSSL库进行数据加密和解密是保护数据安全的常见操作。
OpenSSL 编程入门作者:Eric Rescorla on Sat, 2001-09-01 01:0如果你急切的想构建一个简单的Web客户端和服务器对,这时你就需要使用SSL了..SSL是一种保护基于TCP协议的网络应用最快而且最简单的的方法,如果你正在用C语言做开发,那么对于你来说,最好的选择可能就是使用OpenSSL了. OpenSSL是在Eric Young 的SSLeay包的基础上对TSL/SSL的一个免费的执行(类似于BSD方式的License).然而, 不幸运的事情是, 伴随OpenSSL一起发布的文档和示例代码并不是很完全, 使用它的人需要更多的东西.在OpenSSL被使用之处, man手册都相当优秀,可是这些手册失去了大的背景因为它们只是参考资料而不是教程.OpenSSL的API多而复杂, 因此我们在此并不会作出一个完整的讲述. 相反,我的目的只是教会你如何去高效的使用man手册.在本文中, 我们将会通过构建一个简单的Web客户端和服务器来演示OpenSSL的基本特点. 而在后续的第二篇中我们将会介绍OpenSSL的一些高级特性, 比如会话恢复和客户端认证等.在话题开始之前, 我会认为你已经熟悉SSL和HTTP了, 或者最起码在概念层上应该有一些了解. 如果你对此一无所知, 推荐一个比较好的方法,那就是参考RFC(参见附录).由于篇幅原因, 本文只包涵了源代码的一些摘录, 完整的代码可以从作者的站点/openssl-examples/上下载.程序我们的客户端是一个简单的HTTPS(见RFC 2818)客户端,它在初始化了一个到达服务器的SSL连接之后便通过这个连接将HTTP请求传送给HTTP服务器. 然后等待服务器端的响应,并将响应信息打印在屏幕上.这是对通常那些”获取并且打印信息”的程序功能更简化的一个例子.服务器端程序是一个简单的HTTPS 服务器, 它等待从客户端发出的TCP连接, 每当接收到一个连接时,它会磋商这个连接(的合法性). 一旦这个连接被确定下来, 它会读取客户端的HTTP请求, 并将HTTP请求的响应信息传输给客户端. 当响应传输完毕时它会关闭这个连接.我们的第一个任务就是建立一个上下文对象(一个SSL_CTX), 这个上下文对象会在每次需要建立新的SSL连接的时候被用来创建一个新的连接对象. 而这些连接对象则用于SSL的握手,读和写.(使用上下文对象)这种方法有两个优点: 首先, 上下文对象允许一次初始化多个结构体, 这样就提提高了性能. 在大多数应用中, 每一个SSL连接都使用相同的加密算法(keying material)和CA(certificate authority)列表等. 而采用上面这种方法, 我们就不需要在每次连接的时都去加载这些信息(加密算法和证书), 而只需要在程序启动时将它们加载进上下文对象中. 然后,当我们需要创建一个新的连接时, 只需要将新的连接简单的指向这个上下文对象就可以了. 使用一个简单的上下文对象的第二个好处就是它允许多个SSL连接之间共享数据, 比如用于SSL会话恢复的SSL缓冲(cache). 上下文初始化由主要的四个任务组成, 通过列表1所示的initialize_ctx()函数来完成.列表 1 initialize_ctx()在应用OpenSSL之前, 整个库需要进行初始化, 这个过程通过SSL_library_init()函数来完成,它主要加载OpenSSL将会用到的算法, 如果我们想要很好的报告差错信息, 同样需要通过SSL_load_error_strings()来加载错误字符串, 否则, 就不能够将OpenSSL的错误映射为字符串.我们同样需要创建一个对象来作为错误打印的上下文. OpenSSL为输入和输出抽象了一个叫做BIO对象的概念.这样可以使得程序员针对不同种类的IO通道(socket, 中断,内存缓冲等)使用相同的函数,而唯一的差别就是在函数中使用的是不同种类的BIO对象.在本例中,我们通过将一个BIO对象与标准错误stderr绑定来打印错误信息.如果你正在写一个能够执行客户端认证的服务器或者客户端程序, 你就需要加载自己的公钥或者私钥以及相关的证书.证书存储空隙中, 并且通过SSL_CTX_use_certificate_chain_file()函数与CA证书一起被加载形成证书链表. SSL_CTX_use_PrivateKey_file()函数用来加载私钥.出于安全原因, 私钥通常通过密码来加密, 如果使用密码加密的话, 密码回调函数(通过SSL_CTX_set_default_passwd_cb()来设置)将会在获取密码时被调用的.如果你需要认证已经连接到你的客户端, OpenSSL需要知道你信任哪些CA, SSL_CTX_load_verify_locations()调用用来加载CA.为了保证安全, OpenSSL需要一个好的强性随机数源, 通常,为随机数生成器(RNG)提供种子原料是应用本身的责任, 然而,如果/dev/urandom可用的话,OPenSSL会自动的使用/var/urandom来为RNG播种, 由于/dev/urandom在Linux是标准化的, 我们不需要为它做任何事情, 这个就很方便了, 因为收集随机数很诡异,而且很容易引起系统抖动上升. 注意,如果你在一台不是Linux的系统上,你可能会在某些时刻得到错误数据, 因为随机数产生器没有被播种, OpenSSL的rand(3) man手册为你提供了更多可以参考的信息.客户端当SSL完成了对SSL上下文对象的初始化后,它已经为连接到服务器做好准备。
openssl使用方式
摘要:
1.OpenSSL 简介
2.OpenSSL 的使用方式
3.示例:使用OpenSSL 进行加密和解密
4.小结
正文:
OpenSSL 是一个安全套接字层(SSL)和传输层安全(TLS)协议的开源加密库,广泛应用于互联网的安全通信。
它支持多种加密算法、数字签名、证书管理等功能,为网络应用程序提供了安全的通信功能。
OpenSSL 的使用方式主要分为以下几个步骤:
1.安装OpenSSL 库:首先,你需要在你的计算机或服务器上安装OpenSSL 库。
在Linux 系统中,可以使用“sudo apt-get install openssl”命令进行安装。
在Windows 系统中,可以通过访问OpenSSL 官网下载相应版本的安装包进行安装。
2.配置OpenSSL:安装完成后,你需要对OpenSSL 进行配置,以便它能够正确地为你的应用程序提供服务。
配置过程包括设置加密算法、生成密钥和证书等。
具体的配置方法可以参考OpenSSL 的官方文档。
3.初始化OpenSSL:在应用程序中,你需要使用OpenSSL 的API 对SSL/TLS 连接进行初始化。
这一步通常包括创建一个SSL/TLS 上下文、初始化一个SSL/TLS 连接等。
4.加密和解密数据:在数据传输过程中,你需要使用OpenSSL 的API 对数据进行加密和解密。
加密过程中,你需要使用SSL/TLS 上下文和密钥对数据进行加密;解密过程中,你需要使用SSL/TLS 上下文和相应的私钥对数据进行解密。
使用OPENSSL编写服务器和客户端代码实例使用相同的ca生成两个证书,一个是server.cer,一个是client.cer,注意生成server.cer的时候必须指明证书可以用于服务端的。
服务器代码:1.#include "openssl/bio.h"2.#include "openssl/ssl.h"3.#include "openssl/err.h"4.5.#include <cutil.h>6.7.#define EXIT_IF_TRUE(x) if (x) \8. do { \9. fprintf(stderr, "Check '%s' is true\n", #x); \10. ERR_print_errors_fp(stderr); \11. exit(2); \12. }while(0)13.14.int main(int argc, char **argv)15.{16. SSL_CTX *ctx;17. SSL *ssl;18. X509 *client_cert;19.20. char szBuffer[1024];21. int nLen;22.23. struct sockaddr_in addr;24. int len;25. int nListenFd, nAcceptFd;26.27.// 初始化28. cutil_init();29. cutil_log_set_level(LOG_ALL);30. cutil_log_set_stderr(1);31. SSLeay_add_ssl_algorithms();32. OpenSSL_add_all_algorithms();33. SSL_load_error_strings();34. ERR_load_BIO_strings();35.36.// 我们使用SSL V3,V237. EXIT_IF_TRUE((ctx = SSL_CTX_new (SSLv23_method())) == NULL);38.39.// 要求校验对方证书40. SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);41.42.// 加载CA的证书43. EXIT_IF_TRUE (!SSL_CTX_load_verify_locations(ctx, "cacert.cer", NULL));44.45.// 加载自己的证书46. EXIT_IF_TRUE (SSL_CTX_use_certificate_file(ctx, "server.cer", SSL_FILETYPE_PEM) <= 0) ;47.48.// 加载自己的私钥49. EXIT_IF_TRUE (SSL_CTX_use_PrivateKey_file(ctx, "server.key", SSL_FILETYPE_PEM)<= 0) ;50.51.// 判定私钥是否正确52. EXIT_IF_TRUE (!SSL_CTX_check_private_key(ctx));53.54.// 创建并等待连接55. nListenFd = cutil_socket_new(SOCK_STREAM);56. cutil_socket_bind(nListenFd, NULL, 8812, 1);57.58. memset(&addr, 0, sizeof(addr));59. len = sizeof(addr);60. nAcceptFd = accept(nListenFd, (struct sockaddr *)&addr, (size_t *)&len);61. cutil_log_debug("Accept a connect from [%s:%d]\n",62. inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));63.64.// 将连接付给SSL65. EXIT_IF_TRUE( (ssl = SSL_new (ctx)) == NULL);66. SSL_set_fd (ssl, nAcceptFd);67. EXIT_IF_TRUE( SSL_accept (ssl) != 1);68.69.// 进行操作70. memset(szBuffer, 0, sizeof(szBuffer));71. nLen = SSL_read(ssl,szBuffer, sizeof(szBuffer));72. fprintf(stderr, "Get Len %d %s ok\n", nLen, szBuffer);73. strcat(szBuffer, " this is from server");74. SSL_write(ssl, szBuffer, strlen(szBuffer));75.76.// 释放资源77. SSL_free (ssl);78. SSL_CTX_free (ctx);79. close(nAcceptFd);80.}客户端代码1.#include "openssl/bio.h"2.#include "openssl/ssl.h"3.#include "openssl/err.h"4.5.#include <cutil.h>6.7.#define EXIT_IF_TRUE(x) if (x) \8. do { \9. fprintf(stderr, "Check '%s' is true\n", #x); \10. ERR_print_errors_fp(stderr); \11. exit(2); \12. }while(0)13.14.int main(int argc, char **argv)15.{16. SSL_METHOD *meth;17. SSL_CTX *ctx;18. SSL *ssl;19.20. int nFd;21. int nLen;22. char szBuffer[1024];23.24.// 初始化25. cutil_init();26. cutil_log_set_level(LOG_ALL);27. cutil_log_set_stderr(1);28. SSLeay_add_ssl_algorithms();29. OpenSSL_add_all_algorithms();30. SSL_load_error_strings();31. ERR_load_BIO_strings();32.33.// 我们使用SSL V3,V234. EXIT_IF_TRUE((ctx = SSL_CTX_new (SSLv23_method())) == NULL);35.36.// 要求校验对方证书37. SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);38.39.// 加载CA的证书40. EXIT_IF_TRUE (!SSL_CTX_load_verify_locations(ctx, "cacert.cer", NULL));41.42.// 加载自己的证书43. EXIT_IF_TRUE (SSL_CTX_use_certificate_file(ctx, "client.cer", SSL_FILETYPE_PEM) <= 0) ;44.45.// 加载自己的私钥46. EXIT_IF_TRUE (SSL_CTX_use_PrivateKey_file(ctx, "client.key", SSL_FILETYPE_PEM)<= 0) ;47.48.// 判定私钥是否正确49. EXIT_IF_TRUE (!SSL_CTX_check_private_key(ctx));50.51.// 创建连接52. nFd = cutil_socket_new(SOCK_STREAM);53. if(cutil_socket_connect(nFd, "127.0.0.1", 8812, 30) < 0)54. {55. cutil_log_error("连接服务器失败\n");56. return -1;57. }58.59.// 将连接付给SSL60. EXIT_IF_TRUE( (ssl = SSL_new (ctx)) == NULL);61. SSL_set_fd (ssl, nFd);62. EXIT_IF_TRUE( SSL_connect (ssl) != 1);63.64.// 进行操作65. sprintf(szBuffer, "this is from client %d", getpid());66. SSL_write(ssl, szBuffer, strlen(szBuffer));67.68.// 释放资源69. memset(szBuffer, 0, sizeof(szBuffer));70. nLen = SSL_read(ssl,szBuffer, sizeof(szBuffer));71. fprintf(stderr, "Get Len %d %s ok\n", nLen, szBuffer);72.73. SSL_free (ssl);74. SSL_CTX_free (ctx);75. close(nFd);76.}。