证书的作用

1.加密通信数据
2.验证对象身份
3.保证数据完整性

自签名证书是什么

公认的证书往往都要收费,如果客户端与服务端都由自己来操控,便可以使用自签名证书(只是自己认可的证书)

CA签名证书

就是把我们自己当成认证机构去认证一个证书,客户端信任该CA证书也代表信任该CA证书签名的所有自签名证书

自签名证书应用场景

1.用于测试环境中需要使用证书时
2.用于构建根CA

自签名证书分为

1.自签名私有证书(无法被吊销)
2.自签名CA证书(可以被吊销)

两种自签名证书的区别在于

如果私钥不小心被恶意获取,私有证书不能被吊销,那么黑客有可能伪装成受信任的客户端与用户进行通信
如果需要创建多个客户端证书,使用自建签名证书的方法比较合适,只要给所有客户端都安装了CA根证书,那么以该CA根证书签名过的客户端证书都是信任的,不需要重复的安装客户端证书。

不过因为是自建的CA证书,在使用这个临时证书的时候,会在客户端浏览器报一个错误,签名证书授权未知或不受信任(signing certificate authority is unknown and not trusted),但只要配置正确,继续操作并不会影响正常通信。自签名证书的issuer和subject是一样的

openssl是什么

是一套开源的密码学工具包
在SSL协议中,我们使用了很多密码学手段来保护数据,其中包括对称密码,公钥密码,数字签名,证书,完整性校验,伪随机数生成等。由于这些算法和操作都非常复杂,于是开源社区就开发了一套库,这个库里面提供了很多现成的标准方法,其他开发者只要正确的调用这些方法,就可以实现SSL协议中的各种加密/解密操作了。

使用openssl的私钥产生公钥之前,需要了解以下几点:
1.key算法:openssl支持生成RSA,DSA,ECDSA的密钥对,但RSA是目前使用最普遍的。
2.key长度:RSA的2048是公认比较安全的key长度。
3.密码(Passphrase):在key上使用密码是一个可选值,但是一般都是强烈建议的,这样每次使用key文件时,都需要输入密码才能使用,增强了其安全性,但随之而来的易用性也会变差。

下面分别阐述如何使用openssl生成这两种自签名证书:

生成CA证书

1.生成CA证书的私钥key(ca.key)。以下输入了为这个key值设置了密码,且密码使用aes128加密保存:

openssl genrsa -aes128 -out ca.key 2048

Generating RSA private key, 2048 bit long modulus
............+++
................................................................+++
e is 65537 (0x10001)
Enter pass phrase for ca.key:****************
Verifying - Enter pass phrase for ca.key:****************

这个key文件就是私钥文件,可以查看文件内容:

cat ca.key 
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,3AA345A5EAEEC76EA555F5A31BBFA8EE

k1L969cTWsZpHRPHcXBGlA29frVQmavNLOBA9Dpd7I0h3wShhPQBEMM0jlmhGjyH
5toPblm1OmSxQfWwpLVXg6beawUHo47lis+o1tHk0Xw857dFuVF6zVFY8NljEWm0
Egev5pBGjlB6i4jnaBS/T7V19sklAqHc8Eb9oT9rhSc5vlBSosKzG+GFFQL4jQV7
0Yv+6KWO4ILZPCZi2llQ3vTO9TKF5ZjjNS506qqilwJQblIgju/wzr3k6Eca1XXZ
bPSVNl0tFpXR/ZwM8S3UabRZG45BPxQ9yqb4dKSJ87HZIm8SO0Y6uuioCiT55zIv
sfU4trvrieCTGbHArYT8WlhAU9x1L7FD9lKy2HQksDC9wlAaCB3QvOExs7r1EEFS
/0zcD+ZGbrhGrXIXeNfrqUzQbEwMEhQ9/RYJYDEEw0ix0KUyXE76jTnx4dHb1s+l
21O9C2MoFlNLxnGYdnZGAYyt9enIGyfFfLeowuGpXyFENEcBe7gCyWwM8KgOtvsW
0AB/cFJpsDXsFxqAsXXc0T9lg4GjbNEJ77mXgn9lM7c8eNjLZ8fFHSl32iDHr4Y7
04Z9ybwXeO3fTg68GKmqkcwOfy8F2cYULcDb2litVVj9HZEW9ytwheU4MwA9NFfl
zlXBq7E8T0xcLQ6P/6AJ0c1opX0KKLBc6H8jHd3vPtHQ2F+7BiyIAK5aS8WV+d7a
S5Rr6aw6d2qOUHCPcWNIdOuoF/jqTzhHuPah68lT7AWJrLG0r7rbT2FpjpPBRxFg
Dbh8piV6akY15yjnR436MosFR3YG4z0oBfJj8tX3Q7x0uU1jJhgv+bK9/lVTQttk
jqPI+VlDHSpSVmVKss1saBYy2KA9/1af6BbaKwzvDwxABpIQt7ggZvo+m3qjV++r
Q8jp9RExQ0Wb2WEDhYzJcBVBKzLHUYVexs/8jppLy46xnWMCrmupoWTlidaaWH6q
yiviIuG9rtufJ46IGJCm6iysq652x6H8v8y1gNarez97TvaX4YcnhLWS8ekop5Mu
4SmRdl84K/YtYa93JHVcnQvATUtlUFJoTx+2GJiDAeqsXu023EzTxmSRMAx5wb4G
9aseIe3QSEfH9ofJQv7qKk4iBJVRsGpruhp57cIdmwFcgncKubpWif95PPmYvcAM
SB+/4kWv44v4gEdeK75F32aEKRoJWWi3rUl8vVnEq+w9BTctM+dWdbtvt7Ztx4SE
ZjbZDUs7pzZy5/U8COZu8E98J5oQAm3TuXhXmvk3chDUAAfAL9z0GdzPBeFYku4X
691JzCgvcMs+URXB0mY6+JW8zyet7VNqqYAEhCmQu4myK1vtOZK0W7WFNsS1RoJF
7pYbPmHMaHtPfW8QuaWnIX+6Y5ikzPs7UURbRA6OFO9JuZjvioAtyamT+3ddWipN
9e6kzK+MtCyfMm1m1rdtwVjJR7PNNxxxxx
-----END RSA PRIVATE KEY-----

