zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Spring cloud父项目的建立
    Spring cloud简介
    ssm整合
    springboot-注解讲解
    springboot-helloworld实现
    Java线程池七个参数
    JVM性能调优
    SpringBoot的特性
    Spring与Spring Boot核心注解
    mybatis中#{} 和 ${}的区别
  • 原文地址:https://www.cnblogs.com/9host/p/13490803.html
Copyright © 2011-2022 走看看