linux CA及OpenSSL学习

一、了解及使用

1.搭建私有CA

生成私钥

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

生成自签证书

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;

为CA提供所需的目录及文件

mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
touch /etc/pki/CA/{serial,index.txt}
echo 01 > /etc/pki/CA/serial

自此,私有CA搭建完成

下面模拟测试使用私有CA为nginx web服务签发证书

用到证书的主机生成私钥

mkdir  /etc/nginx/ssl
cd  /etc/nginx/ssl
(umask  077; openssl  genrsa -out  /etc/httpd/ssl/nginx.key  2048)

生成证书签署请求

openssl  req  -new  -key  /etc/httpd/ssl/nginx.key  -out /etc/httpd/ssl/nginx.csr  -days  365

将请求通过可靠方式发送给CA主机

在CA主机上签署证书

openssl ca  -in  /tmp/nginx.csr  -out  /etc/pki/CA/certs/nginx.crt  -days  365

将证书传送回web服务器,在nginx配置文件中配置好相应配置即可。

客户端只需要将CA服务的公钥添加至信任的CA列表(/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem)中,即可正常使用。

2.生成证书签署请求CSR 

如果你想从证书颁发机构(certificate authority)(CA)那里获得 SSL 证书,你必须生成一个证书签署请求(certificate signing request)(CSR)。一个 CSR 主要是由一个密钥对的公钥和一些附加信息组成。当证书被签署时,这两部分都会被插入到证书中。

每当你生成一个 CSR 时,你会被提示提供有关证书的信息。这些信息被称为区分名称(Distinguised Name)(DN)。DN 中的一个重要字段是通用名称(Common Name)(CN),它应该是你打算使用证书的主机的完全合格域名(Fully Qualified Domain Name)(FQDN)。当创建 CSR 时,也可以通过命令行或文件传递信息来跳过交互式提示。

下面是一个 CSR 信息提示的例子:

Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:Brooklyn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company
Organizational Unit Name (eg, section) []:Technology Division
Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com #重点关注,如果为web请求,该处为指定主机名
Email Address []:

如果你想非交互式地回答 CSR 信息提示,你可以通过在任何请求 CSR 信息的 OpenSSL 命令中添加 -subj 选项来实现。这里是该选项的一个例子,使用上面代码块中显示的相同信息:

-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"
  • 以下介绍证书签署请求的多种生产方法
  •  生成一个私钥和CSR

这条命令从头开始创建一个 2048 位的私钥(domain.key)和一个 CSR(domain.csr):

openssl req 
       -newkey rsa:2048 -nodes -keyout domain.key 
       -out domain.csr

-newkey rsa:2048 指定密钥应该是 2048 位,使用 RSA 算法生成。
-nodes指定私钥没有用密码加密。
这里没有包含 -new 选项,而是隐含在其中,表示正在生成一个 CSR。
  • 从现有的私钥中生成一个 CSR

该命令基于现有的私钥(domain.key)创建一个新的 CSR(domain.csr):

openssl req 
       -key domain.key 
       -new -out domain.csr

-key 指定一个现有的私钥(domain.key),它将被用来生成一个新的 CSR。
-new 表示正在生成一个 CSR。
  • 从现有的证书和私钥生成 CSR

如果你想更新现有的证书,但由于某些原因,你或你的 CA 没有原始的 CSR,请使用这个方法。基本上可以省去重新输入 CSR 信息的麻烦,因为它是从现有证书中提取信息的。

该命令基于现有的证书(domain.crt)和私钥(domain.key)创建一个新的 CSR(domain.csr):

openssl x509 
       -in domain.crt 
       -signkey domain.key 
       -x509toreq -out domain.csr

-x509toreq 指定你使用一个 X509 证书来制作 CSR。

3.签发证书

如果你想使用 SSL 证书来确保服务的安全,但你不需要 CA 签名的证书,一个有效的(和免费的)解决方案是签署你自己的证书。

你可以自己签发的一种常见证书是自签证书(self-signed certificate)。自签证书是用自己的私钥签署的证书。自签证书和 CA 签名证书一样可以用来加密数据,但是你的用户会显示一个警告,说这个证书不被他们的计算机或浏览器信任。因此,只有当你不需要向用户证明你的服务身份时,才可以使用自签名证书(例如非生产或非公开服务器)。

  • 生成自签证书
openssl req 
       -newkey rsa:2048 -nodes -keyout domain.key 
       -x509 -days 365 -out domain.crt

-x509 告诉 req 子命令创建一个自签名的证书。
-days 365 选项指定证书的有效期为 365 天。
它会生成一个临时的 CSR,以收集与证书相关的信息。
  • 从现有私钥生成自签证书

这条命令可以从现有的私钥(domain.key)中创建一个自签证书(domain.crt):

openssl req 
       -key domain.key 
       -new 
       -x509 -days 365 -out domain.crt

-x509 告诉 req 子命令创建一个自签证书。
-days 365 选项指定证书的有效期为 365 天。
-new 启用 CSR 信息提问。
  • 从现有的私钥和 CSR 生成自签证书

这条命令将从现有的私钥(domain.key)和(domain.csr)中创建一个自签证书(domain.crt):

openssl x509 
       -signkey domain.key 
       -in domain.csr 
       -req -days 365 -out domain.crt
  • 使用自签证书签发
openssl x509 -req -days 730  -CA ca.crt -CAkey ca.key -CAserial root.srl -CAcreateserial -in client.csr -out client.crt

-req 固定格式,输入证书请求、签名和输出
-CA 选项指明用于被签名的csr证书
-CAkey 选项指明用于签名的密钥
-CAserial 指明序列号文件
-CAcreateserial 指明文件不存在时自动生成。

二、深入学习

1.OpenSSL通信过程

