zoukankan      html  css  js  c++  java
  • 一文读懂什么是CA证书/openssl模拟证书的生成过程

    //单纯使用公私钥进行加解密,会存在公钥被替换伪造的风险,无法判断公钥是否属于服务提供商。

    //所以,公钥需要通过CA机构的认证。

    //CA机构用自己的私钥,对服务提供商的相关信息及公钥进行加密生成数字证书。

    //在进行安全连接的时候,服务提供商将证书一同发给用户。

    //用户收到证书后,从他的CA认证机构下载证书/公钥,验证服务提供商证书的合法性。

    //最后,从证书中提取服务商提供的公钥,加、解密信息进行通信。

     

    名词解释:

        CA: Certificate Authority,证书中心/证书授权中心/电子认证服务机构,负责管理和签发证书的,受公众信任足够权威的第三方机构,检查证书持有者身份的合法性,并签发证书,以防证书被伪造或篡改。

        CA证书: CA颁发的证书, 或数字证书,包含证书拥有者的身份信息,CA机构签名,公钥等。

       

    证书编码:

        DER编码,二进制DER编码。

        PEM编码,用于ASCII(BASE64)编码,文件由 "-----BEGIN"开始,"-----END"结束。

     

    证书文件后缀:

        .pem(openssl默认,PEM编码的文件) .crt(Unix/LinuxDERPEM编码都可以) .cer(windows,二进制)  .der(二进制)

     

    秘钥文件:

        .key

     

    服务器证书申请文件/证书签名请求文件:

        .req  .csr

     

    使用openssl模拟秘钥证书的生成过程:

      openssl x509工具主要用于输出证书信息, 签署证书请求文件、自签署、转换证书格式等。它就像是一个完整的小型的CA工具箱。

      1.运营商私钥:

          模拟生成运营商的私钥:

          1.1.需要经常输入密码:

          openssl genrsa -des3 -out server_private.key 2048 会有输入密码的要求

          1.2.去除密码:

          openssl rsa -in server_private.key -out server_private.key

          1.3.无密码证书秘钥:

          openssl genrsa -out server_private.key 2048

        //1.4.生成公钥:

        //openssl rsa -in server_private.key -pubout -out server_public.key

     

      2.运营商向CA申请证书文件:

          模拟生成运营商 证书申请文件/证书签名请求文件  .req:

          2.1.openssl req -new -key server_private.key -out server.req

          会让输入Country Name CN; Common Name ip 也可以不填。

          #查看server.req

          2.2.openssl req -in server.req -text

     

      3.CA机构要有自己的私钥,为运营商签发证书:

          生成CA私钥:

          3.1.openssl genrsa -out ca_private.key 2048

     

      4.CA机构 也要向 更高级的CA机构 申请证书, 有了自己的证书 才能为运营商签发证书:

          生成 CA证书申请文件/证书签名请求文件 .req:

          4.1.openssl req -new -key ca_private.key  -out ca_request.req

          #查看ca_request.req

          4.2.openssl req -in ca_request.req -text

     

      5.CA机构获得证书:

          创建CA证书,用来给运营商的证书签名

          这个证书,本来应由更高级的CA用它的private key对这个证书请求进行签发,

          由于此时模拟的CA root CA,没有更高级的CA了,所以要进行自签发,用 自己的private key对 自己的证书请求 进行签发。

          5.1.openssl x509 -req -in ca_request.req -signkey ca_private.key -days 365 -out ca.pem

          #查看证书

          5.2.openssl x509 -in ca.pem -noout -text

     

      6.CA机构向运营商签发证书:

          CA用自己的CA证书ca.pem 和 私钥ca_private.key server.req运营商请求文件签名,生成运营商的证书:

          6.1.openssl x509 -req -in server.req -CA ca.pem -CAkey ca_private.key -days 365 -CAcreateserial -out server.pem

          #查看证书

          6.2.openssl x509 -in server.pem -noout -text

          #查看公钥

          6.3.openssl x509 -in server.pem -noout -pubkey

    #####################################################################################################################

      7.查看服务器证书的modulus和服务器私钥的modulus,应该一样:

          7.1.openssl x509 -in server.pem -noout -modulus

          7.2.openssl rsa -in server_private.key -noout -modulus

     

      8.用户访问https网站,服务器会用private key加密数据传输,同时会把证书传给用户,里面有public key信息,用于解密数据。

        用户使用公钥机密的时候,要确认此公钥是否是服务商的,是否是受信任的。

        用户从服务商证书中发现,其证书是由某CA签发的,从CA官网下载他的证书,发现它由 更高级CA签发 或者 是root证书,自签发的。

        这时就可以一级一级的验证证书的合法性,最终确认服务商的证书是否被信任。

        验证后就可以使用公钥解密信息,进行通信。

        openssl verify -CAfile ca.pem server.pem

     

      9. ls 出现以下文件:

          ca.pem  ca_private.key  ca_request.req  ca.srl  server.pem  server_private.key  server.req

     

      10.从证书导出公钥:

          openssl x509 -in server.pem -noout -pubkey -out server_public.key

     

      11.使用公钥加密,私钥解密:

          openssl rsautl -encrypt -in test.txt -inkey server_public.key -pubin -out test_encrypt.txt

          openssl rsautl -decrypt -in test_encrypt.txt -inkey server_private.key -out test_decrypt.txt

     

      12.不想浏览器发出警告,就导入ca.pem文件:

     

      13.查看证书内容:

          13.1.打印出证书的内容:openssl x509 -in server.pem -noout -text

          13.2.打印出证书的系列号:openssl x509 -in server.pem -noout -serial

          13.3.打印出证书的拥有者名字:openssl x509 -in server.pem -noout -subject

          13.4.RFC2253规定的格式打印出证书的拥有者名字:openssl x509 -in server.pem -noout -subject -nameopt RFC2253

          13.5.打印出证书的MD5特征参数:openssl x509 -in server.pem -noout -fingerprint

          13.6.打印出证书有效期:openssl x509 -in server.pem -noout -dates

          13.7.打印出证书公钥:openssl x509 -in server.pem -noout -pubkey

          13.7.验证证书的有效性:openssl verify -CAfile ca.pem server.pem

     

      14.证书秘钥要使用相同的编码格式

     

      15.证书格式转换:

        PEMDER格式:openssl x509 -inform pem -in server.pem -outform der -out server.der

     

        DERPEM格式:openssl x509 -inform der -in server.der -outform pem -out server.pem0

     

      16.错误:

        16.1. Common Name 最好是有效根域名(如 zeali.net ), 并且不能和后来服务器证书签署请求文件中填写的 Common Name 完全一样,否则会导致证书生成的时候出现 error 18 at 0 depth lookup:self signed certificate 错误

  • 相关阅读:
    基础数据类型之字符串str
    python编码基础知识
    python逻辑运算之and、or
    Django中消息中间键和form组件的运用
    Django中 cookies and session的使用
    JavaScript 正则制表符,单词边界,去空格
    paramiko堡垒机、线程及锁
    0911 Socket网络编程
    os.system和os.popen
    类高级方法、反射、异常、动态导入模块
  • 原文地址:https://www.cnblogs.com/frisk/p/12628159.html
Copyright © 2011-2022 走看看