zoukankan      html  css  js  c++  java
  • 安全和加密——openssl及自建CA

    一、对称加密算法

    对称加密:加密和解密使用共用一个秘钥

    特点

    • 加密、解密使用同一个秘钥,效率高;
    • 将原始数据分割成固定大小的块,逐个进行加密

    缺点

    • 密钥过多,密钥需要分发
    • 数据来源无法确认

    1. 使用gpg实现对称加密

    对称加密文件
    gpg -c file
    生成 file.gpg
    在另一台主机上解密
    gpg-o file -d file.gpg

    2. 使用gpg工具实现公钥加密

    在B主机上用公钥加密,在A主机上解密

    • 在A主机上生成公钥密钥对
      gpg --gen-key // 生成公钥密钥对 需要 鼠标键盘输入产生熵值,xshell连接只能用键盘输入多个任意按键,直到密钥对产生
      随机数生成是从键盘和鼠标中获取
    • /dev/random:仅从熵池返回随机数;随机数用尽,会阻塞
    • /dev/urandom:从熵池返回随机数;随机数用尽,会利用软件产出伪随机数,非阻塞
      
    • 在A主机上查看公钥
      gpg --list-keys
    • 在A主机上导出公钥到 A.pubkey
      gpg -a --export -o A.pubkey
    • 从A主机上复制公钥文件到B主机上
      scp A.pubkey IP-B:
    • 在需要加密数据的B主机上生成公钥密钥对
      pgp --list-keys // 查看是否已有公钥密钥对 gpg --gen-key
    • 在B主机上导入公钥
      gpg --import A.pubkey gpg --list-keys
    • 用从A主机导入的公钥,加密B主机的文件file,生成file.gpg
      pgp -e -r test1 file // -r 是创建公钥密钥对时指定输入的 用户标识,使用指定的公钥 file file.gpg
    • 复制加密文件到A主机
      scp file.gpg IP-A:
    • 在A主机解密文件
      gpg -d file.gpg // gpg -o file -d file.gpg
    • 删除公钥密钥对
      gpg --delete-keys keyName gpg --delete-secret-keys keyName

    二、非对称加密算法

    公钥加密:密钥是成对出现

    • 公钥:公开给所有人;public key
    • 私钥:自己留存,必须保证其私密性;secret key

    特点:用公钥加密数据,只能使用与之配对的私钥解密;反之亦然

    功能

    • 数字签名:主要在于让接收方确认发送方身份
    • 对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方
    • 数据加密:适合加密较小的数据

    缺点

    • 密钥长,加密、解密效率低下

    1. 非对称加密实现

    接收者
    

    生成公钥密钥对 P 与 S
    公开加密公钥P,保密解密密钥S

    发送者
    

    使用接收者的公钥 加密消息 M
    将P(M)发送给接收者

    接收者使用密钥S 解密  P(M)
    

    2. 实现数字签名

    发送者
    

    生成公钥、密钥对 P 与 S
    公开公钥P,保密密钥S
    使用密钥S来加密消息 M
    发送 S(M)给接收者

    接受者
    

    使用发送者的公钥来解密S(M)

    三、openssl的用法

    OpenSSL 开源项目,有三个组件:

    1.openssl:多用途的命令行工具,安装包 openssl
    2.libcrypto:加密算法库,安装包 openssl-libs
    3.libssl:加密模块应用库,实现了SSL及TLS,安装包 nss
    openssl可以实现密钥证书管理,对称加密和非对称加密

    1. 对称加密

    对称加密需要使用标准命令enc;gpg也可以实现

    openssl enc
        -in <file> :指定要加密的文件存放的路径
        -out <file> :指定加密后的文件存放的路径
        -salt :自动观察入一个随机数作为文件内容加密,加密盐
        -e:加密,可以指定加密算法,不指定即使用默认加密算法
        -d:解密,可以指定解密算法,不指定即使用默认算法,但是要与加密用的算法一致
        -a / -base64: 使用base64位编码格式
        -k             passphrase is the next argument \指定密码口令
        -kfile         passphrase is the first line of the file argument \密码口令是指定文件中的第一行
        -md          the next argument is the md to use to create a key from a passphrase. See openssl dgst -h for list.
        -S             salt in hex is the next argument
        -K/-iv        key/iv in hex is the next argument
        -[pP]         print the iv/key (then exit if -P)
        -bufsize <n>   buffer size
        -nopad         disable standard block padding
        -engine e      use engine e, possibly a hardware device.
    

    具体解释内容可以查看帮助 man enc
    加密
    openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher
    解密
    openssl enc -d -des3 -a -salt -in testfile.cipher -out testfile

    2. 单向加密

    单向加密需要使用标准命令 dgst;还有其他工具md5sum,sha1sum,sha224sum,sha256sum...

           openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-c] [-d] [-hex] [-binary]  [-out filename] [-sign filename] [-keyform arg] [-passin arg] [-verify filename] [-prverify  filename] [-signature filename] [-hmac key] [file...]
    
            常用选项:[-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] ;指定一种加密算法
            示例:
                        openssl dgst -md5 testfile
                        md5sum  /Path/FIleName
    

    详细解释查看帮助 man dgst

    3. 生成密码

    生成密码需要用passwd命令;

    用法
        openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}
        -1:数字1,表示使用MD5 加密算法
        -salt string:加密的盐,最多8位
        -stdion:对标准输入的内容进行加密
        openssl passwd -1  -salt SALT(最多8位)
    

    帮助查看:man sslpasswd

    4. 生成随机数

    需要用到命令 rand

        openssl rand  -base64|-hex NUM
        NUM:表示出现字节数;
        -hex:为16位编码方式,每个字符为16进制,相当于4位二进制,出现字符数为 NUM*2
        -base64 :为64位编码方式
    

    man帮助查看: man sslrand

    5. 公钥加密

    使用命令rsautl;

         openssl rsautl [-in file] [-out file] [-inkey file] [-pubin] [-certin] [-sign] [-verify] [-encrypt] [-decrypt] [-pkcs] [-ssl] [-raw] [-hexdump] [-asn1parse]
    

    具体解释查看帮助:man rsautl

    6. 生成密钥对

    使用命令genrsa

        openssl genrsa [-out filename] [-passout arg] [-aes128] [-aes192] [-aes256]  [-camellia128] [-camellia192] [-camellia256] [-des] [-des3] [-idea] [-f4] [-3]  [-rand file(s)] [-engine id] [numbits]
    numbits :指定生成私钥的大小,默认2048,如下2048
    openssl genrsa -out test.key -des 2048 //密钥文件的权限需要控制,只给用户自己读写,umask值设置为 077
    
    解密使用命令rsa
        openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-sgckey] [-aes128] [-aes192] [-aes256]  [-camellia128] [-camellia192] [-camellia256] [-des] [-des3] [-idea] [-text]
            [-noout] [-modulus] [-check] [-pubin] [-pubout] [-RSAPublicKey_in]  [-RSAPublicKey_out] [-engine id]
    
    openssl rsa -in  test.key -out test2.key  //将加密的key解密
    

    详细解释查看:man genrsa 、man rsa

    四、创建私有CA

    证书申请及签署步骤

    • 生成申请请求
    • RA核验
    • CA签署
    • 获取证书

    使用openssl工具创建CA证书和申请证书时,需要检查openssl的配置文件 /etc/pki/tls/openssl.conf

        dir     = /etc/pki/CA      CA所有数据都放在这个目录下的
        certs       = $dir/certs        存放颁发出去的证书文件的目录
        crl_dir     = $dir/crl       证书吊销列表
        database    = $dir/index.txt      数据库,颁发了哪些证书等。。。信息,自己创建,自动更新
        unique_subject = no    填写的信息的唯一性,no不要求,两次填写一样也颁发证书        
        # Set to 'no' to allow creation of      
        # several ctificates with same subject.
        new_certs_dir   = $dir/newcerts     新证书存放的目录
    
        certificate = $dir/cacert.pem   # The CA certificate
        serial      = $dir/serial      下一个证书的编号,自己创建文件,自动更新
        crlnumber   = $dir/crlnumber  证书吊销列表编号
    
        crl     = $dir/crl.pem      证书吊销列表文件
        private_key = $dir/private/cakey.pem  CA的私钥文件
        RANDFILE    = $dir/private/.rand    随机数字文件
     一些默认的有效期 算法
         policy  =       策略匹配
        match  必须匹配       optional 不是必须的
    三种策略: 匹配  支持  可选
        匹配,指要求申请填写的信息跟CA设置信息必须一致;
        支持,指必须填写这项申请信息;
        可选,指可有可无
    

    ① 根据配置文件创建所需要的文件

        touch    /etc/pki/CA/index.txt  生成证书索引数据库文件
        echo  01 > /etc/pki/CA/serial  //指定第一个颁发证书的序列号
    

    ② CA自签证书

    1 . 生成密钥

         cd /etc/pki/CA
        (umask 066;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
    

    2 . 生成自签名证书

    openssl req -new -x509 -key    /etc/pki/CA/private/cakey.pem -days 7300 -out /etc/pki/CA/cacert.pem
            -new:生成新证书签署请求
            -509:专用于CA生成自签证书
            -key:生成请求时用到的私钥文件
            -days  NUM:证书的有效期限
            -out  /Path/FileName :证书保存路径
    

    ③ 颁发证书

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

    • 给web服务器生成私钥
        (umask 066;openssl genrsa -out /etc/pki/tls/private/test.key 2048)
    
    • 生成证书申请文件
        openssl req  -new -key  /etc/pki/tls/private/test.key  -days 365 -out  /etc/pki/tls/test.csr
    

    2 . 将证书请求传输给CA

    3 . CA签署证书,并将证书办法给请求者

        openssl ca -in /tmp/test.csr -out /etc/pki/CA/certs/test.crt -days 365
        //注意:默认国家、省、公司名称三项必须和CA一致
    

    4 . 查看证书中的信息

        openssl x509 -in /Path/Cert_FileName  -noout -text|issuer|subject|serial|dates
        openssl ca -status SERIAL  查看指定编号的证书状态
    

    ④ 吊销证书

    1 . 在客户端获取要吊销的证书的serial

        openssl x509 -in /Path/Cert_FileName -noout  -serial  -subject
    

    2 . 在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt 文件中的信息一致,吊销证书:

        openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
    

    3 . 指定第一个吊销证书的编号

        echo 01 > /etc/pki/CA/crlnumber
    

    注意:第一次更新证书吊销列表前,才需要执行

    4 . 更新证书吊销列表

        openssl ca -gencrl -out /etc/pki/CA/crl.pem
        
    //查看crl文件
        openssl crl -in /etc/pki/CA/crl.pem  -noout -text
    
    只有今天
  • 相关阅读:
    2.5(他们其实都是图)
    食物链POJ1182
    LG P6748 『MdOI R3』Fallen Lord
    LG P4199 万径人踪灭
    LG P1912 [NOI2009]诗人小G
    LG P4381 [IOI2008]Island
    2020/8/9 模拟赛 T3 表格
    UOJ422 【集训队作业2018】小Z的礼物
    CF913F Strongly Connected Tournament
    LG P5643 [PKUWC2018]随机游走
  • 原文地址:https://www.cnblogs.com/arnoLixi/p/10364960.html
Copyright © 2011-2022 走看看