Linux自学笔记——OpenSSL命令行工具

简介:

      OpenSSL是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能以及ssl协议,并提供程序供测或其他目的使用。

      传输层协议:TCP, UDP, SCTP

           port:进程地址,进程向内核注册使用某端口(独占)

      同一主机上的进程间通信:IPC , message queue,shm,semerphor

      不同主机上的进程间通信:socket

           cip:port <-- --> sip:port

                 cip:55673 <-- --> sip:80

                 监听模式:LISTEN(ip:port)

      SSL:Secure Socket Layer

           http --> ssl --> https

      安全的目标:

           保密性:confidentiality

           完整性:integrity

           可用性:availability

      攻击类型:

           威胁保密性的攻击:窃听、通信量分析;

           威胁完整性的攻击:更改、伪装、重放、否认

           威胁可用性的攻击:拒绝服务(DoS)

      解决方案:

           技术(加密和解密)、服务(用于抵御攻击的服务,也即是为了上述安全目标而特地设计的安全服务)

          

           加密和解密:

                 传统加密方法:替代加密方法、置换加密方法

                 现代加密方法:现代块加密方法

           服务:

                 认证机制

                 访问控制机制

           密钥算法和协议

                 对称加密

                 公钥加密

                 单向加密

                 认证协议

Linux系统:OpenSSL(ssl),GPG(pgp)

      OpenSSL由三部分组成:

           libencrypto

           libssl

           openssl多用途命令行工具

      加密算法和协议:

           对称加密:加密和解密使用同一个密钥;

                 DES:Data EncryptionStandard;

                 3DES:triple DES

                 AES:Advanced EncryptionStandard;(128bits,192bits,256bits,384bits)

                 Blowfish

                 Twofish

                 IDEA

                 RC6

                 CAST5

                

                 特性:

1.     加密、解密使用同一个密钥

2.     将原始数据分割称为固定大小的块,组个进行加密;

 

缺陷:

1.     密钥过多;

2.     密钥分发困难;

公钥加密:密钥分为公钥与私钥

         公钥:从私钥中提取产生;可公开给所有人;pubkey

         私钥:通过工具创建,使用者自己留存,必须保证其私密性;secret key

                 特点:用公钥加密的数据,只能使用与之配对的私钥解密;反之亦然;

                

                 用途:

                      数字签名:主要在于让接收方确认发送方的身份;

                      密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方;

                      数据加密

                 算法:RSA,DSA,ELGamal

                      DSS:Digital SignatureStandard

                      DSA:Digital SignatureAlgorithm

           单向加密:即提出数据指纹;只能加密不能解密;

                 特性:定长输出、雪崩效应;

                 功能:保证数据完整性;

                 算法:

                      md5:message digest 5,  128bits

                      sha1:secure hashalgorithm 1, 160bits

                            sha224,sha256,sha384,sha512

           密钥交换:IKE(InternetKey Exchange)

                 公钥加密

                 DH(deffie-Hellman)

                      A: p,g

                      B: p,g

                     

                      A:x --> p^x%g==>B

                            A:(p^y%g)^x=p^yx%g

                      B: y

                            --> p^y%g ==>A

                            B: (p^x%g)^y=p^xy%g

      PKI:Public Key Infrastructure

           公钥基础设施:

                 签证机构:CA

                 注册机构:RA

                 证书吊销列表:CRL

                 证书存取库:

           x.509v3:定义了证书的结构以及认证协议标准

                 版本号

                 序列号

                 签名算法ID

                 发行者名称

                 有效期限

                 主体公钥

                 发行者的唯一标识

                 扩展

                 发行者的签名

      SSL:Secure sockets Layer

           Netscape: 1994

           V1.0, V2.0, V3.0

      TLS:Transport Layer security

           IETF:1999

           V1.0, V1.1, V1.2, V1.3

          

           分层设计:

1.     最底层:基础算法原语的实现,aes,rsa,md5

2.     向上一层:各种算法的实现;

3.     再向上一层;组合算法实现的半成品;

4.     用各种组件拼装而成的各种成品密码学协议软件;

SSL/TLS

      SSL:安全套接字层(ssl 1.0,ssl2.0,ssl3.0)

      TLS:传输层安全(tls 1.0,tls1.1,tls 1.2,tls 1.3)

 

SSL会话的主要三步:

      客户端向服务器端索要并验证证书;

      双方协商生成“会话密钥”;

      双方采用“会话密钥”进行加密通信;

 

      SSL Handshake Protocol:ssl握手协议

           第一阶段:ClientHello

                 支持协议的版本,比如tls 1.2;

                 客户端生成一个随机数,稍后用户生成“会话密钥”

                 支持的加密算法,比如AES、3DES、RSA;

                 支持的压缩算法;

           第二阶段:serverhello

                 确认使用的加密通信协议版本,比如tls 1.2;

                 服务器端生成一个随机数,稍后用于生成“会话密钥”

                 确认使用的加密方法;

                 服务器证书;

           第三阶段:

