Linux学习28-CA搭建与证书申请

CA搭建与证书申请

概述

  • 需要掌握证书申请
  • 了解证书吊销
  • 用到的命令openssl

引言

前面提到的不对称加密时,将公钥传送给对方时,存在中间人攻击的隐患,如果接收方没有进行安全检测,贸然认可,那后续传输就谈不上安全了。
为保证用户之间在网上传递信息的安全性、真实性、可靠性、完整性和不可抵赖性,不仅需要对用户的身份真实性进行验证,也需要有一个具有权威性、公正性、唯一性的机构
这里写图片描述

1. CA和证书

  • 需要知道的名称
  1. PKI
    Public Key Infrastructure公钥基础设施
  2. 发证机构(CA)
  3. 注册机构(RA)
  4. 证书吊销列表(CRL)
  5. 证书存取库
  6. X.509:定义了证书的结构以及认证协议标准
    包括:版本号、序列号、签名算法、颁发者、有效期限、主体名称、主体公钥、CRL分发点、扩展信息、发行者签名
  • CA证书的作用

    1. 为实现双方安全通信提供了电子认证。
    2. 使用数字证书实现身份识别和电子信息加密。
    3. 数字证书中含有密钥对(公钥和私钥)所有者的识别信息,通过验证识别信息的真伪实现对证书持有者身份的认证。
  • 证书获取

  1. 向证书授权机构申请
    1. 生成签名请求(csr),发送给RA,RA审核后发送给CA
    2. CA 判明申请者的身份后,便为他分配一个公钥,并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签字后,便形成证书发给申请者
  2. 自签名的证书
    自已签发自己的公钥,如建立根CA
  • 安全协议
    如下图所示,TLS工作在传输层与应用层之间,也就是用户只能看到传输层以下的数据
    在这里插入图片描述

    1. Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换
    2. ChangeCipherSpec 协议:一条消息表明握手协议已经完成
    3. Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告
    4. Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等
  • 示例:
    HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。HTTP over SSL”或“HTTP over TLS”,对http协议的文本数据进行加密处理后,成为二进制形式传输
    在这里插入图片描述

    1. 客户申请访问https网站
    2. 服务器接收到请求,服务器具备CA认证的密钥
    3. 将CA证书发给客户
    4. 客户用CA的公钥验证服务器证书,确认后,生成对称密钥key,用服务器的公钥加密key
    5. 将加密的key发送给服务器
    6. 服务器端用自己的私钥解密,得到key
    7. 服务器传输key加密信息
    8. 客户端接收加密信息,解密获取
  • 命名

    1. SSL: 安全套接层(Secure Socket Layer)
      早期名称,由Netscape公司开发的
    2. TLS: 传输层安全(Transport Layer Security)
      由IETF(Internet工程任务组) 将SSL命名的国际标准名称,目前主流的为1.2版本
  • 功能

    1. 实现数据的加密
    2. 认证
    3. 完整性
    4. 重放保护 认证
      1. 基于重放攻击的保护手段,通过记录时间,只负责这一次的验证
      2. 所谓重放就是不解密数据,将为解密数据再去匹配
        例如:登录时的账号与密码,不去破解,而是将其拿出来发给服务器,如果服务器校验成功,就会登录
  • 安全协议实现
    分为握手阶段和应用阶段

    1. 握手阶段(协商阶段)
      客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使用的所有密钥都是通过主密钥生成。
    2. 应用阶段:
      在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信

2. OpenSSL工具

证书的申请,需要用到开源项目OpenSSL

