zoukankan      html  css  js  c++  java
  • 证书

    SSL/TLS 认证分为 单向认证双向认证

    单向认证: 只是客户端对服务端的身份验证, 访问https网站大部分都是单向认证

    双向认证: 客户端和服务端互相进行身份验证, 使用私钥访问银行的https网站是双向认证

    双向 TLS 认证,即客户端和服务器端都需要验证对方的身份信息。在两个组件进行双向认证时,会涉及到下面这些证书相关的文件

    • 服务器端证书:服务器用于证明自身身份的数字证书,里面主要包含了服务器端的公钥以及服务器的身份信息。
    • 服务器端私钥:服务器端证书中包含的公钥所对应的私钥。公钥和私钥是成对使用的,在进行 TLS 验证时,服务器使用该私钥来向客户端证明自己是服务器端证书的拥有者。
    • 客户端证书:客户端用于证明自身身份的数字证书,里面主要包含了客户端的公钥以及客户端的身份信息。
    • 客户端私钥:客户端证书中包含的公钥所对应的私钥,同理,客户端使用该私钥来向服务器端证明自己是客户端证书的拥有者。
    • 服务器端 CA 根证书:签发服务器端证书的 CA 根证书,客户端使用该 CA 根证书来验证服务器端证书的合法性。
    • 客户端端 CA 根证书:签发客户端证书的 CA 根证书,服务器端使用该 CA 根证书来验证客户端证书的合法性。

    证书类型:

    client certificate  用于通过服务器验证客户端

    server certificate     由服务器使用,并由客户端验证服务器身份

    peer certificate        由集群成员使用,如etcd集群的成员使用,供彼此之间的通讯使用

    $ cat << EOF > ca-config.json
    
    {
        "signing": {
            "default": {
                "expiry": "43800h"
            },
            "profiles": {
                "server": {
                    "expiry": "43800h",
                    "usages": [
                        "signing",
                        "key encipherment",
                        "server auth"
                    ]
                },
                "client": {
                    "expiry": "43800h",
                    "usages": [
                        "signing",
                        "key encipherment",
                        "client auth"
                    ]
                },
                "peer": {
                    "expiry": "43800h",
                    "usages": [
                        "signing",
                        "key encipherment",
                        "server auth",
                        "client auth"
                    ]
                }
            }
        }
    }
    
    $ cat << EOF > ca-csr.json
    
    {
        "CN": "My own CA",
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "US",
                "L": "CA",
                "O": "My Company Name",
                "ST": "San Francisco",
                "OU": "Org Unit 1",
                "OU": "Org Unit 2"
            }
        ]
    }
    
    生成 CA 证书:
    
    $ cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
    
    将会生成以下几个文件:
    
    ca-key.pem
    ca.csr
    ca.pem

    一、自签证书

    pem、key:私钥文件,对数据进行加密解密
    csr:证书签名请求文件,将其提交给证书颁发机构(ca、CA)对证书签名
    crt:由证书颁发机构(ca、CA)签名后的证书或者自签名证书,该证书包含证书持有人的信息、持有人的公钥以及签署者的签名等信息

    生成自签名证书的基本步骤如下:

    1> 生成私钥(Private Key) 文件

    2> 生成证书(签名)请求文件CSR,需要使用私钥

    3> 生成自签证书(Certificate)文件,需要使用证书请求文件和私钥文件

    openssl自签证书

    a> 生成RSA私钥(Private Key)

    RSA私钥中也包含公钥。

    openssl genrsa [<options>] <bit-length>
    
      options:
        [-des3 | -aes128 | ...]                               #指定用于保护私钥的对称加密算法
        [-passout pass:<password> | -passout file:<path-name> | -passout env:<variable> | -passout fd:<file-descriptor> | -passout stdin]                                    #指定输出私钥的加密密码来源
        -out <private-key-file>                               #输出私钥到文件,不指定则输出到stdout

    查看私钥命令

    openssl rsa -noout -text -in ca.key

    例如:

    1 生成一个长度为2048位的RSA私钥(含公钥):

    openssl genrsa -out ca.key 2048

    2 生成一个长度位2048位,并使用des3加密算法的私钥,密码为:1234

    openssl genrsa -des3 -passout pass:1234 -out ca.key

    3生成对应私钥的公钥文件

    openssl rsa -in private.key -pubout -out public.key

     

    b>使用私钥生成证书签名请求(Certificate Signing Request,CSR)

    openssl req
    
        -new                                  #生成新的证书签名请求
        -key <private-key>                    #在步骤1中生成的私钥
        [-passin pass:<password> | -passin file:<path-name> | -passin env:<variable> | -passin fd:<file-descriptor> | -passin stdin]                         #指定所用私钥的密码
        -subj '/C=<country>/ST=<province>/L=<locality>/O=<organiation>/OU=<organiation-unit>/CN=<common-name>/emailAddress=<email>'
        -out <csr-file>                       #输出证书请求到文件,不指定则输出到stdout

    查看证书请求

    openssl req -noout -text -in cert.csr

    例如:

    选项-subj指定证书所有人主体信息,如果证书用于网站,则其中的CN域必须指定为网站域名,其他域不是必填项。以下为*.wp.info生成证书签名请求
    
    openssl req -new -key ca.key -subj '/C=CN/ST=ZheJiang/L=HangZhou/O=CompanyName/OU=DepartmentName/CN=*.wp.info-out wp.info.csr

    为*.wp.info生成证书签名请求,同时指定之前生成私钥时所使用密码:

    openssl req -new -key ca.key -passin pass:1234 -subj '/C=CN/ST=ZheJiang/L=HangZhou/O=CompanyName/OU=DepartmentName/CN=
    *.wp.info'  -out wp.info.csr

     

    c>生成自签名证书

    区别:

    >>openssl req –x509  需要使用-key指定私钥

    >>openssl x509 –req   需要使用-signkey指定私钥

    1、openssl req –x509 为证书请求文件签名并生成证书

    openssl req
        -x509                                       #生成自签名证书,而不是证书请求
        -days <days>                                #指定证书有效期天数
        -md2 | -md5 | -sha1 | -sha256 | -sha512     #签名所用哈希算法
        -key <private-key-file>
        -in <csr-file>
        -out <certificate-file>

    查看证书信息

    openssl x509 -noout -text -in cacert.pem

    例如:

    openssl req -x509 -days 365 -sha256 -key ca.key -in wp.info.csr -out wp.info.crt

    2、openssl x509 –req

    openssl x509
        -req                                        #输入内容为证书请求,而不是证书
        -days <days>                                #指定证书有效期天数
        -md2 | -md5 | -sha1 | -sha256 | -sha512     #签名所用哈希算法
        -signkey <private-key-file>
        -in <csr-file>
        -out <certificate-file>                     #输出证书到文件,不指定则输出到stdout

    例如:

    openssl x509 -req -days 365 -sha256 -signkey ca.key -in wp.info.csr -out wp.info.crt

    d>验证自签证书

    openssl verify -CAfile ca.crt server.crt

     

    自签CA根证书

    1.1、生成CA私钥(ca.key)

     

    openssl genrsa -out ca.key 2048 #生成一个长度为2048位的RSA私钥

    openssl genrsa –des3 –passout pass:1234 -out ca.key #生成长度为2048位,并且使用des3加密算法的私钥,密码为:1234


    genrsa:使用RSA算法生成私钥
    -out:输出文件路径
    2048:私钥长度

    [-des3 | -aes128 | ...] #指定用于保护私钥的对称加密算
    输入完命令会让你输入两遍私钥文件的密码

     

     

    1.2、ca签发根证书请求文件(自签发根证书请求文件)

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

    -subj '/C=<country>/ST=<province>/L=<locality>/O=<organiation>/OU=<organiation-unit>/CN=<common-name>/emailAddress=<email>'

    openssl req -new -key server.key -passin pass:1234 -subj '/C=CN/ST=Shanghai/L=Shanghai/O=CompanyName/OU=DepartmentName/CN=*.wp.info' -out server.csr #为*.wp.info域名生成证书签名请求,同时需要指定之前生成私钥时所使用的密码


    req:执行证书签发命令
    -new:新的证书签发请求
    -key:指定私钥文件的路径
    -out:csr文件的输出路径
    输入完命令会让你输入ca根证书私钥的密码并填写一些信息,如下所示:

    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.


    Country Name (2 letter code) [AU]:cn 【国家代码两个字母可为空,ca、server、client要一致】
    State or Province Name (full name) [Some-State]:【省份,ca、server、client要一致】
    Locality Name (eg, city) []:【城市】
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:【公司名,ca、server、client要一致】
    Organizational Unit Name (eg, section) []:【组织名】
    Common Name (e.g. server FQDN or YOUR name) []:【不可为空,全限定域名或名字】
    Email Address []:【邮箱】

    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:【输入密码】
    An optional company name []:【可选的公司名】

    1.3、生成自签名CA证书(ca.crt)

    openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt

    x509:用于自签名证书,生成x509格式的证书
    -req:请求签名
    -days:证书有效期
    -signkey:证书签发的私钥
    -in:证书请求文件,有效的文件路径
    -out:ca签名后的证书输出路径

    或者:

    openssl req -new -x509 -key ca.key -out ca.crt -days 3650

    根据自签CA根证书制作Server端证书

            使用以上ca证书签发

    2.1 生成server端私钥

    openssl genrsa  -out server.key 2048

    2.2 根据server私钥生成server端证书请求文件

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

    openssl req -new -key server.key -out server.csr -subj '/C=CN/ST=Shanghai/L=Shanghai/O=CompanyName/OU=DepartmentName/CN=www.wp.info'
    填写和ca根证书请求文件一样的信息,两者要保持一样

    2.3使用CA根证书为server端签发证书

    openssl x509  -req -in server.csr -out server.crt -signkey server.key -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650

    -in:输入证书签名请求文件 -out:签名后的证书输出路径 -cert:ca根证书 -keyfile:ca根证书私钥文件 -config:配置文件

    2.3验证自签server证书

    openssl verify -CAfile ca.crt server.crt

    2.4 使用server证书测试单向认证

    >终端1

    [root@master1 ssl]# openssl s_server -accept 10000 -key server.key -cert server.crt
    Using default temp DH parameters
    ACCEPT

    >终端2

    openssl s_client -connect localhost:10000
    连接成功后在任意一个窗口输入字符串会传输到另外一个窗口回显。

    根据自签CA根证书制作client端证书

    3.1生成client端私钥

    openssl genrsa -out client.key 2048

    3.2使用client私钥生成lclient端证书请求文件

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

    3.3使用client证书请求文件生成自签名证书

    openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650  

    3.4验证自签client证书

    openssl verify -CAfile ca.crt client.crt

    4.4使用server证书和客户端证书做双向测试

    >终端1

    [root@master1 ssl]# openssl s_server -accept 10000 -key server.key -cert server.crt -Verify 5
    verify depth is 5, must return a certificate
    Using default temp DH parameters
    ACCEPT

    >终端2

    openssl s_client -connect localhost:10000 -cert client.crt -key client.key
    通过控制台可以双向发送消息回显

     

    其他openssl操作

      open 命令选项
    
        -text       解析原始内容,可以理解的输出方式
     
        -noout        不输出原始内容
    
        -in        指定输入内容的来源
    
       -out       指定输出到文件,不指定则输出到stdout

    3.1 查看证书签名请求信息

    openssl req -text -noout -in <证书请求文件> 
    
    openssl req -text -noout -in server.csr

    3.2 使用openssl x509命令查看证书信息

    openssl x509 -text -noout -in <证书文件>
    
    openssl x509 -text -noout -in server.crt

    3.3 使用openssl rsa命令查看私钥信息

    openssl rsa -text -noout -in <私钥文件> openssl rsa -text -noout -in server.key

    3.4 生成pem格式的公钥

    openssl x509 -in server.crt -out server.pem -outform PEM
    

    3.5 验证server证书

    openssl verify -CAfile ca.crt server.crt

     

     

     

  • 相关阅读:
    Ubuntu 或 UbuntuKyLin14.04 Unity桌面側边栏和顶层菜单条显示异常解决方法
    关于程序猿的几个阶段!
    独立开发人员低成本推广APP的18条技巧
    Effective C++ 条款27
    OpensStack instance debug
    OpenStackCLI调试及术语识记
    OpenStack术语名词及问题调试
    apacheOfbiz
    obiz
    How to run OFBiz as a Service on linux
  • 原文地址:https://www.cnblogs.com/gavin11/p/14416927.html
Copyright © 2011-2022 走看看