验证服务器证书,在确认无误后取出其公钥;(发证机构、证书完整性、证书持有者、证书有效期、吊销列表)

发送以下信息给服务器端:

          一个随机数;

          编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;

          客户端握手结束通知;

           第四阶段:

                 收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所有用到的“会话密钥”;

                 向客户端发送如下信息;

                      编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;

                      服务端握手结束通知;

Openssl(2)

组件:

      libcrypto,libssl主要由开发者使用;

      openssl:多用途命令行工具;

openssl

      从多子命令,分为三类:

           标准命令

           消息摘要命令(dgst子命令)

           加密命令(enc子命令)

      标准命令:enc,ca,req,genrsa,…

      对称加密:

           工具:openssl  enc   gpg

           支持的算法:3des,aes,blowfish,towfish

           enc命令:

                 加密:~]# openssl  enc -e  -des3  -a -salt  -in fstab   -out fstab.ciphertext

                 wKiom1neKHaiQ-t_AAFEazqshRY458.png-wh_50

                 解密:~]# openssl  enc -d  -des3  -a -salt  -out fstab   -in fstab.ciphertext

                 wKiom1neKH-DWkX0AACOom0HyY4151.png-wh_50

      单向加密:

           工具:openssl dgst,md5sum,sha1sum,sha224sum,…

           dgst命令:~]#openssl dgst –md5/path/to/somefile

           wKioL1nduXnD2E8zAAA9glhb_v4869.png-wh_50

           一般可以验证文件的完整性。

      生成用户密码:

           工具:passwd,openssl  passwd

                 openssl passwd -1 –salt  SALT

                 wKioL1nduYDCwP8pAAAhV_m4kNU748.png-wh_50

           Note:salt不同,相同的密码,输出也不同。

      生成随机数:

           工具:openssl rand

           ~]# openssl  rand -hex  NUM

           ~]# openssl  rand -base  NUM

           wKiom1neKJaxEL91AABwliPdT9A331.png-wh_50

      公钥加密:

           加密解密:

                 算法:RSA,ELGamal

                 工具:openssl rsautl,gpg

           数字签名:

                 算法:RSA,DSA,ELGamal

           密钥交换:

                 算法:DH

           生成密钥:

                 生成私钥:#(umask077 ;openssl genrsa –out /path/to/private_key_fileNUM_BITS)

                 wKiom1neKKCg4jypAACu4OOVs00559.png-wh_50

                 提出公钥:#openssl rsa –in /path/from/private_key_file  -pubout

                 wKioL1nduZqCaoTVAAA5vnfUWYE498.png-wh_50

Linux系统上的随机数生成器:

      /dev/random:仅从熵池返回随机数;随机数用尽,阻塞;

      /dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞;伪随机数不安全;

           熵池中随机数的来源;

                 磁盘IO中断时间间隔

                 键盘IO中断时间间隔

CA

      公共信任的CA,私有CA;

      建立私有CA:

           openssl

           OpenCA

      openssl命令:

           配置文件:/etc/pki/tls/openssl.cnf

           wKiom1neKLXTp-mtAAB58EC49bU077.png-wh_50

构建私有CA示例:准备两台主机,一台作CA主机192.168.19.128,一台作用户主机192.168.19.134(证书请求主机)

构建私有CA:在确定配置为CA的服务上生成一个自签证书,并为CA提供所需要的目录及文件即可;

步骤:

1)    生成私钥:

~]# (umask077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)

wKioL1ndubOiOZU4AACrEAT01YY890.png-wh_50

2)    生成自签证书;

~]# opensslreq -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem-days 3655

    -new:生成新证书签署请求;

    -x509:生成自签格式证书,专用于创建私有CA;

    -key:生成请求时用到的私钥文件路径;

    -out:生成的请求文件路径;如果自签操作将直接生成签署过的证书

    -days:证书的有效时长,单位为day;

wKiom1neKM_R4sxrAAHPJSwhJY0215.png-wh_50

3)    为CA提供所需的目录及文件;

~]# mkdir  -pv /etc/pki/CA/{certs,crl,newcerts}

~]# touch  /etc/pki/CA/{serial,index.txt}

~]# echo  01 > /etc/pki/CA/serial

wKioL1nduc6Q28Q9AAAhE2Qs3kA768.png-wh_50

      要用到证书进行安全通信的服务器,需要向CA请求签署证书;

      步骤:(以httpd为例)

1)    用到证书的主机生成私钥:

~]# mkdir  /etc/httpd/ssl

~]# cd  /etc/httpd/ssl

~]#(umask  077; openssl  genrsa -out /etc/httpd/ssl/httpd.key  2048)

wKioL1ndudjytRR6AAE0ZlrWCfw993.png-wh_50

2)    生成证书签署请求

