zhaoyu@home:~$

https

自搭https证书

加密和签名

私钥和私钥都可以用来加密数据,相反用另一个解开,公钥加密数据,然后私钥解密的情况被称为加密解密,私钥加密数据,公钥解密一般被称为 签名和验证签名。

用公钥加密的数据只有它对应的私钥可以解开,也就是说只有拥有私钥的人可以解,其他人得到了也看不懂,这就是加密。相反,用私钥加密 的数据,用对应的公钥可以解开,这样就确保了数据只有拥有私钥的人可以发出。而不是其他人发的。这就是签名。

一般的公钥不会明文传输给别人,正常情况下会生产一个文件,然后将这个文件传输给他人用于加密。但是传输过程中如果有人恶意破坏,将你 的公钥换成了他的公钥,然后得到公钥的一方加密数据,不是他就可以用他自己的密钥解密看到数据了吗。

为了上述问题,我们引入了CA,CA确认公钥的原理也很简单,它将它自己的公钥发布给所有人,然后一个想要发布自己公钥的人可以将自己的 公钥和一些身份信息发给CA,CA用自己的密钥进行加密,这里也可以称为签名。然后这个包含了你的公钥和你的信息的文件就可以称为证书 文件了。这样一来所有得到一些公钥文件的人,通过CA的公钥解密了文件,如果正常解密那么机密后里面的信息一定是真的,因为加密方只 可能是CA,其他人没它的密钥啊。这样你解开公钥文件,看看里面的信息就知道这个是不是那个你需要用来加密的公钥了。

我们在自建https证书的时候首先需要创建的文件如下:

CA证书

  • CA私钥。
  • 用私钥生产CA请求,CA请求主要填写CA的基本信息。
  • 签署证书,这要是将CA信息和公钥制作成证书。

server端证书

  • server私钥
  • server证书请求,证书请求主要填写server的基本信息。
  • 签署证书,将server的基本信息和公钥制成证书。

具体步骤如下:

  1. 生产ca私钥:
    openssl genrsa -out ca.key 1024
    
  2. 创建证书请求:
    openssl req -new -out ca.csr -key ca.key  
    

    显示如下:

    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 ← 国家代号,中国输入CN 
    State or Province Name (full name) [Some-State]:BeiJing ← 省的全名,拼音 
    Locality Name (eg, city) []:BeiJing ← 市的全名,拼音 
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompanyName ← 公司英文名 
    Organizational Unit Name (eg, section) []: ← 可以不输入 
    Common Name (eg, YOUR name) []:CA ← 填入CA名称
    Email Address []:admin@mycompany.com ← 电子邮箱,可随意填
    

    接下来一路回车。

  3. 创建一个为期十年的根证书ca.crt:
    openssl x509 -req -days 3650 -signkey ca.key -in ca.csr -out ca.crt
    
  4. 生产server私钥:
    openssl genrsa -out server.key 1024
    
  5. 创建证书请求 :
    openssl req -new -out server.csr -key server.key  
    

    显示如下:

    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 ← 国家代号,中国输入CN 
    State or Province Name (full name) [Some-State]:BeiJing ← 省的全名,拼音 
    Locality Name (eg, city) []:BeiJing ← 市的全名,拼音 
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompanyName ← 公司英文名 
    Organizational Unit Name (eg, section) []: ← 可以不输入 
    Common Name (eg, YOUR name) []:CA ← 填入Server名称
    Email Address []:admin@mycompany.com ← 电子邮箱,可随意填
    

    接下来一路回车。

  6. 创建一个为期十年的根证书server.crt:
    openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650
    
  7. 确认证书
    openssl verify -CAfile ca.crt server.crt
    

    有了以上文件,我们就可以配置单项认证访问了。如果需要双向认证,还需要配置客户端的证书,和服务器端配置类似。

  8. 生产client私钥:
    openssl genrsa -out client.key 1024
    
  9. 创建证书请求 :
    openssl req -new -out client.csr -key client.key  
    

    显示如下:

    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 ← 国家代号,中国输入CN 
    State or Province Name (full name) [Some-State]:BeiJing ← 省的全名,拼音 
    Locality Name (eg, city) []:BeiJing ← 市的全名,拼音 
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompanyName ← 公司英文名 
    Organizational Unit Name (eg, section) []: ← 可以不输入 
    Common Name (eg, YOUR name) []:CA ← 填入client名称
    Email Address []:admin@mycompany.com ← 电子邮箱,可随意填
    

    接下来一路回车。

  10. 创建一个为期十年的根证书server.crt:
    openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650
    
  11. 确认证书
    openssl verify -CAfile ca.crt client.crt
    

单向验证和双向验证

单项验证只有一对秘钥。通常服务器持有私钥,客户端持有公钥,只能够验证服务器身份,验证不了客户端身份。如下图:

双向验证有两对密钥,服务器和客户端都有一对密钥,既可以验证客户端的身份,也可以验证服务器的身份。

nginx配置双向认证主要有如下两个选项:

ssl_verify_client on;
ssl_client_certificate /etc/nginx/ssl/client.crt;