目录

openssl详解

OpenSSL简介

官网:https://www.openssl.org/source/

是目前最流行的SSL密码库工具,提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS协议的实现

主要构成:密码算法库、密钥和证书封装管理功能、SSL通信API接口

主要用途:

1、建立RSA、DH、DSA key参数

2、建立X.509证书、证书签名请求(CSR)和CRLs(证书回收列表)

3、计算消息摘要

4、使用各种Cipher加密、解密

5、SSL/TLS客户端以及服务器的测试

6、处理S/MIME或者加密邮件

RSA密钥操作

私钥无密码默认加密方式

1
2
3
4
生成RSA私钥(无加密)
[root@master1 pki]# openssl genrsa -out rsa_private.key 2048
根据私钥生成对应的公钥
[root@master1 pki]# openssl  rsa -in rsa_private.key  -pubout -out rsa_public.key

私钥有密码使用aes256加密方式

1
2
3
4
5
6
7
8
生成私钥
[root@master1 pki]# openssl genrsa -aes256 -passout pass:111111 -out rsa_aes_private.key 2048
其中passout代替shell进行密码输入,否则会提示输入密码,固定格式
pass:密码

此时生成公钥会需要密码
[root@master1 pki]# openssl rsa -in rsa_aes_private.key  -passin pass:111111 -pubout -out rsa_aes_public.key
其中使用passin 代替了shell进行密码输入

转换命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
加密私钥转非加密私钥
[root@master1 pki]# openssl rsa -in rsa_aes_private.key -passin pass:111111 -out rsa_aes_private_new.key

非加密私钥转换为加密私钥
[root@master1 pki]# openssl rsa -in rsa_aes_private_new.key -aes256 -passout pass:111111 -out rsa_aes_private_new1.key

PEM格式的私钥转DER格式
[root@master1 pki]# openssl rsa -in rsa_private.key  -outform DER -out  rsa_private.der

DER格式的私钥转PEM格式
[root@master1 pki]# openssl rsa -in rsa_private.der -inform DER  -outform pem -out  rsa_private1.pem

-inform 参数指定输入的格式,-outform 参数指定输出的格式

查看私钥明细
[root@master1 pki]# openssl rsa -in rsa_private1.pem -noout -text

查看公钥明细
[root@master1 pki]# openssl rsa -pubin -in rsa_public.key -noout -text

私钥PKCS#1转PKCS#8
[root@master1 pki]# openssl pkcs8 -topk8 -in rsa_private.key  -passout pass:111111 -out pkcs8_private.key

其中-passout 指定了密码,输出的pkcs8格式秘钥为加密形式,默认采用des3加密算法,内容如下
-----BEGIN ENCRYPTED PRIVATE KEY-----
BASE64 ENcoded Data
-----END ENCRYPTED PRIVATE KEY-----

可以使用-nocrypt参数可以输出无加密的pkcs8秘钥

[root@master1 pki]# openssl pkcs8 -topk8 -in rsa_private.key  -passout pass:111111  -nocrypt
输出格式如下
-----BEGIN PRIVATE KEY-----
BASE64 ENcoded Data
-----END PRIVATE KEY-----

生成自签名证书

生成RSA私钥和自签名证书

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[root@master1 pki]# openssl  req -newkey rsa:2048 -nodes -keyout ca.key -x509 -days 3650 -out ca.crt 
参数讲解
req是证书请求的子命令
-newkey rsa:2048 -keyout ca.key 表示生成私钥(PKCS8格式)
-nodes 表示私钥不加密,若不带此参数,将提示输入密码
-x509 表示输出证书
-days 3650 表示证书有效期,这里有效期为10年
此后提示输入证书拥有者信息:
若执行自动输入,可使用-subj 选项,如下
[root@master1 pki]# openssl  req -newkey rsa:2048 -nodes -keyout ca.key -x509 -days 3650 -out ca.crt -subj "/C=CN/ST=GD/L=SZ/O=lingcb/OU=DEV/CN=lingcb.com/emailAddress=xieys@lingcb.com"

