OpenSSL
- 1. SSH、OpenSSH、SSL、OpenSSL关系及区别
- 2. SSH介绍
- 2.1 概念
- 2.2 SSH的主要功能
- 2.3 示例讲解
- 2.4 ssh和sshd的区别
- 3. OpenSSH介绍
- 3.1 概念
- 3.2 OpenSSH程序简介
- 3.3 OpenSSH 包含的组件
- 1. ssh
- 2. scp
- 3. sftp
- 4. sshd
- 5. ssh-keygen
- 6. ssh-copy-id
- 7. ssh-agent
- 8. ssh-add
- 9. ssh-keyscan
- 4. SSL介绍
- 4.1 SSL使用
- 4.2 密钥算法和协议
- 1. 对称加密
- 2. 公钥加密
- 3. 单向加密
- 4. 密钥交换
- 4.3 TLS
- 4.4 SSL handshake
- 5. OpenSSL介绍
- 5.1 标准命令
- 1. 对称加密
- 2. 单向加密:
- 3. 生成用户密码的命令:
- 4. 生成随即数,salt
- 5. 公钥加密
- 6. 生成密钥对
- 6. PKI和CA
- 6.1 PKI
- 1. PKI 组成
- 2. X.509v3
- 6.2 CA
- 1. CA使用模型
- 2. 建立私有CA
- 3. 吊销证书
1. SSH、OpenSSH、SSL、OpenSSL关系及区别
-
SSH (Secure Shell) 的缩写,意为“安全外壳协议”,是一种在不安全网络上用于安全远程登录和其他安全网络服务的协议
-
OpenSSH是 SSH协议 的免费开源实现
-
SSL(Secure Sockets Layer)是为网络通信提供安全及数据完整性的一种安全协议,在传输层对网络连接进行加密,
-
OpenSSL是 SSL协议的免费开源实现,
OpenSSH的加密是通过OpenSSL完成的.
2. SSH介绍
2.1 概念
SSH,安全外壳协议(Secure Shell,简称SSH)是一种在不安全网络上用于安全远程登录和其他安全网络服务的协议。
SSH由IETF的网络小组(Network Working Group)所制定;SSH 为建立在应用层
基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。
以下提到的功能及示例,其实是OpenSSH中的组件ssh,而并非SSH协议。但是也不必区分的那么细致。
2.2 SSH的主要功能
- 使用用户名/密码登录;
- 使用密钥对登陆;
- 端口转发:
NAME
ssh — OpenSSH SSH client (remote login program)
SYNOPSIS
ssh args [user@]hostname [command]
DESCRIPTION
ssh (SSH client) is a program for logging into a remote machine and for executing commands on a remote machine. It is intended to provide secure encrypted communications between two untrusted hosts over an insecure network. X11 connections, arbitrary TCP ports and UNIX-domain sockets can also be forwarded over the secure channel.
ssh connects and logs into the specified hostname (with optional user name). The user must prove his/her identity to the remote machine using one of several methods (see below).
ssh安装
apt install ssh -y
2.3 示例讲解
- 无参数,使用用户名/密码登录
<常用>
[root@node1 sbin]# ssh root@192.168.2.150
The authenticity of host '192.168.2.150 (192.168.2.150)' can't be established.
ECDSA key fingerprint is SHA256:FE/dZMWs5CwuIEhGa/CCGlqaDDygxzXmUptHCnHjZAo.
ECDSA key fingerprint is MD5:93:7f:b1:ac:fd:20:32:23:9d:9c:04:87:02:30:c7:49.
Are you sure you want to continue connecting (yes/no)?
第一次连接目标主机时,ssh 会让你确认目标主机的真实性。如果你回答的是 NO,SSH 将不会继续连接,只有回答 Yes才会继续。下一次再登陆此主机时,SSH 就不会提示确认消息了
- 指定端口
ssh默认端口为22号,如果指定其他端口进行ssh链接,则需要使用-p
参数
[root@node1 sbin]# ssh root@192.168.70.183 -p 20
ssh: connect to host 192.168.70.183 port 20: Connection refused
此时服务器的ssh端口需要更改:
[root@node1 sbin]# grep Port /etc/ssh/sshd_config
Port 22
#GatewayPorts no
-i <file>
指定私钥文件路径,实现基于key验证,默认使用文件:
~/.ssh/id_dsa,
~/.ssh/id_ecdsa, /.ssh/id_ed25519,/.ssh/id_rsa等
-f
要求 在执行命令前退至后台. 它用于当 准备询问口令或密语, 但是用户希望它在后台进行. 该选项隐含了 -n 选项. 在远端机器上启动 X11 程序的推荐手法就是类似于 ssh -f host xterm 的命令.
[root@node1 sbin]# ssh root@192.168.71.253 -f
Cannot fork into background without a command to execute.
2.4 ssh和sshd的区别
- ssh是ssh的客户端,在远程系统时进行可验证的加密安全访问。
- sshd是服务端
3. OpenSSH介绍
3.1 概念
OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。SSH协议族可以用来进行远程控制, 或在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都是极为不安全的,并且会使用明文传送密码。OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程中的数据,并由此来代替原来的类似服务。
3.2 OpenSSH程序简介
- OpenSSH的分为客户端和服务端两部分
Clients端的配置文件:/etc/ssh/ssh_config
Server端的配置文件:/etc/ssh/sshd_config
Server端服务脚本:/etc/rc.d/init.d/sshd
OpenSSH在部分Linux系统中默认是安装并启动的
[root@node1 sbin]# rpm -ql openssh
/etc/ssh
/etc/ssh/moduli
/usr/bin/ssh-keygen
/usr/libexec/openssh
/usr/libexec/openssh/ctr-cavstest
/usr/libexec/openssh/ssh-keysign
...
[root@node1 sbin]# yum search openssh
...
openssh.x86_64 : An open source implementation of SSH protocol versions 1 and 2
...
Name and summary matches only, use "search all" for everything.
3.3 OpenSSH 包含的组件
1. ssh
OpenSSH 远程登录客户端,作为 rlogin 和 Telnet 的替代方案。
参考 《2.2 SSH的主要功能》
2. scp
OpenSSH 安全文件复制,作为 rcp 的替代方案,将文件复制到其他电脑上。
语法:
scp [OPTIONS] SRC...DEST
常用选项:
-r: 递归复制,复制目录及内部文件时使用;
-p: 保存源文件元数据信息中的属主、属组及权限;
-q: 静默模式
-P PORT: 指明远程服务器使用的端口;
两种模式:
- 复制本地文件至远程主机 (但远程目录一定要有写权限)
PUSH: scp [OPTIONS] /PATH/FROM/SOMEFILE ... user@server:/PATH/TO/DEST
- 远程目标主机文件至本地
PULL: SCP [OPTIONS] user@server:/PATH/FROM/SOMEFILE /PATH/TO/DEST
示例:
复制当前主机上的/etc/ssh/sshd_config至172.16.66.90主机的/tmp/aa目录下
[root@1inux ~]# scp -p /etc/ssh/sshd_config henan@172.16.66.90:/root
henan@172.16.66.90's password:
sshd_config 100% 3879 3.8KB/s
3. sftp
OpenSSH 安全文件传输,类似于 scp。
参考《CHAPTER 5 文件共享 - FTP/FTPS/SFTP》
语法:
sftp [USER]@server
常用命令:
put/get
4. sshd
OpenSSH 守护进程。
5. ssh-keygen
OpenSSH 身份验证密钥实用程序,产生RSA或ECDSA密钥,用来认证用。
语法:
ssh-keygen [OPTIONS]
ssh-keygen — authentication key generation, management and conversion
参数 :
-t {rsa|dsa} :密钥类型 一般使用rsa
-b bits:指明密钥长度
-f output_keyfile:指明密钥文件
-P ’ ':指明加密密钥的密码,表示使用空密码
示例:
[root@1inux ~]# ssh-keygen -t rsa //生成密钥对
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_90 //定义保存的密钥文件名
Enter passphrase (empty for no passphrase): //要求对生成的密钥对加密,也可以不加密 输入两次回车就OK
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_90. //说明已经生成密钥
Your public key has been saved in /root/.ssh/id_90.pub. //说明已经生成公钥
The key fingerprint is:
7a:17:b3:e7:6f:54:a1:30:23:62:7c:04:37:10:52:08 root@1inux
The key's randomart image is:
+--[ RSA 2048]----+
| E..+==+ |
| ..+.o.+ . |
| . o . + . .|
| . .|
| S o . |
| . + . |
| . . o .. |
| . . o . |
| .o. |
+-----------------+
[root@1inux ~]#
[root@1inux ~]# ls .ssh/
id_90 id_90.pub known_hosts
也可以指明秘钥路径及密码
[root@1inux .ssh]# ssh-keygen -t rsa -f /root/.ssh/id_rsa -P '' //经测试 名字必须为id_rsa
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
33:c3:f8:f3:2c:ed:88:cc:db:7a:97:5f:d0:de:ce:d9 root@1inux
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
| o . |
| . S . . |
| . + o . |
| o. . o .|
| o oo=+ . oo|
| *+o++.. .E|
+-----------------+
[root@1inux ~]# ls .ssh/
id_rsa id_rsa.pub id_www id_www.pub known_hosts
6. ssh-copy-id
ssh-copy-id命令可以把本地的ssh公钥文件安装到远程主机对应的账户下。
语法:
ssh-copy-id [-i [identity_file]] [user@]machine
ssh-copy-id — use locally available keys to authorise logins on a remote machine
参数:
-i:指定公钥文件
示例:
[root@1inux ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub henan@172.16.66.81
henan@172.16.66.81's password:
Now try logging into the machine, with "ssh 'henan@172.16.66.81'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
7. ssh-agent
OpenSSH 身份验证代理,用于帮助用户不需要每次都要输入密钥密码的工具。
原理:
用户 Bob 使用 ssh-agent 来管理私钥之后。ssh-agent 会启动一个进程在内存里保存这些私钥。之后每次登录时,ssh 客户端都会跟 ssh-agent 请求是否有目标主机的私钥;如果有,ssh 客户端便能直接登录目标主机。
8. ssh-add
向 OpenSSH 身份验证代理添加私钥身份,用于帮助用户不需要每次都要输入密钥密码的工具。
ssh-add — adds private key identities to the authentication agent
ssh-add [file ...]
参数:
-l Lists fingerprints of all identities currently represented by the agent.
示例:
[root@node1 sbin]# eval `ssh-agent`
Agent pid 45527
[root@node1 sbin]# ssh-add /root/.ssh/id_rsa
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
[root@node1 sbin]# ssh-add -l
2048 SHA256:LGCOrSrdps8bt/wNDpk/IXyQ0XEPkHcpn2Txv0f62YM /root/.ssh/id_rsa (RSA)
9. ssh-keyscan
从服务器收集 SSH 公钥,并记录公钥。
ssh-keyscan 是一个收集多个主机的 SSH 公共密钥的实用工具。它被设计用来帮助构建和验证 ssh_known_hosts 文件,其格式在 sshd(8) 中有说明。ssh- keycan 提供了一个适合 Shell 和 Perl 脚本使用的最小接口。
ssh-keycan 使用非阻塞的套接字 I/O 以并行方式联系尽可能多的主机,因此非常高效。可以在几十秒内收集来自 1,000 台主机的公钥,即使其中一些主机关闭或没有运行 sshd(8)。对于扫描,不需要登录被扫描的机器,扫描过程也不涉及任何加密。
示例:
- 显示指定主机的 SSH 公钥
[root@node1 sbin]# ssh-keyscan 192.168.71.253
# 192.168.71.253:22 SSH-2.0-OpenSSH_7.4
192.168.71.253 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBA6yc0kAIp0UxO03m3qK7TCUSe4Qoua3TIiGPWRc9ncwtWymLGGwOYMf50nkNbdOJ/JwCkSPN+7DqiEXt3BXhvQ=
# 192.168.71.253:22 SSH-2.0-OpenSSH_7.4
192.168.71.253 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCjZ7IT+xxubcUdsDY8eQHNqekoJZuRCkRMrQGVlcVwRJEJEUYOa990musVvhq45KYMt2wGUqyaFqf36FmET/RlusVT2RYpOvzQyVAQM0zG5VaiY169IK7k5iq/KBnFNDHc5OTOJZKcS3YUwmR84uCV6XSxsIeIO+W9M2xbc1Aqzm98on7ara+nuHZS4nCpiO86ZOzbpZj0oE4CeoOqHlNuBYnlIz6L379kit/wvdeQxuXycWi4BQY2Fp3Q/NbrytNji8GdP/YgO5NDyEETneOhEsRWKIK/B5iV7WVxM3UbuqCztueKvG9vm+OAAdTNX4D9QR5gHnwXwnn+Nxr0EiVf
# 192.168.71.253:22 SSH-2.0-OpenSSH_7.4
192.168.71.253 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBhDkKQBAaQwdoN/FQameEBGKTU9r6xMDk1gWJxIiqcD
- 显示指定主机的 RSA 公钥。
ssh-keyscan -t rsa 127.0.0.1
# 127.0.0.1:22 SSH-2.0-OpenSSH_7.4
127.0.0.1 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDkGXOrc1t17nD5zYHNcA83zsa9uvv8s1bGcHQoUgCotwJexLu0zTUgNzDJRuMHzIIzuwIIy2H24sgIOvo81bJHIcJOXxr6pJ8Jc/lriZmitqpOBfHRheUif8V6uqfQKYEQRRpEow5rDK0qYi7CSVuZFBgdLGQT+XyK72AK+hzvQyEmtd5NmeeIX0SmQ5WfwhzcCa0byu+hop81HjTXleSdwErox04BFTVX/UcH4LQb16Q4W+5kI46Vn1p6uuzrEt/+C92DUgYtmDW5hv9BuuYQuSdUoI+vpW+y+Bf5e4bqfuEh34P6qEgkIm+LUxybPS65MMHTRWpT+j/zIdGHIuqh
- 收集主机 SSH 公钥,并输出调试信息。
ssh-keyscan -v 127.0.0.1
在类 Unix 系统中的远程登录就采用了 SSH 协议,只有安装了相应软件包才能实现远程登录(包括命令行登录和桌面登录)。
4. SSL介绍
SSL(Secure Socket Layer)安全套接层是Netscape(网景)公司率先采用的网络安全协议。它是在传输通信协议
(TCP/IP)上实现的一种安全协议,采用公开密钥技术。SSL广泛支持各种类型的网络,同时提供三种基本的安全服务,它们都使用公开密钥技术。
4.1 SSL使用
SSL用以保障在Internet上数据传输之安全,利用数据加密技术,可确保数据在网络上之传输过程中不会被截取及窃听。
SSL主要是服务于HTTPS的,而HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版。HTTPS相当于在HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
其中SSL的安全(Secure),指:
-
安全的通信目标:
- 保密性:confidentiallity
- 完整性:integrity
- 可用性:availabilty
-
攻击类型:
威胁保密性攻击:窃听,通信量分析
威胁完整性攻击:更改,伪装,重放,否认
威胁可用性攻击:拒绝服务(DoS) -
针对攻击的解决方案
1. 技术:加密解密
2. 服务:用于抵御攻击的服务,安全服务加密和解密:
传统加密方法:替代加密方法,置换加密方法
现代加密方法:现代块加密方法服务:
认证机制
访问控制机制
4.2 密钥算法和协议
密钥算法和协议
- 对称加密
- 公钥加密
- 单向加密
- 密钥交换
1. 对称加密
加密和解密使用同一个密钥(解决保密性问题)
- DES:data encryption standard,数据加密标准。 百科
- 3DES:Triple DES,三轮DES加密
- AES:Advanced Encryption Standard,高级加密标准。(密钥长度128bit,192bit,256bit)
特性:
1.加密解密使用同一个密钥
2.将原始数据分割为固定大小的块,逐个进行加密
缺陷:
1.密钥过多
2.密钥分发困难
2. 公钥加密
又称非对称加密。包括身份认证,密钥交换,数据加密(比对称加密慢3个数量级,10的3次幂)等功能
百科
非对称是指一对加密密钥与解密密钥,这两个密钥是数学相关,用某用户密钥加密后所得的信息,只能用该用户的解密密钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个的秘密性质。一般称公开的密钥为公钥;不公开的密钥为私钥。
密钥成对出现,密钥分为:公钥,私钥
- 公钥:可以公开给所有人,pubkey,公钥从私钥中提取产生
- 私钥:通过工具创建,使用者自己留存,必须保证其私密性,secret key,skey
特点:
用公钥加密的数据,只能使用与之配对的私钥解密,反之亦然
用途:
- 数字签名:主要用于接收方确认发送方身份,发送方使用私钥对需要传输的文本的摘要进行加密,得到的密文即被称为该次传输过程的签名(身份认证:发送方使用自己的私钥对特征码进行加密,接收方使用发送方的公钥进行解密)
- 密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方
- 数据加密:通常不用于数据加密,效率低
点对点模型示例
client A, sever B
加密过程:
- B将data1通过<单向加密>算法,提取特征码(如MD5,保证完整性),通过自己私钥对
特征码
进行加密(数字签名
,用以完成身份认证),生成数字签名,附加在数据后,称为data2,保证发送方身份和数据完整性 - B生成一次性<对称加密>密码,将data2通过对称加密对
整段数据
进行加密(对称加密,保密性),称为data3 - B将data3通过A的公钥对
一次性对称加密密码
进行加密(密钥交换
),附加在数据后,成为data4(保证其保密性),发送给A
解密过程:
- A获取data4,先用自己的私钥对对称加密密码进行解密,获得data3+对称密码
- A用对称密码对data3解密,获得data2和加密的MD5
- A用B公钥对特征码进行解密(身份认证),用MD5验证data1完整性
缺点:
容易受到中间人攻击,进而需要CA
CA:保证通信双方能够拿到正确公钥的公信机构
算法:RSA,DSA,ELGamal
- DSA:digital signature algorithm,数字签名算法,是一种标准的 DSS(数字签名标准)。仅能用于签名,而不能用于加解密。
- RSA:公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。即能签名也能用于加解密。百科
3. 单向加密
只能加密,不能解密,只能提取数据特征码md5等(保证数据完整性)
特点:
定长输出
雪崩效应(加密数据的微小改变,导致密码巨大变化)
功能:
用于验证数据完整性
算法:
- MD5:Message-Digest Algorithm 5,128bit信息摘要算法
- sha1:Secure Hash Algorithm 1,160bit,安全散列算法
sha224,sha256,sha384,,sha512
centos6、7用户密码加密:sha512
cenots5用户密码加密:md5
[root@node1 sbin]# authconfig --test|grep hashing
password hashing algorithm is sha512
4. 密钥交换
-
IKE:Internet key exchange互联网密钥交换协议。百科
-
RSA:(公钥加密)
-
DH:deffie-hellman(迪菲-赫尔曼)
优势在于让双方不用发密码就可以得到密码 模型: A:p,g B:p,g A:x p^x%g==>B A:(p^y%g)^x B:y p^y%g==>A B:(p^x%g)^y (p^y%g)^x = (p^x%g)^y (p^x%g)^y为密码
-
ECDH:椭圆曲线DH
-
ECDH:临时椭圆曲线DH
4.3 TLS
安全传输层协议(TLS,transport layer security)用于在两个通信应用程序之间提供保密性和数据完整性
IETF将SSL进行标准化,1999年公布第一版TLS标准文件。百科
TLS分层设计:
- 最底层:基础算法原语实现aes,rsa,md5
2. 向上一层:各种算法实现
3. 向上一层:组合算法实现的半成品
4. 用各种组件拼装而成的各种成品密码密码学协议软件
TLS包含三个基本阶段:
- 对等协商支援的密钥算法
- 基于非对称密钥的信息传输加密和身份认证、基于PKI证书的身份认证
- 基于对称密钥的数据传输保密
4.4 SSL handshake
SSL通信流程,简化后主要有三步:
- 客户端向服务器端索要并验证对方证书
- 双方协商生成会话密钥
前两步合称握手阶段,handshake
- 双方采用会话密钥进行加密通信
- 断开
--------ssl handshake 详细流程------------
- 第一阶段:客户端通过浏览器向服务器发出加密通信请求:
Client hello
发送内容,包括:
- 向服务器发送自己支持的协议版本,比如TLS1.2
- 客户端生成的随机数,稍后用于生成会话密钥
- 支持的加密算法,比如AES,3DES,RSA
- 支持的压缩算法
- 第二阶段:服务器端回应客户端
Server hello
发送内容,包括:
- 确认使用的通信加密协议版本,比如TLS1.2
- 服务器端生成一个随即数,稍后用于生成会话密钥
- 确认使用的加密算法
- 发送服务器证书;
- 索要客户端证书(如果需要)
- 第三阶段:客户端收到服务器端的回应
- 验证服务器证书(发证机构,证书签名,证书完整性,证书持有者,证书有效期,吊销列表等等),确认无误后,取出服务器公钥
- 发送以下信息给服务器端:
- a) 一个随机数(第三个随即数),用服务器公钥对这个随机数加密
- b) 编码变更通知(随后信息,用双方商定的加密算法进行发送)
- c) 客户端握手结束通知
- 第四阶段:服务器回应
- 收到客户端发来的第三个随机数
pre-master-key
,计算生成本次会话所用的“会话密钥” - 向客户端发送如下信息:
- a) 编码变更通知,表示随后的信息都将用双方商定的加密算法和密钥发送
- b) 服务器握手结束通知
---------ssl handshake-----------------
5. OpenSSL介绍
OpenSSL的配置文件/etc/pki/tls/openssl.cnf
[root@node1 ~]# grep -v ^#,^$ /etc/pki/tls/openssl.cnf|tail -10
other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional)
digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory)
accuracy = secs:1, millisecs:500, microsecs:100 # (optional)
clock_precision_digits = 0 # number of digits after dot. (optional)
ordering = yes # Is ordering defined for timestamps?
# (optional, default: no)
tsa_name = yes # Must the TSA name be included in the reply?
# (optional, default: no)
ess_cert_id_chain = no # Must the ESS cert id chain be included?
# (optional, default: no)
OpenSSL由三部分组成:
- libencrpt库:加密解密库
- libssl库,实现SSL功能,用于通信加密的库
- openssl:多用途命令行工具
OpenSSL命令分类:
- standard commands:标准命令
- message digest:消息摘要命令
- cipher commands:加密命令
5.1 标准命令
标准命令:enc、ca、req、genrsa
1. 对称加密
使用openssl完成对称加密
工具:openssl enc
算法:3des,aes,blowfish
enc命令语法:
enc - symmetric cipher routines
openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P][-bufsize number] [-nopad] [-debug] [-none] [-engine id]
参数 :
-e 加密
-d 解密
-a(-base64)文本加密
实例:
- 加密:
openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
- 解密:
openssl enc -d -des3 -a -salt -in fstab.ciphertext -out fstab
2. 单向加密:
工具:openssl dgst,md5sum,sha1sum,sha224sum
openssl dgst:
提取摘要
openssl dgst -md5 fstab
openssl dgst -md5 -out fstab.md5 fstab
3. 生成用户密码的命令:
工具:passwd, openssl passwd
命令:
openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}
openssl passwd -1 -salt 123456
参数:
-1
(一)标示MD5加密,-salt不变,密文不变
4. 生成随即数,salt
工具:openssl rand
命令:
openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num
参数说明:
-out :指定随机数输出文件,否则输出到标准输出。
-rand file :指定随机数种子文件。种子文件中的字符越随机,openssl rand生成随机数的速度越快,随机度越高。
-base64 :指定生成的随机数的编码格式为base64。
-hex :指定生成的随机数的编码格式为hex。
num :指定随机数的长度。
openssl rand -base64 10
L4JQf3hy3RdPtQ==
使用时需要删除==
openssl rand -hex 10
f858abb49c1b72e5188d
生成加随机盐的密码
openssl passwd -1 -salt $(openssl rand -hex 4)
$1$7d20e521$fp7jFdPa8IRTqjx1FbKHL/
上面的命令将生成一个随机的、长度为 4 个字符的高强度密码,这种方式不支持同时生成多个密码。我们强烈推荐你生成 14 个字符的密码。 当然你可以使用 OpenSSL 生成任意长度的密码。可能有的童鞋会问不是说4位长度吗?怎么显示的不是4位,问的好,为什么呢?因为你生成的位数不足以达到高强度密码要求,所以默认情况下openssl会给你添加字符,使其保证密码高强度!
linux系统上的随机数生成器:
- a) /dev/random:仅从熵池中返回随机数,随机数用尽,阻塞
- b) /dev/urandom:从熵池中返回随机数,随即数用尽,会利用软件生成伪随机数,非阻塞
伪随机数并不安全
熵池:内核在内存中维护的一个空间,空间内存储大量随机数
熵池中的随机数来源:
- 硬盘IO中断时间间隔
- 键盘IO中断时间间隔
如果随机数用尽,可以拷贝大数据到硬盘,产生大量IO
5. 公钥加密
三种功能:
- 加密解密:
算法:rsa,elgamal
工具:openssl rsautl,gpg - 数字签名
算法:rsa,dsa,elgamal
工具:openssl rsautl,gpg - 密钥交换
算法:dh
6. 生成密钥对
- 生成私钥
openssl genrsa [-out filename] [-passout arg] [-aes128] [-aes192] [-aes256] [-camellia128] [-camellia192]
[-camellia256] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]
示例:
openssl genrsa -out ./mykey3.private 1024
openssl genrsa 1024 > mykey.private
openssl genrsa 1024
修改为仅自己能读能写
(umask 077; openssl genrsa -out mykey4.private 1024)
使用()
表示启用子shell启动进程,主进程不受影响
- 提取公钥
openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg]
[-sgckey] [-aes128] [-aes192] [-aes256] [-camellia128] [-camellia192] [-camellia256] [-des] [-des3] [-idea] [-text]
[-noout] [-modulus] [-check] [-pubin] [-pubout] [-RSAPublicKey_in] [-RSAPublicKey_out] [-engine id]
示例:
openssl rsa -in mykey.private -pubout -out mykey.pub
6. PKI和CA
6.1 PKI
PKI(公钥基础设施,Public Key Infrastructure,简称PKI
)是一种遵循既定标准的密钥管理平台,它能够为所有网络应用提供加密和数字签名等密码服务及所必需的密钥和证书管理体系。是目前网络安全建设的基础与核心,是电子商务安全实施的基本保障,因此,对PKI技术的研究和开发成为目前信息安全领域的热点。互联网通信强依赖PKI。
1. PKI 组成
PKI和CA 介绍
签证机构:CA(Certification Authority)
注册机构:RA(Registration Authority )
证书吊销列表:CRL
证书存取库
2. X.509v3
X.509v3定义了证书的结构以及认证协议标准
- 版本号:用来区分X.509的不同版本号
- 序列号:由CA给予每一个证书的分配唯一的数字型编号,当证书被取消时,实际上是将此证书的序列号放入由CA签发的CRL中;这也是序列号唯一的原因。
- 签名算法ID:用来指定用CA签发证书时所使用的签名算法。算法标识符用来指定CA签发证书时所使用的公开密钥算法和HASH算法,须向国际指明标准组织(如ISO)注册。
- 发行者名称(认证机构):即发出该证书的机构唯一的CA的x.500名字;
- 有效期限:证书有效的时间包括两个日期:证书开始生效期和证书失效的日期和时间。在所指定的这两个时间之间有效;
- 主体名称:证书持有人的姓名、服务处所等信息;
- 主体公钥:包括被证明有效的公钥值和加上使用这个公钥的方法名称;
- 发行者唯一标示
- 主体的唯一标识
- 扩展
- 发行者签名:以确保这个证书在发放之后没有被撰改过
6.2 CA
CA(Certificate Authority,证书授权)是由认证机构服务者签发,是数字签名的技术基础保障,也是网上实体身份的证明,能够证明某一实体的身份及其公钥的合法性,证明该实体与公钥二者之间的匹配关系
CA分为两类:
- 公共信任的CA
- 私有CA
1. CA使用模型
Clinet C,Server S
C获取S证书,验证证书:
- 用CA的公钥去解密CA签名,能解密说明证书来源可靠
- 用同样的加密算法去加密证书取得特征码,和解密证书特征码比较,说明完整性可靠
- 检查证书有效期限
- 验证主体名称和通信人是否一致
- 检查证书是否被吊销
2. 建立私有CA
工具:
- OpenSSL
- OpenCA(图形界面工具)
构建私有CA:在确定配置为CA的服务器上生成一个自签证书,并为CA提供所需的目录及文件即可
步骤:
一、 CA服务器
- 生成私钥,默认要求生成在/etc/pki/CA/private/
(umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
[root@node2 test]# ll /etc/pki/CA/private/
total 0
[root@node2 test]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
Generating RSA private key, 4096 bit long modulus
...................................................................................................++
..............................................................................................................................................................................................................................................................................................................................................................................................................................++
e is 65537 (0x10001)
[root@node2 test]# ll /etc/pki/CA/private/
total 4
-rw------- 1 root root 3243 Apr 6 16:36 cakey.pem
- 生成自签证书,要配置在/etc/pki/CA/cacert.pem
req - PKCS#10 certificate request and certificate generating utility
#该命令主要用于创建和处理PKCS#10格式的证书请求
[root@node2 test]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:LN
Locality Name (eg, city) [Default City]:SY
Organization Name (eg, company) [Default Company Ltd]:MX
Organizational Unit Name (eg, section) []:DBC
Common Name (eg, your name or your server's hostname) []:
Email Address []:
[root@node2 test]# ll /etc/pki/CA/
total 4
-rw-r--r-- 1 root root 1911 Apr 6 16:39 cacert.pem
drwxr-xr-x. 2 root root 6 Mar 28 2022 certs
drwxr-xr-x. 2 root root 6 Mar 28 2022 crl
drwxr-xr-x. 2 root root 6 Mar 28 2022 newcerts
drwx------. 2 root root 23 Apr 6 16:36 private
参数说明:
-new 生成新证书签署请求
-x509 生成自签格式证书,专用于创建私有CA时
-key 生成请求时用到的私有文件路径
-days 证书有效时长
-out 输出路径
- 为CA提供所需的目录及文件
[root@node2 test]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
[root@node2 test]# touch /etc/pki/CA/{serial,index.txt}
[root@node2 test]# echo 01 > /etc/pki/CA/serial
二、 请求签证的主机
某用到证书安全通信的服务器,需要向CA请求签署证书,以httpd为例
- 用到证书的主机生成私钥
[root@node1 httpd]# mkdir /etc/httpd/ssl
[root@node1 httpd]# (umask 077;openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
Generating RSA private key, 2048 bit long modulus
.......+++
.......................................................+++
e is 65537 (0x10001)
[root@node1 httpd]# cd /etc/httpd/ssl
[root@node1 ssl]# ll
total 4
-rw------- 1 root root 1679 Apr 6 22:03 httpd.key
- 生成证书签署请求,证书填的信息需要和CA一致,并且额外需要填server’ hostname
[root@node1 ssl]# openssl req -new -key httpd.key -out httpd.csr -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:CN
LN []:LN
Locality Name (eg, city) [SY]:SY
Organization Name (eg, company) [Default Company Ltd]:MX
Organizational Unit Name (eg, section) []:DBC
Common Name (eg, your name or your server's hostname) []:node1
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@node1 ssl]# ll
total 8
-rw-r--r-- 1 root root 956 Apr 6 22:05 httpd.csr
-rw------- 1 root root 1679 Apr 6 22:03 httpd.key
- 将请求通过可靠方式发送给CA
把httpd.csr拷贝给CA服务器
[root@node1 ssl]# scp httpd.csr node2:/home/test/
httpd.csr 100% 956 966.3KB/s 00:00
三、 CA服务器签证
- 在CA主机签署证书
[root@node2 test]# openssl ca -in /home/test/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Apr 6 08:59:02 2023 GMT
Not After : Apr 5 08:59:02 2024 GMT
Subject:
countryName = CN
stateOrProvinceName = LN
organizationName = MX
organizationalUnitName = DBC
commonName = node1
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
F3:A4:C5:F9:E4:08:17:38:F6:8C:22:9E:2E:96:75:B0:6D:BE:78:F5
X509v3 Authority Key Identifier:
keyid:51:CA:35:0D:A8:4C:02:F9:DE:7D:91:E0:5B:69:DC:19:BF:5A:30:E3
Certificate is to be certified until Apr 5 08:59:02 2024 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[root@node2 test]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
serial=01
subject= /C=CN/ST=LN/O=MX/OU=DBC/CN=node1
- CA给客户提供认证
[root@node1 ssl]# scp node2:/etc/pki/CA/certs/httpd.crt .
httpd.crt 100% 5589 2.8MB/s 00:00
[root@node1 ssl]# ll
total 16
-rw-r--r-- 1 root root 5589 Apr 6 22:23 httpd.crt
-rw-r--r-- 1 root root 976 Apr 6 22:12 httpd.csr
-rw------- 1 root root 1679 Apr 6 22:03 httpd.key
- 验证
[root@node1 httpd]# cat /etc/httpd/conf.d/ssl.conf
sslcertificateFile /etc/pki/CA/certs/httpd.crt
sslcertificateKeyFile /etc/pki/CA/private/cakey.pem
分别使用http和https 来测试,当使用https来测试的时候系统会提示授权个你证书…
3. 吊销证书
步骤:
- 客户端获取要证书吊销的serial
[root@node1 certs]# pwd
/etc/pki/CA/certs
[root@node1 certs]# openssl x509 -in httpd.crt -noout -serial -subject
serial=01
subject= /C=CN/ST=Liaoning/O=tianlang/OU=Ops/CN=k8s-node-02
- CA主机吊销证书
先根据客户提交的serial和subject信息,对比其与本机index.txt中信息是否一致
[root@node2 CA]# cat index.txt
V 240405085902Z 01 unknown /C=CN/ST=LN/O=MX/OU=DBC/CN=node1
[root@node2 CA]# ll newcerts/
total 8
-rw-r--r-- 1 root root 5589 Apr 6 16:59 01.pem
[root@node2 CA]# openssl ca -revoke /etc/pki/CA/newcerts/01.pem
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 01.
Data Base Updated
其中01
.pem要换成证书真正的序列号
- 生成吊销证书的吊销编号(第一次吊销证书执行)
[root@node2 CA]# echo 01>/etc/pki/CA/crlnumber
- 更新证书吊销列表
[root@node2 CA]# echo '01'>/etc/pki/CA/crlnumber
[root@node2 CA]# cat /etc/pki/CA/crlnumber
01
[root@node2 CA]# openssl ca -gencrl -out thisca.crl
Using configuration from /etc/pki/tls/openssl.cnf
- 查看crl文件
[root@node2 CA]# openssl crl -in thisca.crl -noout -text
Certificate Revocation List (CRL):
Version 2 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: /C=CN/ST=LN/L=SY/O=MX/OU=DBC
Last Update: Apr 6 09:31:37 2023 GMT
Next Update: May 6 09:31:37 2023 GMT
CRL extensions:
X509v3 CRL Number:
1
Revoked Certificates:
Serial Number: 01
Revocation Date: Apr 6 09:28:14 2023 GMT
Signature Algorithm: sha256WithRSAEncryption
ca:1e:a0:41:79:dd:3a:5b:4d:7e:75:54:f8:e9:ca:d1:cc:0b:
e5:e7:9e:b4:97:08:b2:76:77:08:6a:f6:b1:ee:76:1a:7a:76:
90:a8:dd:d6:c0:48:c8:e7:71:2e:02:98:db:ab:57:22:ee:87:
64:b5:8c:b5:8e:ce:8d:9e:42:a4:1a:13:0f:7a:35:b3:7b:6f:
05:b4:db:e3:e2:38:cc:ec:8b:26:29:e3:ea:c2:fe:a7:03:98:
c2:02:e5:d8:cd:9a:53:74:25:45:4a:35:69:b7:1a:4e:01:6a:
03:a1:11:55:b5:c7:07:04:63:be:66:c7:a9:ce:29:68:a8:42:
12:da:cf:79:d9:d7:41:be:99:ab:f1:59:8d:4e:51:d2:28:99:
76:54:22:9e:78:b3:eb:5f:ed:f4:43:d6:6c:07:fe:77:f5:85:
cc:91:e6:98:dc:8c:3d:28:67:cb:bc:2e:fe:1a:0e:7a:fb:70:
00:c6:ec:79:24:81:45:0b:ec:d0:0e:16:d7:d8:68:e3:1a:6e:
b6:1c:78:f2:03:b7:d3:94:d2:d9:23:03:e4:8b:ec:ee:29:db:
a5:fe:2e:7e:94:02:d1:36:7d:63:5f:29:e0:56:8b:71:1f:b9:
d8:f5:5b:9c:77:d9:16:90:55:ee:8b:e2:0f:6a:87:76:c1:db:
97:24:62:f4:10:c2:69:5b:97:c3:b3:ea:1e:11:d8:81:d8:79:
8f:e0:fa:6f:9d:84:36:f5:65:cd:30:ef:b2:b4:0c:5b:73:3f:
e5:24:84:d5:f1:88:65:f6:c0:fe:75:23:b9:31:a0:23:e1:37:
74:d6:52:57:60:d0:4a:82:8e:f3:0b:5e:c3:72:55:6d:6e:b6:
ca:5a:ac:db:81:4b:7d:4d:8f:f0:16:40:4c:60:a4:3c:bc:61:
dd:d7:40:c5:25:08:33:8a:52:83:22:88:d0:13:38:46:2f:0b:
84:e6:93:41:bb:40:40:ca:94:ff:78:b8:70:a0:23:84:6d:5a:
69:b3:16:89:5f:5b:de:56:80:3a:57:f2:6c:89:ea:91:da:71:
19:87:aa:43:16:77:5f:0a:05:11:d0:ce:0c:2d:df:2a:78:ef:
19:3c:d4:ed:bf:12:df:6a:c4:e0:c8:0f:e8:58:8e:5d:f3:9e:
cd:a5:66:4d:95:72:f5:f2:29:ea:cc:ea:bc:a1:41:3a:37:43:
47:5d:cf:d5:d2:e1:c2:ac:16:0d:7e:0d:8a:86:cd:d1:98:38:
79:70:bb:a2:56:3c:b3:f9:58:69:48:7c:5f:e7:9f:bb:4f:53:
75:7c:f1:26:0a:f0:07:6e:3a:f2:16:47:14:a1:76:2c:f8:21:
f0:34:f0:eb:2f:5c:3d:d6