OpenSSL组成:
  libcrypto: 加密和解密算法库
  libssl: 通信安全实现
  openssl:用户空间命令行程序

SSL如何通信:

SSL Handshark
1、客户端生成随机数,发送自己支持的对称加密、单向加密算法、随机数及OpenSSL version;
2、服务端生成随机数,发送自己确认的对称加密、单向加密算法;并发送自己的证书;有必要时,需要索要客户端的证书;
3、客户端生成随机数,验证证书;发送编码变更通知(确认此次通信使用协商的算法)、随机数;客户端握手结束;
4、服务端接收客户端发来的第二个随机数,生成临时密钥;发送编码变更通知;服务端握手结束;
5、建立SSL连接

SSL通信

6、服务端对明文数据提取指纹,用自己的私钥加密指纹:签名;
7、服务端用生成的临时会话密钥加密整个数据;用对方的公钥加密会话密钥;
8、客户端用自己的私钥解密出会话密钥;用会话密钥解密出数据和加密后的特征码
9、客户端用对方的公钥解密出指纹;用协商的签名算法加密数据与解密的比较;

SSL会话的简化过程

1、客户端发送可供选择的加密方式,并向服务器请求证书

2、服务器端发送证书以及选定的加密方式给客户端

3、客户端取得证书并进行证书验证

  如果信任给其发证书的CA

    验证证书来源的合法性:用CA的公钥解密证书上数字签名

    验证证书的内容的合法性:完整性验证

    检查证书的有效期限

    检查证书是否被吊销

    证书中拥有者的名字,与访问的目标主机是否一致

4、客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换

5、服务用此密钥加密用户请求的资源,响应给客户端

如果要基于SSL通信就必须在可信的CA那里去获取一个证书,是不理想的;在私有网络中可以使用SSL协议实现工具openssl,完成创建私有CA,创建CA步骤为:

协议最基础依赖是基本算法,所以对基本算法应该有基本的了解

  • 对称加密

加密解密使用同一密钥
加密算法:

des: Data Encryption Standard,IBM公司安全实验室研发,成为事实上的标准;在2003年被美国100万的服务破解;
des3:3轮des加密,3个数量级(10^3倍)的des
aes:NIST,密钥长度(128bits, 192bits, 256bits),对于临时密钥没有必要使用
blowfish,twofish,idea,rc6,cast5

特性:

  1、加密、解密使用同一个密钥;2、将原始数据分割成为固定大小的块,逐个进行加密;

缺陷:

  1、密钥过多;2、密钥分发困难;

  • 非对称加密

加密解密使用一对儿密钥
私钥:private key,通过工具创建,使用者自己留存,必须保证其私密性;
公钥:public key,从私钥中提取产生;可公开给所有人;
算法:
DSA(Algorithm): 也被称为DSS(Digital Signature Standard):只能签名
RSA: 既能签名,又能加解密;

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

用途:

  数字签名:主要在于让接收方确认发送方的身份;

  密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方;

生成私钥:(umask 077; openssl genrsa -out private.key NUM_BITS)

从私钥中提取公钥:openssl rsa -in private.key -pubout
(): bash中特殊含义:在括号中运行的命令在当前shell的子shell进程中运行。若在子shell中定义的特性仅在子shell的生命周期中有效;
NUM_BITS:密钥长度:2^n;

  • 单向加密

提取数据的特征码;类似于指纹;能把人的指纹提取出来,可以把指纹还原成人吗?不行!
工具:openssl dgst, md5sum, sha#sum #=(1:160 224bits 384bits 512bits)
特性:
定长输出:输出长度相同,与数据大小无关;
雪崩效应:初始条件的微小改变,引起结果巨大变化;
功能:
完整性验证:因为这个世界上没有两片相同的树叶;

2.证书其他操作

 1)查看 CSR及证书

该命令允许你查看和验证纯文本的 CSR(domain.csr)的内容:

openssl req 
       -text -noout -verify 
       -in domain.csr

 -verify 验证请求上的签名

该命令允许你查看纯文本证书(domain.crt)的内容:

openssl x509 
       -text -noout 
       -in domain.crt

 2)验证证书由 CA 签署

使用此命令验证证书(domain.crt)是否由特定的 CA 证书(ca.crt)签署:

openssl verify 
       -verbose -CAFile ca.crt 
       domain.crt

 3)验证私钥是否与证书和 CSR 匹配

使用这些命令来验证私钥(domain.key)是否匹配证书(domain.crt)和 CSR(domain.csr):

openssl rsa  -noout -modulus -in domain.key | openssl md5
openssl x509 -noout -modulus -in domain.crt | openssl md5
openssl req  -noout -modulus -in domain.csr | openssl md5

如果每条命令的输出都是相同的,那么私钥、证书和 CSR 就极有可能是相关的。

 4)私钥的加密解密

这需要一个未加密的私钥(unencrypted.key),并输出它的加密版本(encrypted.key):

openssl rsa -des3 
       -in unencrypted.key 
       -out encrypted.key

这需要一个加密的私钥(encrypted.key),并输出一个解密的版本(decrypted.key):

openssl rsa 
       -in encrypted.key 
       -out decrypted.key

 5)吊销证书

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

openssl  x509  -in /etc/pki/CA/certs/httpd.crt  -noout  -serial  -subject

CA主机吊销证书

先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致;

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

其中的SERIAL要换成证书真正的序列号

生成吊销证书的吊销编号(第一次吊销证书时执行)

echo  01  > /etc/pki/CA/crlnumber

更新证书吊销列表

openssl  ca  -gencrl  -out  thisca.crl

 查看crl文件

openssl  crl  -in  /PATH/FROM/CRL_FILE.crl  -noout  -text
原文地址:https://www.cnblogs.com/9host/p/13490803.html