C 国家 ST 省份 L 城市 O 公司 OU 部门 CN 名字  emailAddress邮箱地址

其中CN(公用名称 Common Name) 简称CN字段,对于SSL证书,一般为网站域名;对于代码签名证书则为申请者单位名称;对于客户端证书则为证书申请者的姓名

使用已有的RSA私钥生成自签名证书

1
2
3
[root@master1 pki]# openssl  req -new -x509 -days 3650 -key ca.key  -out ca.crt
参数讲解
-new 指生成证书请求,加上-x509表示直接输出证书,-key 指定私钥文件

生成签名请求以及CA签名

使用RSA私钥生成CSR签名请求

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
创建RSA	私钥
[root@master1 pki]# openssl genrsa -aes256 -passout pass:111111 -out server.key 2048
通过私钥生成csr签名请求
[root@master1 pki]# openssl  req -new -key server.key   -passin pass:111111 -out server.csr -subj "/C=CN/ST=GD/L=SZ/O=lingcb/OU=dev/CN=www.lingcb.com"

此时生成的csr签名请求文件可提交至CA进行签发
查看csr文件的细节
[root@master1 pki]# cat server.csr 
-----BEGIN CERTIFICATE REQUEST-----
MIICpDCCAYwCAQAwXzELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQH
DAJTWjEPMA0GA1UECgwGTGluZ2NiMQwwCgYDVQQLDANkZXYxFzAVBgNVBAMMDnd3
dy5saW5nY2IuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2JC/
OMexNU39ChWipdlI42a102rK3ah0ZaA+upvRl4RIlBiyxz6cuVnYUI765yodGigK
n2DCP2YDvK6fDOfW4nY7fVvbyv8f8fSkkQLz12n90tRRkAcaSqISU841VI9U0s84
gZFLWbGb8Y/IDeBUvcGYeDnBcbkpCAv24xZg4HhbzIVTjrDv5Sy1GwaPq7v3lon4
nXqnBtJ/+us70GJa9uq0XZcO0xBdo47Rrx05+gSzvwHRvGv7WPrvvwQnohcssFsl
gnFNby6jaazPUsgHSAiY7klL3wLZyehLScG0nHbyUFi81/9sdb1bF2bh1o0QxZYC
kIHN8rOLA4Yft7ThIQIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAHoXvSEbq+0t
UjZvY+oFDNz6Jt23QKQifbEEz+sc58BfxRPWSVrSiMzYl2N4+jsZTZLW7HLcKlMU
wXb4VJbEnezuwFRiqc3s4L0OY79Zn2C2otbFzApfXRWshZAKuLeYgMfYZfaqf/le
e07JJzSCl2VvM81j58DCqUIl/ur1c23c+A/nSFp0fXIakIDP3KLY632UNefWpyJB
HnXOwfajjpVWmRPFXID+w4N/wNQJaTMZhACAqyeHXibNZNHO4YLf3Th0knlhAOuL
QiniJQaobMyje8gb8gUC0qxDkEP+wlJLaEmeUq+SDR+J+45qYmwuiXp9EG5lTKN7
I1PbVDyG+AU=
-----END CERTIFICATE REQUEST-----


[root@master1 pki]# openssl req -noout -text -in server.csr 
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=CN, ST=GD, L=SZ, O=lingcb, OU=dev, CN=www.lingcb.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
....

使用CA证书以及CA秘钥 对请求签发证书进行签发,生成x509证书
[root@master1 pki]# openssl  x509 -req -days 3650 -in server.csr  -CA ca.crt  -CAkey ca.key  -passin pass:111111 -CAcreateserial -out server.crt

其中参数CAXXX 适用于CA参数输入

查看证书细节
[root@master1 pki]# openssl x509 -in server.crt -noout -text

查看证书目录下的证书对应的域名

1
2
3
4
5
6
7
[root@Haproxy01 ~]# cat s.sh 
#!/bin/bash
for i in `ls /etc/haproxy/T`
do
   echo $i && openssl x509 -in $i -noout -text | grep 'Subject: CN=' 
done