openssl实现

本文介绍SSL/TLS协议的功能与工作原理,包括握手阶段与应用阶段的详细流程。同时讲解了OpenSSL工具的使用方法,涉及证书生成、密钥管理及证书签署流程。

1. 安全协议
 SSL:Secure Socket Layer,TLS: Transport Layer Security
  功能:机密性,认证,完整性,重放保护
 两阶段协议,分为握手阶段和应用阶段
  握手阶段(协商阶段):客户端和服务器端认证对方身份依赖于PKI体系,利用数字证书进行身份认证)并协商通信中使用的安全参数、密码套件以及主密钥后续通信使用的所有密钥都是通过MasterSecret生成
  应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信
 Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换
 ChangeCipherSpec 协议:一条消息表明握手协议已经完成
 Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别
 fatal类型错误会直接中断SSL链接
 warning级别的错误SSL链接仍可继续,只是会给出错误警告
 Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等
 HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合
 HTTP over SSL”或“HTTP over TLS”,对http协议的文本数据进行加密处理后,成为二进制形式传输
 步骤:
  client 发送请求 server
  server 回应一个 ca
  client 检查ca 通过 产生一个随机口令 用ca中的公钥加密发送给服务器
  server 用私钥解密 获得随机口令
  server 回应发送crypted用随机口令加密
2. OpenSSL
 三个组件:
  openssl:多用途的命令行工具,包openssl
  libcrypto:加密算法库,包openssl-libs
  libssl:加密模块应用库,实现了ssl及tls,包nss
  openssl命令:
 两种运行模式:交互模式和批处理模式
 openssl version:程序版本号
 标准命令、消息摘要命令、加密命令
  标准命令:enc, ca, req, …
 对称加密:
  工具:openssl enc, gpg
  算法:3des, aes, blowfish, twofish
   enc命令:
    帮助:man enc
    加密: -e 加密 -a base64编码(6位二进制表示一个字符与assic码进行转换)
    openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher
    解密:
    openssl enc -d -des3 -a -salt –in testfile.cipher -out testfile
 单向加密:
  工具:md5sum, sha1sum, sha224sum,sha256sum… openssl dgst
   dgst命令:
    帮助:man dgst
    openssl dgst -md5 [-hex默认] /PATH/SOMEFILE
    openssl dgst -md5 testfile
   md5sum /PATH/TO/SOMEFILE
  MAC: Message Authentication Code,单向加密的一种延伸应用,用于实现网络通信中保证所传输数据的完整性机制
   CBC-MAC
   HMAC:使用md5或sha1算法
 生成用户密码:
  passwd命令:
  帮助:man sslpasswd
   openssl passwd -1 -salt SALT(最多8位)
   示例:openssl passwd -1 –salt centos
 生成随机数:
  帮助:man sslrand
  openssl rand -base64|-hex NUM
  NUM: 表示字节数,使用-hex,每个字符为十六进制,相当于4位二进制,出现的字符数为NUM*2
 公钥加密:
  算法:RSA, ELGamal
  工具:gpg, openssl rsautl(man rsautl)
  数字签名:
   算法:RSA, DSA, ELGamal
  密钥交换:
   算法:dh
   DSA:Digital Signature Algorithm
   DSS:Digital Signature Standard
   RSA:
   生成密钥对儿:man genrsa
 生成私钥
  openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS
  (umask 077; openssl genrsa –out test.key –des 2048)
  openssl rsa -in test.key –out test2.key 将加密key解密
 从私钥中提取出公钥
  openssl rsa -in PRIVATEKEYFILE –pubout –out PUBLICKEYFILE
  openssl rsa –in test.key –pubout –out test.key.pub
 随机数生成器:伪随机数字
  键盘和鼠标,块设备中断
  /dev/random:仅从熵池返回随机数;随机数用尽,阻塞
  /dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞
 PKI:Public Key Infrastructure
  CA
  RA
  CRL
  证书存取库
 建立私有CA:
  OpenCA
  openssl
