安全和加密——openssl及自建CA

摘要:
1、 对称加密算法对称加密:加密和解密采用相同的密钥特征加密和解密使用相同的密钥,效率高;将原始数据分成固定大小的块,并逐一加密。钥匙太多了。需要分发密钥。无法确认数据源。1.使用gpg实现对称加密,并使用对称加密文件gpg-cfile生成file.gpg,以在另一台主机上解密gpg-offile-dfile.gpg。2.使用gpg工具在主机B上实现公钥加密,使用公钥加密,在主机A上解密,并在主机A生成公钥对gp
一、对称加密算法

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

特点

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

缺点

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

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
安全和加密——openssl及自建CA第1张

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
安全和加密——openssl及自建CA第2张

    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

免责声明:文章转载自《安全和加密——openssl及自建CA》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用selenium的方式获取网页中图片的链接和网页的链接,来判断是否是死链(二)【Window 7】解决Win7远程桌面无法全屏的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

全面解决.Net与Java互通时的RSA加解密问题,使用PEM格式的密钥文件

一、缘由 RSA是一种常用的非对称加密算法。所以有时需要在不用编程语言中分别使用RSA的加密、解密。例如用Java做后台服务端,用C#开发桌面的客户端软件时。由于 .Net、Java 的RSA类库存在很多细节区别,尤其是它们支持的密钥格式不同。导致容易出现“我加密的数据对方不能解密,对方加密的数据我不能解密,但是自身是可以正常加密解密”等情况。虽然网上已经...

JAVA的非对称加密算法RSA——加密和解密

原文转载至:https://www.cnblogs.com/OnlyCT/p/6586856.html 第一部分:RSA算法原理与加密解密 一、RSA加密过程简述 A和B进行加密通信时,B首先要生成一对密钥。一个是公钥,给A,B自己持有私钥。A使用B的公钥加密要加密发送的内容,然后B在通过自己的私钥解密内容。 二、RSA加密算法基础 整个RSA加密算法的...

TLS1.2协议设计原理

目录 前言 为什么需要TLS协议 发展历史 协议设计目标 记录协议 握手步骤 握手协议 Hello Request Client Hello Server Hello Certificate Server Key Exchange Certificate Request Server Hello Done Client Certificate C...

pytorch和tensorflow的爱恨情仇之参数初始化

pytorch和tensorflow的爱恨情仇之基本数据类型 pytorch和tensorflow的爱恨情仇之张量   pytorch和tensorflow的爱恨情仇之定义可训练的参数 pytorch版本:1.6.0 tensorflow版本:1.15.0 关于参数初始化,主要的就是一些数学中的分布,比如正态分布、均匀分布等等。 1、pytorch (1)自...

ssh密钥登录

方法一: 使用下例中ssky-keygen和ssh-copy-id,仅需通过3个步骤的简单设置而无需输入密码就能登录远程Linux主机。 ssh-keygen 创建公钥和密钥。 ssh-copy-id 把本地主机的公钥复制到远程主机的authorized_keys文件上。ssh-copy-id 也会给远程主机的用户主目录(home)和~/.ssh, 和~/...

多密钥ssh-key生成与管理

由于 git 大文件用 http 方式难以传输,必须使用 ssh-key,而 ssh-key 又生成了好多个。最近在各种折腾 ssh,公钥私钥上花费了很多时间,现将一些问题总结如下。系统为 Mac/Linux。 密钥的原理 SSH之所以能够保证安全,原因在于它采用了公钥加密。 整个ssh密码登录过程是这样的: 用户向远程主机发登录请求:ssh user@...