证书

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

 

 

 

原文地址:https://www.cnblogs.com/gavin11/p/14416927.html