安全和加密——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
安全和加密——openssl及自建CA的更多相关文章
- openssl ca(签署和自建CA)
用于签署证书请求.生成吊销列表CRL以及维护已颁发证书列表和这些证书状态的数据库.因为一般人无需管理crl,所以本文只介绍openssl ca关于证书管理方面的功能. 证书请求文件使用CA的私钥签署之 ...
- 基于OpenSSL自建CA和颁发SSL证书
关于SSL/TLS介绍见文章 SSL/TLS原理详解.关于证书授权中心CA以及数字证书等概念,请移步 OpenSSL 与 SSL 数字证书概念贴 . openssl是一个开源程序的套件.这个套件有三个 ...
- 使用OpenSSL自建CA + Nginx配置HTTPS
Ubuntu 16.04(ECS),OpenSSL 1.0.2g 1 Mar 2016,Nginx 1.10.3 (Ubuntu), 浏览器:Chrome 67,Firefox 61,Edge 40 ...
- (13) openssl ca(签署和自建CA)
用于签署证书请求.生成吊销列表CRL以及维护已颁发证书列表和这些证书状态的数据库.因为一般人无需管理crl,所以本文只介绍openssl ca关于证书管理方面的功能. 证书请求文件使用CA的私钥签署之 ...
- Https、OpenSSL自建CA证书及签发证书、nginx单向认证、双向认证及使用Java访问
0.环境 本文的相关源码位于 https://github.com/dreamingodd/CA-generation-demo 必须安装nginx,必须安装openssl,(用apt-get upd ...
- openssl req(生成证书请求和自建CA)(转)
openssl req(生成证书请求和自建CA) 伪命令req大致有3个功能:生成证书请求文件.验证证书请求文件和创建根CA.由于openssl req命令选项较多,所以先各举几个例子,再集中 ...
- openssl 自建CA签发证书 网站https的ssl通信
<<COMMENTX509 文件扩展名 首先我们要理解文件的扩展名代表什么.DER.PEM.CRT和CER这些扩展名经常令人困惑.很多人错误地认为这些扩展名可以互相代替.尽管的确有时候有些 ...
- Openssl自建CA
查看证书相关指令 # 查看公钥数字证书 openssl x509 -in cacert.pem -noout -text # 查看私钥数字证书 openssl pkcs12 -in client-ce ...
- 数字证书的理解以及自建CA机构颁发证书
一.理解什么是数字证书 http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html 理解数字证书等概念,无数次想好好看 ...
随机推荐
- C - Distinct Substrings (模板)
https://vjudge.net/problem/SPOJ-DISUBSTR 有两种方式来求去除重读的子串 #include <bits/stdc++.h> using namespa ...
- mysql错误之errorcode 1215问题
1.此类问题出现时我们往往会迫不及待的去百度,但是问题偶尔也不是我们想的那样,比如我本次犯下的错误如下: 上图是我给表添加外键约束的时候的sql.下图是我建的表,问题出哪里了?原来是我的数据库根本没有 ...
- C# 字符串string
一.引言 在 C# 中,字符串是System.String类的一个引用类型.但与其他引用类型不同的是,C#将字符串视为一个基本类型,它可以申请为一个常量,也可以直接给它赋值. string关键字是Sy ...
- c++11 thread的学习
http://www.cnblogs.com/wxquare/p/6736202.html 还没开始 留个链接 使用c++11 thread支持实现 一个生产者消费者模型 下面是一个生产者消费者问题 ...
- Zeppelin的入门使用系列之使用Zeppelin来运行Spark SQL(四)
不多说,直接上干货! 前期博客 Zeppelin的入门使用系列之使用Zeppelin来创建临时表UserTable(三) 1. 运行年龄统计的Spark SQL (1) 输入Spark SQL时,必 ...
- js获取ISO8601规范时间
var d = new Date(); d.setHours(d.getHours(), d.getMinutes() - d.getTimezoneOffset()); console.log(d. ...
- 事务的隔离级别和mysql事务隔离级别修改
A事务做了操作 没有提交 对B事务来说 就等于没做 获取的都是之前的数据 但是 在A事务中查询的话 查到的都是操作之后的数据 没有提交的数据只有自己看得到,并没有update到数据库. 查看InnoD ...
- Java中的Validated验证
注意点:在使用@NotBlank时,必须与@Valid配着使用,不然不起作用(出现了很奇怪的现象,我第一次试的时候确实有这情况,但是第二次的时候这情况没了,所以这个说不准) @NotBlank 用在S ...
- AnyCAD OpenSource 版本下载和编译
下载: SVN下载地址:https://anycad.svn.codeplex.com/svn 或者直接下载:http://anycad.codeplex.com/SourceControl/late ...
- Java开发笔记(九十七)利用Runnable启动线程
前面介绍了线程的基本用法,按理说足够一般的场合使用了,只是每次开辟新线程,都得单独定义专门的线程类,着实开销不小.注意到新线程内部真正需要开发者重写的仅有run方法,其实就是一段代码块,分线程启动之后 ...