3. 证书申请及签署步骤
 1、生成申请请求
 2、RA核验
 3、CA签署
 4、获取证书
 创建CA和申请证书
  创建私有CA:
   openssl的配置文件:/etc/pki/tls/openssl.cnf
   三种策略:match匹配、optional可选、supplied提供
   match:要求申请填写的信息跟CA设置信息必须一致
   optional:可有可无,跟CA设置信息可不一致
   supplied:必须填写这项申请信息,
  创建所需要的文件
   touch /etc/pki/CA/index.txt 生成证书索引数据库文件
   echo 01 > /etc/pki/CA/serial 指定第一个颁发证书的序列号
   index.txt.old是index.txt文件上一个证书颁发前的备份
   index.txt.attr 证书主题是否唯一
  CA自签证书
   生成私钥
   cd /etc/pki/CA/
   (umask 066; openssl genrsa -out private/cakey.pem 4096)
  生成自签名证书
   openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem
   选项说明:
    -new:生成新证书签署请求
     -x509:专用于CA生成自签证书
     -key:生成请求时用到的私钥文件
    -days n:证书的有效期限
    -out /PATH/TO/SOMECERTFILE: 证书的保存路径
  查看证书:
   openssl x509 -in cakey.pem -out text;cat text
  颁发证书
   在需要使用证书的主机生成证书请求
   给web服务器生成私钥
    (umask 066; openssl genrsa –out /data/test.key 2048)
   生成证书申请文件
    openssl req -new -key /data/test.key -out /data/test.csr
   将证书请求文件传输给CA
   CA签署证书,并将证书颁发给请求者
    openssl ca -in /tmp/test.csr –out /etc/pki/CA/certs/test.crt -days 100
    注意:默认要求 国家,省,公司名称三项必须和CA一致
  查看证书中的信息:
   openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|issuer|subject|serial|dates
    openssl ca -status SERIAL 查看指定编号的证书状态
  吊销证书
    在客户端获取要吊销的证书的serial
    openssl x509 -in /PATH/FROM/CERT_FILE -noout -serial -subject
   在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致,吊销证书:
    openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
   指定第一个吊销证书的编号,注意:第一次更新证书吊销列表前,才需要执行
    echo 01 > /etc/pki/CA/crlnumber
   更新证书吊销列表
    openssl ca -gencrl -out /etc/pki/CA/crl.pem
   查看crl文件
    openssl crl -in /etc/pki/CA/crl.pem -noout -text

使用OpenSSL实现HTTPS的方法可从多个方面展开: - **C++实现**:可以基于OpenSSL实现HTTPS通信,具体可参考基于OpenSSL实现的安全连接SSL API文档等资料,其中涉及到SSL连接建立过程分析、SSL socket通讯详解等内容,涵盖了使用OpenSSL API建立SSL通信的一般流程简介以及关于证书文件的加载等要点[^1]。 - **C语言实现**:在C程序里,能够运用OPENSSL库发送HTTPS请求并接收数据。首先要研究浏览器发送的请求数据,接着进行代码实现。比如可请求12306获取高铁、动车、火车车次信息,后续还需对数据进行分析,像12306车站名和车次信息分析,最后进行展示[^3]。 - **自建CA及密钥生成**:在openssl代码实现中,包含生成公钥私钥和自建CA的步骤。自建CA后,分别生成服务端公钥和私钥、客户端公钥和私钥,之后通过c语言进行SSL交互,包含服务端和客户端的SSL握手细节,如抓包分析三次握手,包括client Hello、server回复和发送客户端、客户端进行验证并回复服务端,沟通完成后产生新的session Ticket,最后客户端回复ack,完成SSL沟通[^2]。 - **NGINX配置**:NGINX可使用OpenSSL自签证书实现HTTPS安全访问。启动后访问http://IP ,若端口被占用,需修改/nginx/conf/nginx.conf中http模块的监听端口。还需安装OpenSSL,具体步骤为创建指定目录,下载OpenSSL源码包,解压后进入目录,设置安装路径,最后进行编译和安装[^4]。 以下是一个简单的使用OpenSSL发送HTTPS请求的C语言示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/ssl.h> #include <openssl/err.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define SERVER "www.example.com" #define PORT 443 int main() { SSL_CTX *ctx; SSL *ssl; int sockfd; struct sockaddr_in server_addr; // 初始化OpenSSL库 SSL_library_init(); OpenSSL_add_all_algorithms(); SSL_load_error_strings(); // 创建SSL上下文 ctx = SSL_CTX_new(TLS_client_method()); if (ctx == NULL) { ERR_print_errors_fp(stderr); return 1; } // 创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("socket"); return 1; } // 设置服务器地址 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); inet_pton(AF_INET, SERVER, &server_addr.sin_addr); // 连接服务器 if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { perror("connect"); close(sockfd); return 1; } // 创建SSL对象 ssl = SSL_new(ctx); if (ssl == NULL) { ERR_print_errors_fp(stderr); close(sockfd); return 1; } // 将SSL对象与套接字关联 if (SSL_set_fd(ssl, sockfd) != 1) { ERR_print_errors_fp(stderr); close(sockfd); return 1; } // 执行SSL握手 if (SSL_connect(ssl) != 1) { ERR_print_errors_fp(stderr); close(sockfd); return 1; } // 发送HTTP请求 const char *request = "GET / HTTP/1.1\r\n" "Host: www.example.com\r\n" "Connection: close\r\n\r\n"; if (SSL_write(ssl, request, strlen(request)) <= 0) { ERR_print_errors_fp(stderr); close(sockfd); return 1; } // 接收响应 char buffer[1024]; int bytes; while ((bytes = SSL_read(ssl, buffer, sizeof(buffer))) > 0) { fwrite(buffer, 1, bytes, stdout); } // 关闭SSL连接和套接字 SSL_shutdown(ssl); SSL_free(ssl); close(sockfd); // 释放SSL上下文 SSL_CTX_free(ctx); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值