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

时间:2022-03-01 20:04:10

一、对称加密算法

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

特点

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

缺点

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

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

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

    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

随机推荐

  1. 【JMeter】ant&plus;jmeter生成html报告

    源博文来自于  http://my.oschina.net/hellotest/blog/517518 主要应用于接口的回归或者性能的简单查看功能.操作为先在jmeter中写好测试计划,保存为jmx文 ...

  2. jQuery中的阻止默认行为

    在很多元素中都存在默认行为,例如表单中的submit按钮,a标签等等.如果想要消除其中的默认行为,就需要一个事件event的方法来消除他们的默认行为. 这个方法就是event.preventDefau ...

  3. location对象的属性和方法应用&lpar;解析URL&rpar;

    本文将与大家分享下location对象使用属性和方法来解析URL的实例,感兴趣的朋友可以参考下,希望对你有所帮助   location对象提供了很多属性和方法用来解析URL. 复制代码代码如下: &l ...

  4. 技术福利:mysql数据库的基本命令汇总整理

    一.创建数据库: create database database_name: php中创建数据库的两种方法:(mysql_create_db(),mysql_query()) $conn = mys ...

  5. 并发库应用之九 &amp&semi; 到时计数器CountDownLatch应用

    申明:CountDownLatch好像倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当到达0时,所有等待者就开始执行. java.util.concurre ...

  6. 四十四、Linux 线程——线程同步之死锁以及线程和信号

    44.1 死锁 死锁: 两个线程试图同时占有两个资源,并按不同的次序锁定相应的共享资源 解决方式: 按相同的次序锁定相应的共享资源 使用函数 pthread_mutex_trylock(),它是函数 ...

  7. SecureCRT或XShell软件

    SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件. Xshell 是一个强大的安全终端模拟软件,它支持SSH1 ...

  8. Dispatch Queue 之内存中常驻的几个结构

    _dispatch_main_q 也就是主要主队列,一定运行在主线程里. // 6618342 Contact the team that owns the Instrument DTrace pro ...

  9. java IO流知识点总结

    I/O类库中使用“流”这个抽象概念.Java对设备中数据的操作是通过流的方式.表示任何有能力产出数据的数据源对象,或者是有能力接受数据的接收端对象.“流”屏蔽了实际的I/O设备中处理数据的细节.IO流 ...

  10. WPF系列之一:基于并行任务和MVVM创建响应灵敏和数据驱动的UI

    在利用WPF创建桌面应用程序的界面时,经常使用MVVM的设计模式,以减少UI层与逻辑层的代码耦合度. 在MVVM的设计中,最主要的方法和技术是UI中的控件利用Binding来和逻辑层(ViewMode ...