https
自搭https证书
加密和签名
私钥和私钥都可以用来加密数据,相反用另一个解开,公钥加密数据,然后私钥解密的情况被称为加密解密,私钥加密数据,公钥解密一般被称为 签名和验证签名。
用公钥加密的数据只有它对应的私钥可以解开,也就是说只有拥有私钥的人可以解,其他人得到了也看不懂,这就是加密。相反,用私钥加密 的数据,用对应的公钥可以解开,这样就确保了数据只有拥有私钥的人可以发出。而不是其他人发的。这就是签名。
一般的公钥不会明文传输给别人,正常情况下会生产一个文件,然后将这个文件传输给他人用于加密。但是传输过程中如果有人恶意破坏,将你 的公钥换成了他的公钥,然后得到公钥的一方加密数据,不是他就可以用他自己的密钥解密看到数据了吗。
为了上述问题,我们引入了CA,CA确认公钥的原理也很简单,它将它自己的公钥发布给所有人,然后一个想要发布自己公钥的人可以将自己的 公钥和一些身份信息发给CA,CA用自己的密钥进行加密,这里也可以称为签名。然后这个包含了你的公钥和你的信息的文件就可以称为证书 文件了。这样一来所有得到一些公钥文件的人,通过CA的公钥解密了文件,如果正常解密那么机密后里面的信息一定是真的,因为加密方只 可能是CA,其他人没它的密钥啊。这样你解开公钥文件,看看里面的信息就知道这个是不是那个你需要用来加密的公钥了。
我们在自建https证书的时候首先需要创建的文件如下:
CA证书
- CA私钥。
- 用私钥生产CA请求,CA请求主要填写CA的基本信息。
- 签署证书,这要是将CA信息和公钥制作成证书。
server端证书
- server私钥
- server证书请求,证书请求主要填写server的基本信息。
- 签署证书,将server的基本信息和公钥制成证书。
具体步骤如下:
- 生产ca私钥:
openssl genrsa -out ca.key 1024
- 创建证书请求:
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 ← 电子邮箱,可随意填
接下来一路回车。
- 创建一个为期十年的根证书ca.crt:
openssl x509 -req -days 3650 -signkey ca.key -in ca.csr -out ca.crt
- 生产server私钥:
openssl genrsa -out server.key 1024
- 创建证书请求 :
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 ← 电子邮箱,可随意填
接下来一路回车。
- 创建一个为期十年的根证书server.crt:
openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650
- 确认证书
openssl verify -CAfile ca.crt server.crt
有了以上文件,我们就可以配置单项认证访问了。如果需要双向认证,还需要配置客户端的证书,和服务器端配置类似。
- 生产client私钥:
openssl genrsa -out client.key 1024
- 创建证书请求 :
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 ← 电子邮箱,可随意填
接下来一路回车。
- 创建一个为期十年的根证书server.crt:
openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650
- 确认证书
openssl verify -CAfile ca.crt client.crt
单向验证和双向验证
单项验证只有一对秘钥。通常服务器持有私钥,客户端持有公钥,只能够验证服务器身份,验证不了客户端身份。如下图:
双向验证有两对密钥,服务器和客户端都有一对密钥,既可以验证客户端的身份,也可以验证服务器的身份。
nginx配置双向认证主要有如下两个选项:
ssl_verify_client on;
ssl_client_certificate /etc/nginx/ssl/client.crt;