2.生成公钥

使用命令:
openssl rsa -in ca.key -pubout -out ca-public.key
Enter pass phrase for ca.key:****************
writing RSA key

查看这个key文件,就是公钥:

cat ca-public.key 
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzOofgh69ioDeB9fGVMQd
/sCgfD1xcrRaf6l6ttrIRvtie/ImJEhP3r2KmDEfIKormpUget8tsAxE7uesgaDi
NQzn63YnOz6jiIN9a7as08kL1GyCexF0KFj27hMDcbNDIMZA+i+tLruuExnAdj4f
48T5kA6wiEWXVgPONbHixDrOkcSKQQq1KfV0raFxMX/PyY+kKgnUR7azBOl8X719
HZwcdpOcg6+qbIHpOYWAGePTNlX4jPEU4eNLhCd+n+pT2OCQnrMEslLFoeoYgCvm
RSnv/xxxxxx
-----END PUBLIC KEY-----

3.生成CA的自签名证书ca.crt,此处的CA证书也是一个自签名证书

openssl req -new -x509 -days 365 -key ca.key -out ca.crt
# 输入上面ca.key的密码后,根据自身测试环境的情况输入相应的信息,在Common Name选项中填写你要使用的域名
Enter pass phrase for ca.key:****************
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) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:devops03.com
Email Address []:

以下命令可以不用在调用密钥文件的时候输入密码:

openssl rsa -in ca.key -out ca.key 
Enter pass phrase for ca.key:****************
writing RSA key

查看自签名证书信息(颁发者):

openssl x509 -in ca.crt -subject -issuer -noout

subject= /C=CN/L=Default City/O=Default Company Ltd/CN=devops03.com
issuer= /C=CN/L=Default City/O=Default Company Ltd/CN=devops03.com
使用CA证书签名自签名证书

步骤:也就是获取权威机构办法的证书(此处为我们刚才生成的CA证书),需要先得到私钥的key文件(.key),然后使用私钥的key文件生成sign req文件(.csr文件),最后把csr文件发给权威机构,等待权威机构认证,认证成功后,会返回证书文件(.crt)。

1.生成自签名证书私钥key(server.key)文件

openssl genrsa -aes128 -out server.key 2048 

Generating RSA private key, 2048 bit long modulus
...................+++
.........................................+++
e is 65537 (0x10001)
Enter pass phrase for server.key:****************
Verifying - Enter pass phrase for server.key:****************

2.利用私钥server.key文件生成自签名证书请求文件server.csr
生成csr文件时,需要填写一些关于待签人或者公司的一些信息,比如国家明,省份名,组织机构名,主机名,email名,有些信息可以不填写,使用.标识。

openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
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) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:devops03.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:****************
An optional company name []:

输入相应的信息后可以得到server.csr请求文件

