OpenSSL和CA证书

PKI:Public Key Infrastructure

公钥基础设施:

  • 签证机构:CA(Certificate Authority)
  • 注册机构:RA
  • 证书吊销列表:CRL
  • 证书存取库:

X.509v3:

定义了证书的结构以及认证协议标准

  • 版本号
  • 序列号
  • 签名算法ID
  • 发行者名称
  • 有效期限
  • 主体名称
  • 主体公钥
  • 发行者的唯一标识
  • 主体的唯一标识
  • 扩展
  • 发行者的签名

证书获取

证书类型:

  • 证书授权机构的证书
  • 服务器
  • 用户证书

获取证书的两种方法:

  • 使用证书授权机构
    生成签名请求(csr)
    将 csr 发送给 CA
    从 CA 处接收签名
  • 自签名的证书
    自己签发自己的公钥

安全协议

SSL:Secure Socket Layer

  • TLS:Transport Layer Security
     1995:SSL 2.0 Netscape
     1996:SSL 3.0
     1999:TLS 1.0
     2006:TLS 1.1 IETF(Internet工程任务组)RFC 4346
     2008:TLS 1.2
     2015:TLS 1.3
  • 功能:机密性,认证,完整性,重放保护

两阶段协议,分为握手阶段和应用阶段

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

SSL/TLS

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

OpenSSL

OpenSSL:开源项目

三个组件:

  • openssl:多用途的命令行工具,包openssl
  • libcrypto:加密算法库,包openssl-libs
  • libssl:加密模块应用库,实现了ssl及tls,包nss

openssl命令:

  • 两种运行模式:交互模式和批处理模式
  • openssl version:程序版本号
  • 标准命令、消息摘要命令、加密命令
  • 标准命令:enc,ca,req,...
对称加密:
  • 工具:openssl encgpg
  • 算法:3des,aes,blowfish,twofish
enc命令:
  • 帮助:man enc
  • 加密:
    ~]# openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher
  • 解密:
    ~]# openssl enc -d -des3 -a -salt -in testfile.cipher -out -testfile
单向加密:
  • 工具:
    1. md5sumsha1sumsha224sum...
    2. openssl dgst
  • dgst命令:
    帮助:man dgst
    openssl dgst -md5 [-hex默认] /PATH/SOMEFILE
    openssl dgst -md5 testfile
    md5sum /PATH/TO/SOMEFILE
  • MAC:Message Authentication Code,单向加密的一种延伸应用,用于实现网络通信中保证所传输数据的完整性机制
    CBC-MAC
    HMAC:使用md5或sha1算法
生成用户密码:
  • passwd命令:
    帮助:man sslpasswd
    openssl passwd -1 -salt SALT(最多8位)
    openssl passwd -1 -salt centos
生成随机数:

帮助:man sslrand
openssl rand -base64|-hex NUM
NUM:表示字节数;-hex时,每个字符为十六进制,相当于4位二进制,出现的字符数位NUM*2

生成密钥对儿:

man genrsa

  • 生成私钥
    openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS
    ~]# (umask 077;openssl genrsa -out test.key -des 2048)
  • 将加密key解密:
    openssl rsa -in test.key -out test2.key
  • 从私钥中提取出公钥
    openssl rsa -in PRIVATEKEYFILE -pubout -out PUBLICKEYFILE
    ~]# openssl rsa -in test.key -pubout -out test.key.pub
  • 随机数生成器:伪随机数字
     键盘和鼠标,块设备中断
     /dev/random:仅从熵池返回随机数;随机数用尽,阻塞
     /dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞

CA:

公共信任的CA,私有CA;

建立私有CA的方法:

  • openssl
  • OpenCA

用openssl命令建立私有CA:

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

####################################################################
[ ca ]
default_ca      = CA_default            # The default ca section

####################################################################
[ 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

x509_extensions = usr_cert              # The extentions to add to the cert

# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt        = ca_default            # Subject Name options
cert_opt        = ca_default            # Certificate field options

# Extension copying option: use with caution.
# copy_extensions = copy

# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL.
# crlnumber must also be commented out to leave a V1 CRL.
# crl_extensions        = crl_ext

default_days    = 365                   # how long to certify for
default_crl_days= 30                    # how long before next CRL
default_md      = sha256                # use SHA-256 by default
preserve        = no                    # keep passed DN ordering

# 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
  • 构建私有CA:
    在确定配置为CA的服务上生成一个自签证书,并为CA提供所需要的目录即文件即可;
    步骤:
    1. 生成私钥:
      ~]# (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
    2. 生成自签证书:
      ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
       -new:生成新证书签署请求;
       -x509:生成自签格式证书,专用于创建私有CA时;
       -key:生成请求时用到的私钥文件路径;
       -out:生成的请求文件路径;如果自签操作将直接生成签署过的证书;
       -days:证书的有效时长,单位是day;
    3. 以文本方式查看证书信息
      ~]# openssl x509 -in cacert.pem -noout -text
    4. 为CA提供所需的目录即文件:
      ~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
      ~]# touch /etc/pki/CA/{serial,index.txt}
      ~]# echo 01 > /etc/pki/CA/serial

要用到证书进行安全通信的服务器,需要向CA请求签署证书:

申请证书:

步骤(以httpd为例):

  1. 在请求的主机上生成私钥:
    [root@node1 ~]# mkdir /etc/httpd/ssl
    [root@node1 ~]# cd /etc/httpd/ssl
    [root@node1 ~]# (umask 077;openssl genrsa -out httpd.key 2048)
    
  2. 在请求的主机上生成证书签署请求:
    [root@node1 ~]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
    
  3. 将请求通过可靠方式发送给CA主机
  4. 在CA主机上签署证书:
     [root@node1 ~]# openssl ca -in /tmp/httpd.csr -out/etc/pki/CA/certs/httpd.crt -days 365
    
  5. 查看证书信息:
    ~]# openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject

吊销证书:

步骤:

  1. 客户端获取要吊销的证书的serial(在使用证书的主机上执行):
    ~]# openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject
  2. CA端主机吊销证书:
    先根据客户提交的serial和subject信息,对比其与本机数据库(index.txt)中存储的是否一致;
    吊销:
    ~]# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
      注意:其中的SERIAL要换成证书真正的序列号;
  3. 生成吊销证书的吊销编号(第一次吊销证书时执行):
    ~]# echo 01 > /etc/pki/CA/crlnumber
  4. 更新证书吊销列表:
    ~]# openssl ca -gencrl -out thisca.crl
  5. 查看crl文件:
    ~]# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text

你可能感兴趣的:(OpenSSL和CA证书)