1. 摘要
摘要算法是通过对原始数据使用非线性函数(无法通过输出推断输入)进行多轮运算,最终输出指定长的字符串的算法。常用的摘要算法有 MD类(md4,md5等)和 SHA 类(sha256,sha512等)。
1.1. md5摘要算法原理
- 计算原始数据长度。如果长度不满足 512n + 448,则通过补充位数(首位为1,其余为0),使其满足为止,剩余64位用于填写原始数据长度
- 设定初始值。md5算法有四个初始值,即为ABCD。每个初始值为32个bit位。
- 循环计算。对ABCD四个初始值进行非线性函数的循环计算(本质是各种位运算),计算次数由原文长度确定
- 拼接结果。将多次计算后的ABCD拼接成字符串返回,因此输出结果为 32*4=128bit位,md5字符串长度为32
其它摘要算法的原理类似,无非是非线性函数不同,分组数量、初始值不同。一般而言,分组越多越安全,但是CPU资源消耗越大。一般web项目开发,密码校验可以采用 原始字符串+salt | md5
,既保证了安全性又能降低资源消耗。
1.2. 摘要算法特点
- 不可逆: 只能通过穷举法暴力破解,或者采用字典库
- 输出长度固定:输出结果的长度固定,方便处理
- 速度快:相对于其它包含密钥的加解密算法,速度非常快。
唯一性:输入一定,则输出必然一定。在正确处理hash碰撞下,输出一定,能保证输入一致
1.3. 应用场景
数字证书:数字证书中就可以通过 hash 来保证元数据的唯一性
- 数据完整性校验:常用于文件服务器中
- 散列表:这种数据类型原理就是通过摘要算法进行数据的存储和查询,所以 key 不能重复
- 密码验证:通过
原始字符串+salt | md5
验证用户密码是否正确
2. Base64
Base64并不是一种加密算法,它是一种编码方式,将一段字符串转为更为可见、更方便传输的字符串。
2.1. base64原理
base64字符映射表如下,其中第63位在不同的操作系统中可能不同。
数值 | 字符 | 数值 | 字符 | 数值 | 字符 | 数值 | 字符 |
---|---|---|---|---|---|---|---|
0 | A | 16 | Q | 32 | g | 48 | w |
1 | B | 17 | R | 33 | h | 49 | x |
2 | C | 18 | S | 34 | i | 50 | y |
3 | D | 19 | T | 35 | j | 51 | z |
4 | E | 20 | U | 36 | k | 52 | 0 |
5 | F | 21 | V | 37 | l | 53 | 1 |
6 | G | 22 | W | 38 | m | 54 | 2 |
7 | H | 23 | X | 39 | n | 55 | 3 |
8 | I | 24 | Y | 40 | o | 56 | 4 |
9 | J | 25 | Z | 41 | p | 57 | 5 |
10 | K | 26 | a | 42 | q | 58 | 6 |
11 | L | 27 | b | 43 | r | 59 | 7 |
12 | M | 28 | c | 44 | s | 60 | 8 |
13 | N | 29 | d | 45 | t | 61 | 9 |
14 | O | 30 | e | 46 | u | 62 | + |
15 | P | 31 | f | 47 | v | 63 | / |
- 对字符串分组,以三个字节一组,即一组 3*8=24 bit。如果不满足3的整数倍则额外填充0字节(00000000)
- 将每一组(24bit)分为四组(4*6bit),每组最大二进制数(111111)为63
- 将分出来的每个 6bit 首位用0填充为8bit
将每个8bit二进制转为映射表中的字符,并在末尾加与补足的字节数量相等的等于号
2.2. 特点
速度快,不涉及加解密
- 处理结果没有特殊字符和乱码问题
- 输出字符串长度为输入的 4/3
2.3. 应用场景
一般应用场景是传递数据时为了避免特殊字符(看得见或看不见)引发的程序错误,将原始数据编码为base64字符串,该字符串只包含了最基本的字符,因此更利于传输和处理。
3. 对称加密
Symmetric[sɪ’mɛtrɪk] Encrypiton[ɛn’krɪpʃən],对称加密在加密与解密时使用相同密钥或者可以进行简单转换的不同密钥,这种加密方式一旦被第三方窃取密钥就容易造成数据泄漏,常见的算法有DES,3DES,IDEA,RC5,RC6,AES等。
3.1. AES原理
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中两者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128比特,密钥长度则可以是128,192或256比特(因此密钥长度为16字符、24字符或者32个字符);而Rijndael使用的密钥和区块长度均可以是128,192或256比特。加密过程中使用的密钥是由Rijndael密钥生成方案产生。
AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。
- AddRoundKey: 矩阵中的每一个字节都与该次回合密钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
- SubBytes: 透过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节
- ShiftRows: 将矩阵中的每个横列进行循环式移位
- MixColumns: 为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每内联的四个字节。最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。
3.2. 加密工作模式
在AddRoundKey阶段,又分为不同的工作模式,常见的工作模式有:ECB,CBC,OFB,CFB,CTR等等。具体可参考维基百科。一般工作中,只需要知道这个概念即可,在写代码中选择不同的加密工作模式。
3.3. 特点
4. 非对称加密
非对称加密在加密和解时使用不同的密钥,分为公钥和私钥。一般用公钥对数据进行加密,而用私钥对数据进行解密。常见的算法有RSA,ECC等。其中RSA利用的是现有计算机无法完成超大数字的质因数分解来保证安全的。
相对于非对称加密而言,对称加密算法非常消耗性能,因此在实际使用中非对称加密一般仅用于建立SSL会话,会话建立后的一段时间内不再使用非加密对称进行验证。
4.1. RSA工作原理
- 取两个超大的质数: p和q
- 求乘积n: n = p*q
- 求欧拉函数的值: φ(n) = (q-1)*(p-1)
- 取e: 1<e<φ(n),其中 e 为整数, e 与 n 互质
- 取d: d*e % φ(n) = 1
- 私钥为: (d, n)
-
4.2. 应用场景
4.1.1. 消息加密
公钥加密明文s得到密文c: c = s^e%n
- 私钥解密密文c得到明文s: s = c^d%n
在互联网上传播的内容有:密文c, 公钥e,合数n。RSA破解难度在于,无法根据合数n快速进行质因数分解得到p和q。该场景的目的在于对消息加密,避免消息泄露。
4.1.2. 签名
RSA除了加密消息之外,还能对消息进行签名。比如A要签署和B的合同,那么B必须要确认这是A操作的,而不是其他人伪造的。
- A对内容进行hash,并用私钥对hash的结果进行加密生成签名
- A将签名和合同一并发给B
B采用A的公钥对hash进行解密,得到hash值,然后B使用A的公钥对合同内容进行一次hash,将两个hash的值进行比对,如果一致则可以确认是A亲自签署的。
4.3. 特点
安全性高
- 加解密过程复杂,消耗大量CPU资源
4.4. 应用场景
对于安全性要求较高的场景,如SSH通信、SSL加密通信等
5. 证书
传输层安全性协议(Transport Layer Security,缩写:TLS)及其前身安全套接层(Secure Sockets Layer,缩写:SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。
SSL设计之初主要用于web通信过程中的密钥的非对称加密和校验,互联网工程任务组(Internet Engineering Task Force,缩写:IETF)将SSL标准化,并将其称为TLS(Transport Layer Security)。
5.1. SSL认证类型
5.1.1. 单向认证
对应的是 ca.crt,server.crt,server.key。客户端认证服务端证书,而客户端并不需要提供证书。一般服务端通过业务代码来验证客户端的合法性,比如web服务器等。
5.1.2. 双向认证
对应的是ca.crt、server.crt、server.key;ca.crt、client.crt、client.key。客户端验证服务端证书,同服务端也需要验证客户端证书的合法性,只有两个证书均合法才能进行对称密钥交换。一般在内部应用之间使用,比如k8s各个组件与apiserver之间。
5.1.3. 对等证书
对应的是 peer.crt、peer.key、ca.crt。这种证书只是一种节点之间关系的描述,用来双向验证的。在部署 etcd 集群时,节点之间采用的就是对等证书。
5.2. 证书标准
X.509 数字证书标准,定义证书文件的结构和内容,详情参考 RFC5280。SSL 数字证书通常采用这种标准,一般由用户公共密钥和用户标识符组成,此外还包括版本号、证书序列号、CA 标识符、签名算法标识、签发者名称、证书有效期等信息。一个 X.509 标准的 SSL 数字证书包含(但不限于)以下的字段:
字段 | 说明 |
---|---|
Suject Name | 证书持有者的相关信息(国家/地区、组织、单位、CN) |
Issuer Name | 证书颁发者的相关信息(国家/地区、组织、单位、CN) |
Common Name | Subject Name 和 Issuer Name 信息里都包含一个常用名称字段(Common Name, CN),对于 CA 证书而言,该字段表示 CA 机构的名称, 对于用户证书而言,通常是相应的域名。 |
Serial Number | CA 机构给该证书的唯一序列号 |
Not Valid Before | 证书生效日期 |
Not Valid After | 证书失效日期 |
Public Key | 服务端公开的密钥(RSA 公钥) |
Signature Algorithm | 签名所使用的算法(SHA-1,SHA-256 等) |
Signature | CA 机构给该证书的签名,用于验证证书是否被篡改 |
5.3. 证书编码格式
- PEM编码格式
Privacy Enhanced Mail 的缩写,以文本的方式进行存储。它的文件结构以 ——-BEGIN XXX——-,并以 ——-END XXX——- 结尾,中间 Body 内容为 Base64 编码过的数据!它也可以用来编码存储公钥(RSA PUBLIC KEY)、私钥(RSA PRIVATE KEY)、证书签名请求(CERTIFICATE REQUEST)等数据。Nginx/Apache等常用的Linux服务大多采用该格式。
- DER编码格式
Distinguished Encoding Rules 的缩写,以二进制方式进行存储,文件结构无法直接预览。一般 Java 和 Windows 服务器应用偏向于使用 DER 这种编码格式。
- 预览和转换证书内容
# OpenSSL
openssl x509 -in xxx.pem -text -noout # 查看pem编码文件
openssl x509 -in xxx.der -inform der -text -noout # 预览der编码文件
openssl x509 -in xxx.pem -outform der -out xxx.der # pem 转 der
openssl x509 -in xxx.der -inform der -outform pem -out xxx.pem # der 转 pem
5.4. 常见的证书文件后缀
.key 一般指的是私钥,通常用RSA算法比较多
.pem 采用pem编码格式的x.509证书格式
.der 采用der编码格式的x.509证书格式
.crt 证书文件,采用pem或者der编码格式的证书。一般常见于Unix系统,采用pem编码格式较多
.cer 证书文件,采用pem或者der编码格式的证书。一般常见于windows系统,采用der编码格式较多
.csr 证书前面请求文件,是向CA申请证书时使用
6. Openssl
openssl 和 cfssl 是两个常用的ssl证书签发工具,在 cfssl 用法 章节可以参考 cfssl 如何签署ca证书、客户端证书、服务端证书和对等证书。此处仅用 openssl 工具做演示。
6.1. 摘要信息
openssl 支持很多种摘要算法,md5,sha1,sha256等等。以下仅作简单演示。支持从文件读取和标准输入读取。
[root@filebeat-41 ~]# openssl dgst -md5 anaconda-ks.cfg # md5
MD5(anaconda-ks.cfg)= c76e8c6cdb13a4c1e7cf9690115c9c0e
[root@filebeat-41 ~]# openssl dgst -sha256 anaconda-ks.cfg # sha256
SHA256(anaconda-ks.cfg)= 3cd9a50d983f050c6865c6999a2cf442674cf705812fa3a9492ce90f30fd66fd
[root@filebeat-41 ~]# openssl dgst -sha512 anaconda-ks.cfg # sha512
SHA512(anaconda-ks.cfg)= 98a9592450d6da6859a7871a07ae95030b7395120c92cca5837fcd7f64d2d4558124ae8b2afeb147131f4a7edfa7af511f215d1d67983a307004610108aa0962
[root@filebeat-41 ~]# md5sum anaconda-ks.cfg
c76e8c6cdb13a4c1e7cf9690115c9c0e anaconda-ks.cfg
[root@filebeat-41 ~]# sha256sum anaconda-ks.cfg
3cd9a50d983f050c6865c6999a2cf442674cf705812fa3a9492ce90f30fd66fd anaconda-ks.cfg
[root@filebeat-41 ~]# sha512sum anaconda-ks.cfg
98a9592450d6da6859a7871a07ae95030b7395120c92cca5837fcd7f64d2d4558124ae8b2afeb147131f4a7edfa7af511f215d1d67983a307004610108aa0962 anaconda-ks.cfg
6.2. 对称加密
openssl支持常用的各种对称加密,以下仅作简单演示。支持从文件读取和标准输入读取。
# base64编码
[root@filebeat-41 ~]# echo "123456"| openssl base64 -e
MTIzNDU2Cg==
[root@filebeat-41 ~]# echo "MTIzNDU2Cg==" | openssl base64 -d
123456
[root@filebeat-41 ~]# echo "123456"|base64
MTIzNDU2Cg==
[root@filebeat-41 ~]# echo "MTIzNDU2Cg==" | base64 -d
123456
# 为了避免乱码采用 base64 编码
[root@filebeat-41 ~]# echo "123456" | openssl aes-128-ecb -e -k "123456"|openssl base64 -e
U2FsdGVkX19faHmrgfZbKA/qh9SucbFrcjdG8cOcXOk=
[root@filebeat-41 ~]# echo "U2FsdGVkX19faHmrgfZbKA/qh9SucbFrcjdG8cOcXOk="|openssl base64 -d|openssl aes-128-ecb -d -k "123456"
123456
6.3. 非对称加密
openssl 支持DH算法、RSA算法、DSA算法和EC。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名。DSA算法则一般只用于数字签名。
openssl 生成公钥和私钥
[root@filebeat-41 keys]# (umask 0377;openssl genrsa -out private.key 2048)
[root@filebeat-41 keys]# openssl rsa -in private.key -pubout -out public.key
[root@filebeat-41 keys]# ll
total 8
-r-------- 1 root root 1679 Sep 26 23:40 private.key
-rw-r--r-- 1 root root 451 Sep 26 23:40 public.key
[root@filebeat-41 keys]# cat private.key
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAsaWIkLvQpmEpQiiB3Z56YfuaS0FboYIoNDqmDB9ibJFJUVpL
NU8F+5m3AcNJSt0s5vB+N5SKHDvFvxRMU+f1L83a4CWzV1YYxMa5A9pVOyyqAhmx
TS0p9amYymqwG8AvRB3m0sSrE+Vn9z/4XN8tqFoxTfhg6Ap93DLqM5xOg0jtnTZ3
VIAt5bHaIdZQMVz/Gyc7Lsa2zSrJnZW67Ac5rRhoxffveZ1RTN7ebABqXG4yt8cI
vhbET5/Fbs7qVp0XAzCytZj2Xf+c9DmPqA72DHtvQp5jRDfumXYxnAbQLGgX1SX7
xYMR4eYKpUS8QuJ0ZTFsjR7KJTiv1cOCFyqYCwIDAQABAoIBAGqSN788LQvjNfEu
g9oD/L9TRVjoOKRHhP7wQDT9jvo6npVjacLtSVWK/bLdCNcUoJ9anx2QytntMdBT
yQZ9HSY0hJ37f/9g8zL5VHzvOjpprQPdjfQSqB1sRPEJ1+SOAs0Gczb2LPueoCRA
CCsO6EEa+oEgBGKwCJlVIhMcLi2rTYgCe8UQJwFbbxMZp7HcdMiVOoHB9+wCLUW1
vmsLYvYgx4kbSL3dUnQOb+1GZejrCfGu7xWSAhrzKDAa3vbgFQODhnNp+8EWbIAu
0ycY/U46Qrc1h1ZpLElT/Q7xukNknKfEI6mWGoe3Fa8vkSq+fI01KCwIBHiqBqtf
3PchJYECgYEA6gCrQ+mfIXgHiEqzKMK4RrwSSEqbiuEmxU2Q0V6d0GllgSXevx9G
nbwvMuGcnfT0R25kZhEpJLXr763f+13kxn+gZhNloEPk2Tq2raCYopIB80kKxVgs
98e6cNgT5o2ipMq+hkHzCxcy5h6u6pum4NbrXBg6ixeYbaCiMUS3CbECgYEAwlik
s2GiLLBTWfM1oMffuMgIFpspDQuYVkCHUhfoyTtXCCt5kh6nwKgzCwZZxrsTYsc0
bQt3P9NH1JYe8PCMRcKDB4rIbOx8I0tRUqmyq6xUBl7W5swiSIHgYh+cRx2lSHQ4
qMKOC9vaaPVLxQhBBkL3I0eY8iME4FHkz2IT8HsCgYEAgZ4pQA8SlGl2Uqp+Hx/t
D1FyFxUsn3skDLpwc2kjpaQcE7O0dM2QQiNRSa/rHxvmjAK8HkV3MtyKelMn9IcI
CGP9p00rR+ETzLhXJEoHAlY6OlbFXpb/IalCvusR6u2doAamDpxNUmFhUlLAtTfO
8lBaQsMw+obxahhGf1/+u6ECgYBw1EXKXsRobXX2otxfm6qm/Hq1pR8QE8s9R/lI
D9l1+p1sgNDzpBiAISaBIA6+8Z0vm7c0F5QD2gW5xe3ws7a8SVEI7+msUx8+3ls4
Qo0YXdPqXuUk2R6OOdirHu772po6lj7OuyT8fYcvqDl1CnW1zOrt8IM7EFmkYecU
/zvUQQKBgQDJhsYb6/PLsoj7LyuxJAzZnCYXYo1RrZJMjXk83uSzEw4RlYAwTA0P
6pFmFn26mEr/G9rBx13Q7gE+5VZL/PmF5FzJqBFlw8l6v+qJteq4+SRotYlnr+XI
fJWklMg0HsHX/IIafwQbv0XhRFfQULaUcU0PCXyayNUbq9yZmxon8A==
-----END RSA PRIVATE KEY-----
[root@filebeat-41 keys]# cat public.key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsaWIkLvQpmEpQiiB3Z56
YfuaS0FboYIoNDqmDB9ibJFJUVpLNU8F+5m3AcNJSt0s5vB+N5SKHDvFvxRMU+f1
L83a4CWzV1YYxMa5A9pVOyyqAhmxTS0p9amYymqwG8AvRB3m0sSrE+Vn9z/4XN8t
qFoxTfhg6Ap93DLqM5xOg0jtnTZ3VIAt5bHaIdZQMVz/Gyc7Lsa2zSrJnZW67Ac5
rRhoxffveZ1RTN7ebABqXG4yt8cIvhbET5/Fbs7qVp0XAzCytZj2Xf+c9DmPqA72
DHtvQp5jRDfumXYxnAbQLGgX1SX7xYMR4eYKpUS8QuJ0ZTFsjR7KJTiv1cOCFyqY
CwIDAQAB
-----END PUBLIC KEY-----
使用公钥加密文件
[root@filebeat-41 keys]# openssl rsautl -encrypt -in test.txt -inkey public.key -pubin -out res.txt
[root@filebeat-41 keys]# md5sum test.txt res.txt
6f5902ac237024bdd0c176cb93063dc4 test.txt
a12303ca891406224d6326d78eb94ccd res.txt
[root@filebeat-41 keys]# ls -lh *.txt
-rw-r--r-- 1 root root 256 Sep 26 23:44 res.txt
-rw-r--r-- 1 root root 12 Sep 26 23:43 test.txt
使用私钥解密文件
[root@filebeat-41 keys]# openssl rsautl -decrypt -in res.txt -inkey private.key -out test2.txt
[root@filebeat-41 keys]# md5sum test*
6f5902ac237024bdd0c176cb93063dc4 test2.txt
6f5902ac237024bdd0c176cb93063dc4 test.txt
使用私钥对文件签名
[root@filebeat-41 keys]# openssl dgst -sign private.key -md5 -out dgst.txt test.txt
[root@filebeat-41 keys]# ll -h dgst.txt test.txt
-rw-r--r-- 1 root root 256 Sep 26 23:49 dgst.txt
-rw-r--r-- 1 root root 12 Sep 26 23:43 test.txt
使用公钥校验签名
[root@filebeat-41 keys]# openssl dgst -verify public.key -md5 -signature dgst.txt test.txt
Verified OK
6.4. 证书
6.4.1. CA证书
[root@filebeat-41 keys]# openssl genrsa -out ca-key.pem 2048 # 生成私钥
[root@filebeat-41 keys]# openssl req -new -out ca-req.csr -key ca-key.pem # 生成证书请求文件
# CA 证书可以使用自己的密钥添加签名(自签名), 即使用 -signkey ca-key.pem
# 在使用CA证书签署Server或者Client证书时,千万不能添加 -signkey,否则在多域名证书时导致重复的签名
[root@filebeat-41 keys]# openssl x509 -req -in ca-req.csr -out ca-cert.pem -signkey ca-key.pem -days 3650 # 生成ca证书,有效期10年
[root@filebeat-41 keys]# openssl req -text -noout -in ca-req.csr # 查看ca证书请求文件内容
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=CN, ST=JS, L=NJ, O=Default Company Ltd, CN=ca-cert.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:d0:a8:ff:10:26:a6:49:b9:10:6e:59:97:8a:83:
eb:0f:cd:c4:b5:6c:71:76:89:35:0e:77:41:55:3d:
36:73:4e:9b:e0:50:d2:ac:5d:98:7b:4b:0e:0a:5b:
2d:72:ec:4e:f7:8b:73:d8:ff:b1:11:52:f4:e1:5b:
a8:57:5a:00:21:df:fb:d2:ed:87:d6:1b:8e:72:5a:
e6:cf:0b:16:bc:35:b6:eb:7e:8d:85:74:ba:e1:82:
27:40:6e:cf:2d:6f:79:15:3f:26:91:4a:78:70:31:
78:31:d5:79:40:07:c0:c8:2b:cd:b2:59:c8:83:1e:
4b:57:1a:1e:42:a1:16:22:6c:ed:3e:21:a7:de:4d:
39:fc:2f:5f:97:c1:95:b3:88:53:79:2e:93:56:74:
e9:39:56:22:13:c0:68:ee:2f:67:fd:39:23:39:fb:
76:1e:c2:ee:e3:9a:8a:ef:c8:03:ba:93:cd:50:f2:
bc:a1:24:71:13:88:c6:11:01:e2:d0:45:c9:d7:aa:
75:75:ab:27:f7:f2:d7:4b:ed:9f:5f:3a:d5:6c:a6:
ba:99:22:0d:7a:30:40:e8:24:f9:17:7e:1f:fa:96:
90:3f:bc:71:65:ae:9f:d8:23:3d:01:b4:6b:76:58:
69:4d:64:8b:8c:49:f2:68:e8:a9:c3:eb:22:06:7c:
0b:45
Exponent: 65537 (0x10001)
Attributes:
a0:00
Signature Algorithm: sha256WithRSAEncryption
00:57:09:5f:ef:b8:7b:3c:51:c7:26:3f:7e:7e:27:db:31:7c:
68:05:ec:1a:f5:19:ad:f4:bd:fa:fd:a2:1d:3f:41:d6:15:2a:
a1:39:68:c1:80:b4:3f:19:fb:e0:fb:94:23:14:e7:9b:84:7e:
ea:36:d5:c2:73:e1:70:af:09:8d:1c:40:dd:10:b1:89:c6:61:
dc:ed:10:da:99:f9:b3:d6:ce:55:b6:17:9f:50:20:9c:95:7e:
c1:78:23:97:03:ef:6c:ea:7d:b4:37:20:cc:59:f7:44:30:88:
2d:4b:45:fb:a9:6f:66:89:24:49:ac:86:d1:8e:2b:0d:7c:ac:
2e:29:6c:e8:f2:22:8e:09:1a:fd:19:ba:b0:ef:de:a3:aa:88:
65:da:ea:ba:a4:e3:b6:08:31:95:70:37:85:6f:e0:17:8f:dd:
31:40:b5:b0:82:d0:ce:11:af:00:23:92:58:c0:1e:ec:db:0b:
cc:f5:85:09:ae:4e:ae:72:36:e5:56:fe:85:7a:11:75:0b:90:
75:b9:c2:44:be:5a:03:88:0c:12:1e:2b:f6:62:f3:9f:d4:2a:
01:b2:c1:f8:a8:cc:1a:b3:1d:23:ea:f2:01:12:ae:3f:7a:f4:
59:95:db:e0:68:74:fc:e7:96:d0:a5:b8:a2:7c:32:e2:ed:39:
fd:09:bc:5f
6.4.2. Server证书
[root@filebeat-41 keys]# openssl genrsa -out server-key.pem 2048 # 生成私钥
[root@filebeat-41 keys]# openssl req -new -out server-req.csr -key server-key.pem # 生成证书请求文件
[root@filebeat-41 keys]# openssl x509 -req -in server-req.csr -out server-cert.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 365 # 生成公钥,并让ca签名
[root@filebeat-41 keys]# openssl x509 -text -noout -in server-cert.pem # 查看证书内容
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
d7:86:2e:a2:e6:df:a7:7c
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=CN, ST=JS, L=NJ, O=Default Company Ltd, CN=ca-cert.com
Validity
Not Before: Sep 27 00:29:04 2020 GMT
Not After : Sep 27 00:29:04 2021 GMT
Subject: C=CN, ST=NJ, L=NJ, O=Default Company Ltd, CN=es.ddn.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:ab:f8:b5:ae:35:61:87:2e:2b:88:b3:fe:3b:2f:
64:e9:a4:57:ea:6c:01:a2:49:0a:ef:ae:0d:5a:e4:
e4:e9:2c:f5:04:44:cc:25:33:02:1a:bc:a8:0a:2b:
c7:32:04:c6:61:34:52:33:73:b9:09:68:64:3e:da:
4e:8e:5e:f9:9c:8c:3c:7a:85:1a:e6:26:32:66:82:
0d:b9:d8:c0:8e:95:40:8e:d8:3d:8c:68:fd:bc:11:
c4:55:16:05:00:e3:26:63:6d:20:f8:6d:bb:38:ad:
94:6a:07:f6:ab:ce:54:e7:f1:1a:9a:dc:e4:cf:2d:
34:97:aa:0b:7a:80:84:56:bf:42:09:26:2b:0d:6e:
15:a0:86:27:e7:fb:14:b2:a6:d9:3e:ac:be:bc:2b:
5f:f1:40:b9:12:1b:fa:cf:fe:b9:47:df:df:1d:5f:
4a:13:34:36:ac:db:54:ff:60:4e:cc:29:3c:72:1e:
ad:1e:23:de:e9:ac:3d:3b:40:4b:62:a8:67:63:eb:
b4:a8:cd:1a:65:00:f3:e3:62:e2:9f:23:76:88:e7:
67:6a:10:cb:28:d9:1e:c6:cd:d2:60:58:e8:a5:21:
61:80:0e:d6:cd:a6:9e:02:04:22:2a:19:2b:e8:ff:
46:86:30:f9:a8:e1:7f:b3:1c:a2:6d:5d:29:69:e4:
25:53
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
c2:6a:99:87:09:49:9f:0f:0a:e9:c7:60:f9:f0:67:57:82:7d:
f8:54:39:bf:48:8d:db:f6:4b:a8:56:96:03:33:46:f2:0c:69:
a4:9d:a1:48:56:ba:9a:d3:ff:77:b0:19:dd:69:14:2c:81:24:
43:91:0c:4c:38:13:65:05:52:78:24:0c:82:1e:f5:ab:be:9d:
df:a9:6c:43:92:22:38:58:fe:96:11:dc:68:7b:38:e9:17:0d:
cd:26:56:ef:4d:af:b9:7c:7e:28:8f:9f:06:45:2d:00:1b:97:
90:8a:9e:83:82:2a:33:fe:8a:71:2f:77:d2:36:28:70:ed:ad:
90:8f:6a:28:82:d3:a2:7c:99:19:1c:d2:2e:83:68:49:ed:70:
49:00:52:eb:9c:36:b1:27:69:86:69:ee:f9:94:14:a6:15:bc:
0b:26:13:8e:e1:f8:c6:c2:a6:7d:f7:ad:8f:74:18:13:06:23:
b5:9a:75:14:c8:1c:3f:be:b1:5a:2a:3d:97:01:5f:42:c8:91:
0a:1d:32:2f:3a:5e:db:f9:46:3d:ed:74:a4:d1:db:b4:fe:26:
bd:91:3c:b3:ed:f0:d5:7b:47:ca:70:10:ab:ba:92:8e:93:2c:
a3:16:2f:e0:6d:7b:78:2d:ff:42:19:f7:10:16:2a:65:c6:b2:
a6:60:25:00
6.4.3. Client证书
[root@filebeat-41 keys]# openssl genrsa -out client-key.pem 2048
[root@filebeat-41 keys]# openssl req -new -out client-req.csr -key client-key.pem
[root@filebeat-41 keys]# openssl x509 -req -in client-req.csr -out client-cert.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 365
6.4.5. 多域名证书
[root@filebeat-41 keys]# cat mu_server.conf
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
C = CN
ST = JiangSu
L = Nanjing
O = Duduniao
OU = Devops
CN = www.ddn.com
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1 = elasticsearch.ddn.com
DNS.2 = kibana.ddn.com
DNS.3 = grafana.ddn.com
DNS.4 = prometheus.ddn.com
IP.1 = 127.0.0.1
[root@filebeat-41 keys]# openssl genrsa -out mu_server.key 2048
[root@filebeat-41 keys]# openssl req -new -key mu_server.key -config mu_server.conf -out mu_server.csr
[root@filebeat-41 keys]# openssl x509 -req -in mu_server.csr -extfile mu_server.conf -extensions v3_req -out mu_server.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 365
[root@filebeat-41 keys]# openssl x509 -text -noout -in mu_server.pem
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
d7:86:2e:a2:e6:df:a7:82
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=CN, ST=JS, L=NJ, O=Default Company Ltd, CN=ca-cert.com
Validity
Not Before: Sep 27 13:20:13 2020 GMT
Not After : Sep 27 13:20:13 2021 GMT
Subject: C=CN, ST=JiangSu, L=Nanjing, O=Duduniao, OU=Devops, CN=www.ddn.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:be:96:dd:79:65:1d:19:70:f1:46:11:ce:0a:0c:
6b:f2:96:c5:da:0e:dc:52:72:66:d2:23:9f:b3:30:
85:ba:b5:fd:1e:0a:18:9f:dc:c8:45:41:d4:2e:27:
45:62:f9:65:fa:12:68:8a:aa:f8:e6:22:f5:ed:fc:
d0:c4:3b:61:d1:6f:84:88:3d:e8:a2:0c:14:f0:e9:
d4:7e:5b:ab:ce:da:75:d4:a5:6e:1f:26:1b:c7:de:
9b:ea:91:76:48:d9:28:79:37:81:bf:02:07:63:7a:
cc:78:df:8b:03:4e:4f:9c:cf:5d:37:8d:1b:f6:36:
fa:b8:ee:f5:54:06:ea:7e:34:ad:de:c4:4e:d3:54:
56:fa:28:0e:9d:ca:fd:51:f2:f1:85:56:a2:02:19:
67:ea:02:4c:a5:e9:3a:ce:5f:65:27:66:7f:e7:ed:
f7:ea:48:e2:6c:48:2f:11:99:d0:8a:7b:4e:4f:c8:
8c:21:7b:e3:70:55:7a:55:ad:60:ea:ac:60:65:cb:
ea:4c:df:7d:5e:93:50:24:cb:b2:43:fe:c9:24:dd:
ac:3c:85:81:c4:48:e9:da:a8:15:01:ab:9e:80:4a:
50:a7:f7:82:01:33:a0:d6:c1:0d:a3:8f:db:34:67:
c0:5a:34:14:b4:69:86:16:a2:ee:1b:85:43:d3:e4:
3d:8f
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:elasticsearch.ddn.com, DNS:kibana.ddn.com, DNS:grafana.ddn.com, DNS:prometheus.ddn.com, IP Address:127.0.0.1
Signature Algorithm: sha256WithRSAEncryption
21:f6:08:f2:cb:7f:e4:71:68:67:64:cb:6c:41:5b:ef:76:cd:
f4:88:9c:7a:9f:9a:51:63:30:92:d4:00:fe:1f:87:02:76:13:
ee:02:e2:08:c3:ab:a0:a4:bd:be:ea:ef:71:b8:ad:0f:2f:eb:
b7:93:e7:92:86:f3:2b:14:2c:ca:e6:68:1b:2b:84:47:07:e7:
ba:a7:69:61:9a:95:97:25:d7:33:95:63:f8:0f:a8:31:a3:3b:
e5:22:d8:39:77:4b:04:39:f2:44:4a:8a:ef:95:ca:0e:9b:e3:
3a:5a:10:91:a5:64:9e:e6:4a:0d:6d:38:7c:0c:1d:68:44:f7:
d9:af:3f:7b:47:df:de:a8:00:31:09:ea:53:da:44:ca:23:fc:
79:64:e9:1c:1f:df:9a:87:d3:51:6f:ab:60:d4:72:6b:c3:08:
1c:65:a5:12:46:89:aa:4b:cd:36:87:ce:d5:ed:9f:fb:f4:e8:
df:bb:a0:74:be:1f:17:1b:e2:29:e8:05:70:48:cd:12:61:88:
b0:d6:5b:95:1a:c7:b3:02:90:f1:3c:d7:6e:51:b1:fc:b8:f8:
a5:cb:a2:c4:17:02:70:96:3c:3e:07:b1:b3:ba:78:f8:2a:34:
0e:78:7c:98:b1:2e:66:64:39:40:c1:82:90:93:f7:d9:e3:9f:
89:54:52:8c
6.4.6. 泛域名证书
与 6.4.5. 生成多域名证书一致,只需要将[alt_names]中域名改为通配符域名即可,如
*.ddn.com