wKiom1neKPCD7AMdAACD1smZHgA458.png-wh_50

3)    将请求通过可靠方式发给CA主机;

~]#scp /etc/httpd/ssl/httpd.csr  root@192.168.19.128:/tmp/

wKiom1neKPii-VhDAAAk5t7Q4dc737.png-wh_50

可在CA主机上查看请求主机发送的证书请求;

wKioL1ndufTBnZmkAADlzA1NWrY877.png-wh_50

4)    在CA主机上签署证书;

~]# opensslca  -in /tmp/httpd.csr  -out  /etc/pki/CA/certs/httpd.crt  -days 365

wKioL1nduf3AyNh6AACBiPHTaOw223.png-wh_50

查看 证书信息:

    ~]# openssl x509  -in/etc/pki/CA/certs/httpd.crt  -noout  -serial -subject

    wKiom1neKRaShbBOAAAeZHqiPGY085.png-wh_50

5)    CA所在的主机将签署完的证书,发送回请求主机;

~]#scp  /etc/pki/CA/certs/httpd.crt  root@192.168.19.134:/etc/httpd/ssl/

wKioL1nduhPx6mxAAAAgzAG2VWI980.png-wh_50

      吊销证书:

      步骤:

1)    客户端获取要吊销证书的serial(在使用证书的主机执行):

~]#openssl  x509 –in /etc/pki/CA/certs/httpd.crt  -noout -serial  -subject

wKioL1nduhuif-McAAAgFZTFZZQ477.png-wh_50

2)    CA主机吊销证书

先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致;

吊销:

    wKiom1neKTXSljPeAAAa6Sjncv0185.png-wh_50

    #openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.PEM

    wKiom1neKUDCVeDLAAAaLiAHN0E824.png-wh_50

          其中的 SERIAL要换成证书真正的序列号;

3)    生成吊销证书的吊销编号(第一次吊销证书时执行)

echo 01 >/etc/pki/CA/crlnumber

wKioL1ndujuQKtvmAAATOwBIFak440.png-wh_50

4)    更新吊销证书列表

#openssl ca–gencrl  -out  thisca.crl

wKioL1ndukWQA_PfAAAWzkcluCM673.png-wh_50

查看crl文件:

    #openssl crl –in  /path/from/crl_file.crl  -noout –text

    wKiom1neKV3DsK1hAAEPxkgkUaE660.png-wh_50




本文转自 claude_liu 51CTO博客,原文链接:http://blog.51cto.com/claude666/1971422,如需转载请自行联系原作者

相关文章
|
8天前
|
Linux
Linux(5)WIFI/BT调试笔记
Linux(5)WIFI/BT调试笔记
26 0
|
9天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
32 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
1月前
|
网络协议 Linux 网络安全
curl(http命令行工具):Linux下最强大的网络数据传输工具
curl(http命令行工具):Linux下最强大的网络数据传输工具
61 0
|
1月前
|
Linux 编译器 vr&ar
linux交叉编译一些常用依赖库util-linux,zlib,sqlite3,eudev ,openssl,libpng,glibc
linux交叉编译一些常用依赖库util-linux,zlib,sqlite3,eudev ,openssl,libpng,glibc
33 1
|
1月前
|
算法 Linux
【Linux笔记】压缩、解压文件的 4 种方式。tar、gzip、gunzip、zip、unzip、7z命令使用方法
【Linux笔记】压缩、解压文件的 4 种方式。tar、gzip、gunzip、zip、unzip、7z命令使用方法
|
3天前
|
Linux 开发工具
【Linux笔记】文件查看和编辑
【Linux笔记】文件查看和编辑
|
3天前
|
Linux 数据安全/隐私保护
【Linux笔记】用户和权限管理基本命令介绍
【Linux笔记】用户和权限管理基本命令介绍
|
8天前
|
Linux Android开发
Linux(6)CH9434 SPI调试笔记
Linux(6)CH9434 SPI调试笔记
14 0
|
8天前
|
Linux
Linux(4)USB CAN调试笔记
Linux(4)USB CAN调试笔记
30 0
|
25天前
|
Linux API C语言
FFmpeg开发笔记(一)搭建Linux系统的开发环境
本文指导初学者如何在Linux上搭建FFmpeg开发环境。首先,由于FFmpeg依赖第三方库,可以免去编译源码的复杂过程,直接安装预编译的FFmpeg动态库。推荐网站<https://github.com/BtbN/FFmpeg-Builds/releases>提供适用于不同系统的FFmpeg包。但在安装前,需确保系统有不低于2.22版本的glibc库。详细步骤包括下载glibc-2.23源码,配置、编译和安装。接着,下载Linux版FFmpeg安装包,解压至/usr/local/ffmpeg,并设置环境变量。最后编写和编译简单的C或C++测试程序验证FFmpeg环境是否正确配置。
43 8
FFmpeg开发笔记(一)搭建Linux系统的开发环境