一、实验背景
要保证Web浏览器到服务器的安全连接,HTTPS几乎是唯一选择。
HTTPS其实就是HTTP over SSL,也就是让HTTP连接建立在SSL安全连接之上。
当由于某种原因(如:不想通过CA购买证书,或者仅是用于测试等情况),无法正常获取CA签发的证书。
这时可以生成一个自签名证书。使用这个自签名证书的时候,会在客户端浏览器报一个错误,签名证书授权未知或不可信(signing certificate authority is unknown and not trusted.)。
二、自签名分类
三、自签名和私有CA签名测试
自签名证书
# vim self-signed.sh
#####################################################################
#!/bin/bash
openssl req -x509 -nodes \
-sha512 \
-newkey rsa:2048 \
-days 3650 \
-subj "/C=CN/ST=Gunagdong/L=Shenzhen/O=Test/OU=Test/CN=www.example.com" \
-keyout self-signed.key \
-out self-signed.crt
##########################################################################
# sh self-signed.sh
# openssl x509 -noout -text -in self-signed.crt
自签名证书的Issuer和Subject是相同的。
私有CA签名证书
# vim ca-self-signed.sh
###################################################
#!/bin/bash
openssl req -x509 \
-nodes \
-newkey rsa:4096 \
-days 3650 \
-sha256 \
-subj "/C=CN/ST=Gunagdong/L=Shenzhen/O=CA/OU=CA/CN=www.ca.com" \
-keyout ca.key \
-out ca.crt
openssl req \
-nodes \
-newkey rsa:4096 \
-sha256 \
-keyout harbor.key \
-subj "/C=CN/ST=Gunagdong/L=Shenzhen/O=Test/OU=Test/CN=www.harbor.com" \
-out harbor.csr
echo "
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName=IP:192.168.1.105,DNS:www.harbor.com
" > extfile.cnf
openssl x509 -req \
-days 3650 \
-in harbor.csr \
-CA ca.crt \
-CAkey ca.key \
-CAcreateserial \
-extfile extfile.cnf \
-out harbor.crt
###################################################
# sh ca-self-signed.sh
# openssl x509 -noout -text -in harbor.crt
私有CA签名证书的Issuer和Subject是不同的。
四、数字证书(Certificate)
在HTTPS的传输过程中,有一个非常关键的角色–数字证书,那什么是数字证书?又有什么作用呢?
所谓数字证书,是一种用于电脑的身份识别机制。由数字证书颁发机构(CA)对使用私钥创建的签名请求文件做的签名(盖章),表示CA结构对证书持有者的认可。
数字证书拥有以下几个优点:
使用数字证书能够提高用户的可信度;
数字证书中的公钥,能够与服务端的私钥配对使用,实现数据传输过程中的加密和解密;
在证认使用者身份期间,使用者的敏感个人数据并不会被传输至证书持有者的网络系统上;
五、证书信息查看
查看私钥信息
# openssl rsa -noout -text -in server.key
查看签名请求信息
# openssl req -noout -text -in server.csr
查看ca的私钥信息
# openssl rsa -noout -text -in ca.key
查看证书信息
openssl x509 -noout -text -in ca.crt
查看一个证书吊销列表信息
# openssl crl -text -in xx.crl
查看一个证书的额外信息
# openssl x509 -purpose -in cacert.pem
从一个私钥里面提取出公钥
# openssl rsa -in key.pem -pubout -out pubkey.pem
从生成的证书文件中提取出公钥文件
# openssl x509 -outform PEM -in self-signed.crt -pubkey -noout > self-signed.pub
查看一个公钥的信息
openssl rsa -noout -text -pubin -in apache.pub
验证一个证书是否是某一个CA签发
# openssl verify -CAfile /path/to/ca.crt apache.crt
模拟一个ssl客户端访问ssl服务器
# openssl s_client -connect 192.168.1.105:8443 < /dev/null
如果服务端要求客户端提供证书 则在加上 -cert 和-key参数 比如 :
# openssl s_client -connect 192.168.1.105:8443 -cert /path/to/client.crt -key /path/to/client.key
六、参考
Rancher 自签名ssl证书
https://www.rancher.cn/docs/rancher/v2.x/cn/install-prepare/self-signed-ssl
自签名证书和私有CA签名的证书的区别
https://blog.csdn.net/sdcxyz/article/details/47220129
x509: cannot validate certificate for xx.xx.xx.xx because it doesn't contain any IP SANs
https://stackoverflow.com/questions/54622879/cannot-validate-certificate-for-ip-address-because-it-doesnt-contain-any-ip-s
x509: certificate signed by unknown authority
https://stackoverflow.com/questions/50768317/docker-pull-certificate-signed-by-unknown-authority
使用OpenSSL生成自签名证书
https://www.lotlab.org/2018/03/28/%E4%BD%BF%E7%94%A8openssl%E7%94%9F%E6%88%90%E8%87%AA%E7%AD%BE%E5%90%8D%E8%AF%81%E4%B9%A6
使用 openssl 制作一个包含 SAN(Subject Alternative Name)的证书
http://juke.outofmemory.cn/entry/211951
关于base64编码
https://blog.csdn.net/weixin_39460408/article/details/81835337
https://blog.csdn.net/qq_20553613/article/details/95756154
https://blog.csdn.net/wo541075754/article/details/81734770