3.使用CA证书对自签名证书请求文件进行签名,生成server.crt

openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
Signature ok
subject=/C=CN/L=Default City/O=Default Company Ltd/CN=devops03.com
Getting CA Private Key

查看自签名证书的过期时间:

openssl x509 -in server.crt -subject -issuer -noout

openssl生成root CA及签发证书

有时,使用SSL协议是自己内部服务器使用的,这时可以不必找第三方权威的CA机构做证书,可以做自签证书(自己创建root CA(非权威)。
主要有以下三个步骤:
A.创建openssl.cnf在使用default-ca时需要使用的SSL的工作目录(第一次必须要设置)
1.查看openssl的配置文件

openssl version -a
OpenSSL 1.0.2k-fips  26 Jan 2017
built on: reproducible build, date unspecified
platform: linux-x86_64
options:  bn(64,64) md2(int) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx) 
compiler: gcc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -m64 -mtune=generic -Wa,--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
OPENSSLDIR: "/etc/pki/tls"
engines:  rdrand dynamic 

2.找到OPENSSLDIR: "/etc/pki/tls"的配置文件openssl.cnf
根据配置文件下的[ CA_default ]节点默认值,创建对应文件夹和文件。

[ CA_default ]

dir             = /etc/pki/CA           # Where everything is kept
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
#unique_subject = no                    # Set to 'no' to allow creation of
                                        # several ctificates with same subject.
new_certs_dir   = $dir/newcerts         # default place for new certs.

certificate     = $dir/cacert.pem       # The CA certificate
serial          = $dir/serial           # The current serial number
crlnumber       = $dir/crlnumber        # the current crl number
                                        # must be commented out to leave a V1 CRL
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/cakey.pem# The private key
RANDFILE        = $dir/private/.rand    # private random number file

按顺序在/etc/pki/CA下执行以下命令创建文件夹和文件:

mkdir certs(默认应该是存在的)存放已颁发的证书
mkdir newcerts(默认应该是存在的)存放CA指令生成的新证书
mkdir private(默认应该是存在的)存放私钥
mkdir crl(默认应该是存在的)存放已吊销的证书
touch index.txt  openssl定义的已签发证书的文本数据库文件,这个文件通常在初始化的时候是空的
echo 01>serial   证书签发时使用的序列号参考文件,该文件的序列号是以16进制格式进行存放的,该文件必须提供并包含一个有效序列号

执行完成后,当前目录为:

[root@prometheus01 /etc/pki/CA]# ll
total 4
drwxr-xr-x. 2 root root 6 Jan 18 21:56 certs
drwxr-xr-x. 2 root root 6 Jan 18 21:56 crl
-rw-r--r--  1 root root 0 Mar 28 16:45 index.txt
drwxr-xr-x. 2 root root 6 Jan 18 21:56 newcerts
drwx------. 2 root root 6 Jan 18 21:56 private
-rw-r--r--  1 root root 1 Mar 28 16:45 serial

B:生成CA根证书(root ca证书)
步骤:生成CA私钥(.key) --> 生成CA证书请求(.csr) --> 自签名得到根证书(.crt)(CA给自己颁发的证书)。

1.生成私钥ca.key
openssl genrsa -out ca.key 2048

2.生成csr请求文件
openssl req -new -key ca.key -out ca.csr

3.生成ca根证书 ca.crt
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

C.用自签根证书ca.crt给用户证书签名。
步骤:生成私钥(.key) --> 生成证书请求(.csr) --> 用CA根证书签名得到证书(.crt)

1.openssl genrsa -out server.key 1024
2.openssl req -new -key server.key -out server.csr
3.openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key 

D.证书的简单使用
把server.crt以及server.key保存在服务器端等待程序加载使用。
把ca.key保存在客户端,如果客户端需要验证服务器端发的证书时使用。

nginx官方文档中有关自签名证书的生成步骤:

Generate Certificates
To generate dummy certficates you can do this steps:

cd /usr/local/nginx/conf
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Configure the new certificate into nginx.conf:

server {

    server_name YOUR_DOMAINNAME_HERE;
    listen 443;
    ssl on;
    ssl_certificate /usr/local/nginx/conf/server.crt;
    ssl_certificate_key /usr/local/nginx/conf/server.key;

}

Restart Nginx.

Now all ready to access using:

https://YOUR_DOMAINNAME_HERE

RSA是非对称加密,需要用两个密钥来加密和解密,这两个密钥是公钥和私钥

posted on 2022-03-28 18:22  jiayou111  阅读(6608)  评论(2编辑  收藏  举报