2.1 概述

  • 主要组件
    • openssl: 多用途的命令行工具,包openssl
    • libcrypto: 加密算法库,包openssl-libs
    • libssl:加密模块应用库,实现了ssl及tls,包nss
  • 主要文件目录
    /etc/pki/CA
  • 涉及名称:satl值
    • 原理:
      为用户密码添加Salt值,使得加密的得到的密文更加冷僻,不宜查询。即使黑客有密文查询到的值,也是加了salt值的密码,而非用户设置的密码。salt值是随机生成的一组字符串,可以包括随机的大小写字母、数字、字符,位数可以根据要求而不一样。
    • 用途
      当用户首次提供密码时(通常是注册时),由系统自动添加随机生成的salt值,然后再散列。而当用户登录时,系统为用户提供的代码撒上同样的加盐值,然后散列,再比较散列值,已确定密码是否正确。
  • openssl命令:
    直接输入openssl回车进入交互模式,输入带命令选项的openssl进入批处理模式(非交互式 )
    • 程序版本号
      openssl version

        [root@hai7 ~/.gnupg]$openssl version
        OpenSSL 1.0.2k-fips  26 Jan 2017
      
    • 获取帮助
      openssl ?

      [root@hai7 ~/.gnupg]$openssl ?		   				
      标准命令
      Standard commands   
      asn1parse         ca                ciphers           cms
      ......
      消息摘要命令(哈希运算)
      Message Digest commands (see the `dgst' command for more details)
      md2               md4               md5               rmd160            
      sha               sha1  
      加密命令(各种加密算法)
      Cipher commands (see the `enc' command for more details)
      aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb 
      

2.2 对称加密

  • 工具
  1. openssl enc
  2. gpg
  • 算法
    3des, aes, blowfish, twofish

  • 帮助
    man enc

  • 格式

    1. 加密
      openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher
    2. 解密:
      openssl enc -d -des3 -a -salt –in testfile.cipher -out testfile
  • 选项

    • -e:加密输入数据,默认值
    • -d:解密输入数据
    • -des3:加密类型,表示用des3加密
    • -a:base64处理数据。这意味着,如果进行加密,数据将在加密后进行base64编码;
      如果解密被设置,那么输入数据在被解密之前就被解码了
    • -salt: 加盐,随机生成,或者提供-S选项
    • -S : 指定salt值
    • -in: 跟要加密的文件
    • -out: 跟输出的文件
  • 示例
    示例1:为文件f1以des3算法加密,输出为f1.des3

1. 为文件f1以des3算法加密,输出为f1.des3
[root@localhost  /data]$openssl enc -e -des3 -a -salt -in f1 -out f1.des3
enter des-ede3-cbc encryption password:           <==输入2次密码
Verifying - enter des-ede3-cbc encryption password:
2. 查看生成文件,已转换成base64
[root@localhost  /data]$cat f1.des3                 
U2FsdGVkX19KJwR5kcHwfvMkXiumg9uX/MnR9J5KnNPXa2H1OsMabw==

示例2:批处理模式解密示例1中生成的f1.des3

[root@localhost  /data]$openssl enc -d -des3 -a -salt -in f1.des3 -out f2.des3 -pass pass:magedu

2.3 信息摘要算法

  • 算法
    md5sum, sha1sum, sha224sum,sha256sum…

  • 帮助
    man dgst

  • 格式
    openssl dgst -md5 [-hex默认] /PATH/SOMEFILE

  • 选项

    • -sign filename
      用“文件名”中的私钥(DSA算法)对摘要进行数字签名
  • 示例

示例1:以md5算法计算文件f1哈希值,

[root@localhost  /data]$openssl dgst -md5 f1
MD5(f1)= fda4e701258ba56f465e3636e60d36ec
[root@localhost  /data]$md5sum f1
fda4e701258ba56f465e3636e60d36ec  f1

示例2:用md5算法为文件f1签名,输出文件为mo.txt
注:签名私钥为rsa算法

$openssl md5 -sign moli.key -out mo.txt f1

示例3:用md5算法验证签名的文件mo.txt

[root@localhost  /data]$openssl sha1 -verify moli.key.pub -signature mo.txt f1
Verified OK

2.4 生成用户密码:

  • 格式
    openssl passwd -1 -salt SALT(最多8位)
    openssl passwd -1 –salt centos
  • 选项
    • -1:使用MD5哈希算法生成的结果
    • -crypt:默认选项,使用crypt加密
    • -salt:指定salt值
  • 示例
1:[root@hai7 ~]$openssl passwd  -1
Password:                             <==输入2次口令
Verifying - Password: 
$1$08EjVAC6$dfgN2Kn16zkFs12lMYoZd/    <==生成的加密口令,08EjVAC6为salt值

2:[root@hai7 ~]$openssl passwd -1
Password:                             <==输入与上例相同的口令
Verifying - Password: 
$1$d7dionAs$O7BniOV/YF7yNtPPOO3Sk.    <==即使口令相同,系统的salt值不同生成的加密口令也不同

3:[root@hai7 ~]$openssl passwd -1 -salt 08EjVAC6   <==指定1中的salt值
Password: 
$1$08EjVAC6$dfgN2Kn16zkFs12lMYoZd/    <==生成相同的结果

2.5 生成随机数

  • 帮助
    man sslrand
  • 格式
    openssl rand -base64|-hex NUM
  • 选项
    • -base64:使用base64编码生成随机数
    • -hex:生成16进制数
    • NUM:表示字节数;-hex时,每个字符为十六进制,相当于4位二进制,2个加起来才是1个字节,出现的字符数为NUM*2
  • 示例

示例1:各选项示例

[root@hai7 ~]$openssl rand -base64 1   1字节表示8位  3字节表示24位,如果可以被6整除就不会出现=
+g==
[root@hai7 ~]$openssl rand -base64 3
vzof
[root@hai7 ~/.gnupg]$openssl rand -hex 3   
6ac247            <==输出结果为num的2倍长度

示例2:生成12位指定随机口令,不要出现特殊符号

[root@hai7 ~]$openssl rand -base64 24|tr -d "/+"|head -c12
  • base64简介
    • base64不是加密 机制,只是将文本转换成特殊的字符格式
    • 可以通过命令base64 -d fire还原成原来的文本,
    • 它是通过64个字符来表示(也就是2^6)系统中的二进制,分别为z-aA-Z0-9+/
base64 二进制转换为十进制
A-Z 0-25
z-a 26-51
+ 62
/ 63

示例:ab转换为base64

[root@hai7 ~]$echo -n "ab"|base64
YWI=
[root@hai7 ~]$man ascii  
查看ascii得知a的对应10进制为97,转换成二进制为01100001
b为98二进制为01100010
base64只占6位,所以ab表示如下
011000  01  0110  0010 分割后最后一段不够6位要补齐得到如下结果
|011000|01  0110| 001000 |
|24    |   22   | 8  用=表示凑出来的2个0
|Y     |    W   | I=

2.6 密钥生成

  • 帮助
    man genrsa

  • 生成私钥
    生成一个rsa算法的密钥
    命令:openssl genrsa

    1. 格式:
      openssl genrsa -out </PATH/TO/PRIVATEKEY.FILE> <NUM_BITS>
    2. 选项:
      -out:输出文件
      -des|des3:指定为私钥加密的类型
      NUM_BITS:指定私钥位数
      </PATH/TO/PRIVATEKEY.FILE>:指定生成的路径
  • 提取公钥
    从私钥中提取出公钥
    格式:
    openssl rsa -in PRIVATEKEYFILE –pubout –out PUBLICKEYFILE

  • 示例

示例1:在当前路径生成1024位的私钥,命名为shan.key

[root@localhost  /data]$openssl genrsa -out shan.key 1024

示例2:指定路径生成上例要求私钥

[root@localhost  /data]$openssl genrsa -out /root/shan.key 1024

示例3:生成的私钥为base64编码的转换为原始格式

[root@localhost  /data]$vim shanwuyu.key 
-----BEGIN RSA PRIVATE KEY-----  <==删除批注
......省略
LcE0MaZixVGjNMnhVD++qCMiBKyhMTpzQH5jXzGLv8U=
-----END RSA PRIVATE KEY-----    <==删除
转换为原始二进制格式
[root@localhost  /data]$base64 -d shanwuyu.key

示例4:生成加密的私钥

[root@localhost  /data]$openssl genrsa -out moli.key -des3 1024
[root@localhost  /data]$cat moli.key 
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED                      <==加密提示,未加密文件没有
DEK-Info: DES-EDE3-CBC,27A75F1F94F56962     <==加密提示

示例5:将加密私钥解密

[root@localhost  /data]$openssl rsa -in moli.key -out moli
-in:加密过的私钥
-out:命名解除密码后的私钥

示例6:为了安全通常要给文件加上权限在括号中执行,临时开启一个子shell,使umask只是在这次命令中生效,不影响全局

[root@localhost  /data]$(umask 077; openssl genrsa –out test.key –des 2048)

示例7:从私钥中提取公钥

[root@localhost  /data]$openssl -in moli.key -pubout -out moli.key.pub
-in 指定私钥
-out 输出公钥名
-pubout 表示提取公钥
  • 随机数生成器:伪随机数字
    /dev/random:仅从熵池返回随机数;随机数用尽,阻塞,如果随机数用尽,会等待键盘和鼠标,块设备生成,会慢于urandom
    /dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞

3 OpenSSL生成证书的整个过程

获取CA证书的途径

  1. 付费使用商业CA
  2. 建立私有CA

3.1 证书申请及签署步骤:

  1. 生成申请请求,后缀一般为csr,发送给证书请求部门
  2. RA核验
  3. CA签署
  4. 获取证书

3.2 创建私有CA

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

......前面省略,可能需要设置的从如下行开始
####################################################################
[ ca ]      
default_ca      = CA_default            # The default ca section    
"默认ca"
####################################################################
[ CA_default ]   
"定义默认ca"
dir             = /etc/pki/CA           # Where everything is kept
"ca的工作目录"
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
'ca本身根证书文件'
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
'ca自身私钥的文件'
......省略不需要修改文件
# crl_extensions        = crl_ext

default_days    = 365                   # how long to certify for
'默认有效期365天'
default_crl_days= 30                    # how long before next CRL
'每30发布一次被吊销证书讯息'
......省略不需要修改文件
# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy          = policy_match
'默认策略'
# For the CA policy
[ policy_match ]
'私有化ca策略'
countryName             = match       <==匹配,要求申请信息与CA必须一致
'国家'
stateOrProvinceName     = match
'省'
organizationName        = match
'组织,也就是公司'
organizationalUnitName  = optional    <==可选,可有可无
'部门,可选择,自定义'
commonName              = supplied    <==支持,申请必须填写的项目
'颁发目标的通用名,如网站要提供域名'
emailAddress            = optional
'邮箱,可选项'
# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'
# types.
[ policy_anything ]
'非私有化CA策略'
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional
  • 创建服务器私有CA
    1. 手工创建所需要的文件

      1. 生成证书索引数据库文件
        touch /etc/pki/CA/index.txt
      2. 指定第一个颁发证书的序列号,数字为16进制
        echo 01 > /etc/pki/CA/serial
    2. CA自签证书

      1. 进入到工作目录,
        cd /etc/pki/CA/
      2. 生成私钥,文件名一定为cakey.pem,这里做实验,不使用加密
      3. (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
        
    3. 生成自签名证书

      • 命令格式
        openssl req -new -x509 –key 私钥路径 -days 3650 -out 生成路径
      • 选项
        -new: 生成新证书签署请求
        -x509: 专用于CA生成自签证书
        -key: 生成请求时用到的私钥文件
        -days n:证书的有效期限
        -out /PATH/TO/SOMECERTFILE: 证书的保存路径
  • 示例
[root@hai7 /etc/pki/CA]$openssl req -new -x509 –key  /etc/pki/CA/private/cakey.pem -days 3650 -out  /etc/pki/CA/cacert.pem
      Country Name (2 letter code) [XX]:CN            <=='输入国家'  
      State or Province Name (full name) []:beijing   <=='省' 
      Locality Name (eg, city) [Default City]:beijing    <=='市' 
      Organization Name (eg, company) [Default Company Ltd]:moli   <=='公司' 
	  Organizational Unit Name (eg, section) []:fuwu    <=='部门' 
	  Common Name (eg, your name or your server's hostname) []:v9   <=='标识' 
      Email Address []:   <=='邮箱' 
  1. 查看生成的自签名证书
'进到文件所在目录'
[root@hai7 /etc/pki/CA]$openssl x509 -in cacert.pem -noout -text
'导入Windows中查看比较直观,后缀增加.crt'
[root@hai7 /etc/pki/CA]$sz cacert.pem
  1. 将CA的根证书导入windows系统受信任根证书颁发机构
    控制面板→Internet属性→内容→证书→受信任的根证书颁发机构→导入

3.3 客户端申请证书

在需要使用证书的主机生成证书请求

  1. 生成私钥
    存放目录,根据为那个应用程序使用选择,不同的服务都有自己的工作目录

    例如:给web服务器使用,生成私钥放在其下配置文件夹中/etc/http/conf.dm,将来申请的证书也放在一起

[root@hai6  ~]$(umask 066; openssl genrsa -out  /data/app.key   1024)
  1. 生成证书申请文件,证书申请文件后缀为.csr
    注意:默认国家,省,公司名称三项必须和CA一致,如果想要随意指定需要更改配置文件中的策略,比如将默认策略改为’policy_anything’
切换至生成的私钥目录,借助私钥生成申请文件
[root@hai6  /data]$openssl req -new -key app.key -out app.csr
Country Name (2 letter code) [XX]:CN                <=='国家必须与CA相同'
State or Province Name (full name) []:beijing       <=='省必须与CA相同'
Locality Name (eg, city) [Default City]:beijing     <=='市为可选'
Organization Name (eg, company) [Default Company Ltd]:moli<=='公司必须相同'
Organizational Unit Name (eg, section) []:fuwu    	<=='部门可选'
Common Name (eg, your name or your server's hostname) []:www.shanwuyu.com
"将来可能要使用的域名" 
Email Address []:                         	        <=="邮箱跳过"
A challenge password []:                            <=="密码跳过"
  1. 将证书请求文件传输给CA
[root@hai6  /data]$scp app.csr 172.20.50.201:/etc/pki/CA
  1. CA签署证书
[root@hai7 /etc/pki/CA]$openssl ca -in app.csr -out certs/app.crt -days 100
Using configuration from /etc/pki/tls/openssl.cnf
'系统将申请信息打印至屏幕供CA颁发确认'
Check that the request matches the signature
'省略......'
Certificate is to be certified until Dec 26 06:52:18 2018 GMT (100 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
  1. 查看生成的文件
[root@hai7 /etc/pki/CA]$tree
.
├── certs
│   └── app.crt   '与01.pem是同一个文件'
... 
'申请策略,默认为唯一的,unique_subject=yes,修改为no,可使用相同资料重复申请'
├── newcerts
│   └── 01.pem
...
├── serial            '新证书编号'
└── serial.old      '证书编号备份'
  1. 查看自建文件index.txt内容
[root@hai7 /etc/pki/CA]$cat index.txt
V	   |181226065218Z|	     02	   |unknown |/C=CN/ST=beijing/O=moli/OU=fuwu/CN=www.shanwuyu.com
表示有效|   有效期    |颁发证书编号|
  1. 查看证书中的信息:
    openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|issuer|subject|serial|dates

查看全部

[root@hai7 /etc/pki/CA]$openssl x509 -in certs/app.crt  -noout  -text

查看申请人信息

[root@hai7 /etc/pki/CA]$openssl x509 -in certs/app.crt -noout -subject

查看时间

[root@hai7 /etc/pki/CA]$openssl x509 -in certs/app.crt -noout -dates

查看指定编号的证书状态
openssl ca -status SERIAL

  1. 查看证书有效性
[root@hai7 /etc/pki/CA]$openssl verify -CAfile cacert.pem certs/app.crt 
                                               |  CA证书  |需要验证的证书|
certs/app.crt: OK

-CAfile :后面跟CA的证书文件

3. 4 吊销证书

  • 在客户端获取要吊销的证书的serial
    openssl x509 -in /PATH/FROM/CERT_FILE -noout -serial -subject
  • 在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致,吊销证书:
[root@hai7 /etc/pki/CA]$openssl ca -revoke newcerts/01.pem 
[root@hai7 /etc/pki/CA]$cat index.txt
|  R	|181226065218Z	|180917080308Z|	01	  |unknown	/C=CN/ST=beijing/O=moli/OU=fuwu/CN=www.shanwuyu.com
|表示吊销|     有效期     |   吊销时间  |吊销编号|吊销机构|

R表示吊销 第一个时间表示到期时间 第二个时间表示吊销时间

  • 指定第一个吊销证书的编号,注意:第一次更新证书吊销列表前,才需要执行
    echo 01 > /etc/pki/CA/crlnumber
  • 更新证书吊销列表,文件名要求为crl.pem
    openssl ca -gencrl -out /etc/pki/CA/crl.pem
  • 查看crl文件:
    openssl crl -in /etc/pki/CA/crl.pem -noout -text
    拿到Windows查看要改后缀名为.crl

思考题
安装yum -y install mod_ssl,查看rpm -q --scripts mod_ssl ,参考格式,可以写自动化脚本
将客户端证书路径写为变量

猜你喜欢

转载自blog.csdn.net/free050463/article/details/82761658