Skip to content

Commit e189ee1

Browse files
committed
新增两篇数字证书的文章
1 parent 95c7bac commit e189ee1

4 files changed

Lines changed: 1031 additions & 321 deletions

File tree

source/c10/c10_08.md

Lines changed: 7 additions & 321 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
# 10.8 终于把 HTTPS数字证书给整明白了
1+
# 10.8 数字证书、签名到底是什么?
2+
3+
![](http://image.iswbm.com/20200602135014.png)
24

35
我们都知道 HTTP 协议都是明文传输内容,为了保证数据传输的安全,HTTPS 协议就应运而生了,但它其实并不是一个全新的协议,而是HTTP 协议基本之上 再加上SSL/TLS 协议。
46

@@ -334,313 +336,7 @@ LQfiTStBBU6t/+mnDyij+XreGQ==
334336

335337

336338

337-
## 5. 数字证书如何制作或申请?
338-
339-
说到这里,到底数字证书是从哪里来的呢?
340-
341-
数字证书,你可以自己制作,也可以向CA权威机构申请。
342-
343-
二者的区别是:
344-
345-
1. 自己颁发的证书,需要客户端验证通过,可能需要客户端自己安装上受信任的根证书。
346-
2. 向权威的数字证书认证机构申请,由于这些机构在网民的电脑里都有相应的根证书,且这些机构是可信任的。
347-
348-
### 自己制作的证书
349-
350-
自签名脚本:create_self-signed-cert.sh
351-
352-
```shell
353-
#!/bin/bash -e
354-
355-
help ()
356-
{
357-
echo ' ================================================================ '
358-
echo ' --ssl-domain: 生成ssl证书需要的主域名,如不指定则默认为www.rancher.local,如果是ip访问服务,则可忽略;'
359-
echo ' --ssl-trusted-ip: 一般ssl证书只信任域名的访问请求,有时候需要使用ip去访问server,那么需要给ssl证书添加扩展IP,多个IP用逗号隔开;'
360-
echo ' --ssl-trusted-domain: 如果想多个域名访问,则添加扩展域名(SSL_TRUSTED_DOMAIN),多个扩展域名用逗号隔开;'
361-
echo ' --ssl-size: ssl加密位数,默认2048;'
362-
echo ' --ssl-cn: 国家代码(2个字母的代号),默认CN;'
363-
echo ' 使用示例:'
364-
echo ' ./create_self-signed-cert.sh --ssl-domain=www.test.com --ssl-trusted-domain=www.test2.com \ '
365-
echo ' --ssl-trusted-ip=1.1.1.1,2.2.2.2,3.3.3.3 --ssl-size=2048 --ssl-date=3650'
366-
echo ' ================================================================'
367-
}
368-
369-
case "$1" in
370-
-h|--help) help; exit;;
371-
esac
372-
373-
if [[ $1 == '' ]];then
374-
help;
375-
exit;
376-
fi
377-
378-
CMDOPTS="$*"
379-
for OPTS in $CMDOPTS;
380-
do
381-
key=$(echo ${OPTS} | awk -F"=" '{print $1}' )
382-
value=$(echo ${OPTS} | awk -F"=" '{print $2}' )
383-
case "$key" in
384-
--ssl-domain) SSL_DOMAIN=$value ;;
385-
--ssl-trusted-ip) SSL_TRUSTED_IP=$value ;;
386-
--ssl-trusted-domain) SSL_TRUSTED_DOMAIN=$value ;;
387-
--ssl-size) SSL_SIZE=$value ;;
388-
--ssl-date) SSL_DATE=$value ;;
389-
--ca-date) CA_DATE=$value ;;
390-
--ssl-cn) CN=$value ;;
391-
esac
392-
done
393-
394-
# CA相关配置
395-
CA_DATE=${CA_DATE:-3650}
396-
CA_KEY=${CA_KEY:-cakey.pem}
397-
CA_CERT=${CA_CERT:-cacerts.pem}
398-
CA_DOMAIN=cattle-ca
399-
400-
# ssl相关配置
401-
SSL_CONFIG=${SSL_CONFIG:-$PWD/openssl.cnf}
402-
SSL_DOMAIN=${SSL_DOMAIN:-'www.rancher.local'}
403-
SSL_DATE=${SSL_DATE:-3650}
404-
SSL_SIZE=${SSL_SIZE:-2048}
405-
406-
## 国家代码(2个字母的代号),默认CN;
407-
CN=${CN:-CN}
408-
409-
SSL_KEY=$SSL_DOMAIN.key
410-
SSL_CSR=$SSL_DOMAIN.csr
411-
SSL_CERT=$SSL_DOMAIN.crt
412-
413-
echo -e "\033[32m ---------------------------- \033[0m"
414-
echo -e "\033[32m | 生成 SSL Cert | \033[0m"
415-
echo -e "\033[32m ---------------------------- \033[0m"
416-
417-
if [[ -e ./${CA_KEY} ]]; then
418-
echo -e "\033[32m ====> 1. 发现已存在CA私钥,备份"${CA_KEY}""${CA_KEY}"-bak,然后重新创建 \033[0m"
419-
mv ${CA_KEY} "${CA_KEY}"-bak
420-
openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
421-
else
422-
echo -e "\033[32m ====> 1. 生成新的CA私钥 ${CA_KEY} \033[0m"
423-
openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
424-
fi
425-
426-
if [[ -e ./${CA_CERT} ]]; then
427-
echo -e "\033[32m ====> 2. 发现已存在CA证书,先备份"${CA_CERT}""${CA_CERT}"-bak,然后重新创建 \033[0m"
428-
mv ${CA_CERT} "${CA_CERT}"-bak
429-
openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
430-
else
431-
echo -e "\033[32m ====> 2. 生成新的CA证书 ${CA_CERT} \033[0m"
432-
openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
433-
fi
434-
435-
echo -e "\033[32m ====> 3. 生成Openssl配置文件 ${SSL_CONFIG} \033[0m"
436-
cat > ${SSL_CONFIG} <<EOM
437-
[req]
438-
req_extensions = v3_req
439-
distinguished_name = req_distinguished_name
440-
[req_distinguished_name]
441-
[ v3_req ]
442-
basicConstraints = CA:FALSE
443-
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
444-
extendedKeyUsage = clientAuth, serverAuth
445-
EOM
446-
447-
if [[ -n ${SSL_TRUSTED_IP} || -n ${SSL_TRUSTED_DOMAIN} ]]; then
448-
cat >> ${SSL_CONFIG} <<EOM
449-
subjectAltName = @alt_names
450-
[alt_names]
451-
EOM
452-
IFS=","
453-
dns=(${SSL_TRUSTED_DOMAIN})
454-
dns+=(${SSL_DOMAIN})
455-
for i in "${!dns[@]}"; do
456-
echo DNS.$((i+1)) = ${dns[$i]} >> ${SSL_CONFIG}
457-
done
458-
459-
if [[ -n ${SSL_TRUSTED_IP} ]]; then
460-
ip=(${SSL_TRUSTED_IP})
461-
for i in "${!ip[@]}"; do
462-
echo IP.$((i+1)) = ${ip[$i]} >> ${SSL_CONFIG}
463-
done
464-
fi
465-
fi
466-
467-
echo -e "\033[32m ====> 4. 生成服务SSL KEY ${SSL_KEY} \033[0m"
468-
openssl genrsa -out ${SSL_KEY} ${SSL_SIZE}
469-
470-
echo -e "\033[32m ====> 5. 生成服务SSL CSR ${SSL_CSR} \033[0m"
471-
openssl req -sha256 -new -key ${SSL_KEY} -out ${SSL_CSR} -subj "/C=${CN}/CN=${SSL_DOMAIN}" -config ${SSL_CONFIG}
472-
473-
echo -e "\033[32m ====> 6. 生成服务SSL CERT ${SSL_CERT} \033[0m"
474-
openssl x509 -sha256 -req -in ${SSL_CSR} -CA ${CA_CERT} \
475-
-CAkey ${CA_KEY} -CAcreateserial -out ${SSL_CERT} \
476-
-days ${SSL_DATE} -extensions v3_req \
477-
-extfile ${SSL_CONFIG}
478-
479-
echo -e "\033[32m ====> 7. 证书制作完成 \033[0m"
480-
echo
481-
echo -e "\033[32m ====> 8. 以YAML格式输出结果 \033[0m"
482-
echo "----------------------------------------------------------"
483-
echo "ca_key: |"
484-
cat $CA_KEY | sed 's/^/ /'
485-
echo
486-
echo "ca_cert: |"
487-
cat $CA_CERT | sed 's/^/ /'
488-
echo
489-
echo "ssl_key: |"
490-
cat $SSL_KEY | sed 's/^/ /'
491-
echo
492-
echo "ssl_csr: |"
493-
cat $SSL_CSR | sed 's/^/ /'
494-
echo
495-
echo "ssl_cert: |"
496-
cat $SSL_CERT | sed 's/^/ /'
497-
echo
498-
499-
echo -e "\033[32m ====> 9. 附加CA证书到Cert文件 \033[0m"
500-
cat ${CA_CERT} >> ${SSL_CERT}
501-
echo "ssl_cert: |"
502-
cat $SSL_CERT | sed 's/^/ /'
503-
echo
504-
505-
echo -e "\033[32m ====> 10. 重命名服务证书 \033[0m"
506-
echo "cp ${SSL_DOMAIN}.key tls.key"
507-
cp ${SSL_DOMAIN}.key tls.key
508-
echo "cp ${SSL_DOMAIN}.crt tls.crt"
509-
cp ${SSL_DOMAIN}.crt tls.crt
510-
```
511-
512-
执行脚本就好了
513-
514-
```shell
515-
[root@localhost openssl] sh ./create_self-signed-cert.sh --ssl-domain=iswbm.com --ssl-trusted-ip=172.20.20.100 --ssl-trusted-domain=python.iswbm.com --ssl-size=2048 --ssl-cn=CN
516-
...
517-
...
518-
...
519-
[root@localhost openssl] ls -l
520-
total 44
521-
-rw-r--r-- 1 root root 1131 Jul 27 22:40 cacerts.pem
522-
-rw-r--r-- 1 root root 17 Jul 27 22:40 cacerts.srl
523-
-rw-r--r-- 1 root root 1679 Jul 27 22:40 cakey.pem
524-
-rw-r--r-- 1 root root 5220 Jul 27 22:40 create_self-signed-cert.sh
525-
-rw-r--r-- 1 root root 2290 Jul 27 22:40 iswbm.com.crt
526-
-rw-r--r-- 1 root root 1070 Jul 27 22:40 iswbm.com.csr
527-
-rw-r--r-- 1 root root 1675 Jul 27 22:40 iswbm.com.key
528-
-rw-r--r-- 1 root root 345 Jul 27 22:40 openssl.cnf
529-
-rw-r--r-- 1 root root 2290 Jul 27 22:40 tls.crt
530-
-rw-r--r-- 1 root root 1675 Jul 27 22:40 tls.key
531-
```
532-
533-
验证证书:执行下面这条命令,要显示为 OK
534-
535-
```shell
536-
$ openssl verify -CAfile cacerts.pem tls.crt
537-
```
538-
539-
查看服务器证书的内容
540-
541-
```shell
542-
$ openssl x509 -in tls.crt -noout -text
543-
```
544-
545-
不添加 CA 证书验证
546-
547-
```shell
548-
$ openssl s_client -connect iswbm.com:443 -servername iswbm.com
549-
```
550-
551-
添加 CA 证书验证
552-
553-
```shell
554-
$ openssl s_client -connect iswbm.com:443 -servername iswbm.com -CAfile server-ca.crt
555-
```
556-
557-
558-
559-
![](http://image.iswbm.com/20200728233602.png)
560-
561-
![](http://image.iswbm.com/20200728231500.png)
562-
563-
564-
565-
566-
567-
![](http://image.iswbm.com/20200728231548.png)
568-
569-
570-
571-
![](http://image.iswbm.com/20200728234740.png)
572-
573-
![](http://image.iswbm.com/20200728235331.png)
574-
575-
![](http://image.iswbm.com/20200728235444.png)
576-
577-
![](http://image.iswbm.com/20200728235531.png)
578-
579-
### 向 CA 机构申请
580-
581-
在阿里云和腾讯云都可以 进行 SSL 证书的申请,由于阿里去没有免费SSL证书的申请选项,所以下面会以腾讯云为例。
582-
583-
登陆腾讯云,可以看到SSL 证书有分很多种,企业型的,企业型专业版的,增强型,增强型专业版的,还有域名型免费版。
584-
585-
![](http://image.iswbm.com/image-20200718102622663.png)
586-
587-
为了方便演示,我这里选 `域名型免费版`
588-
589-
可以免费申请 DV 证书
590-
591-
![](http://image.iswbm.com/image-20200718101358755.png)
592-
593-
点击 `免费快速申请`
594-
595-
![](http://image.iswbm.com/20200729004207.png)
596-
597-
再点击下一步,会需要你验证域名所有权,验证方式有如下三种
598-
599-
1. 自动DNS验证
600-
2. 手动DNS验证
601-
3. 文件验证
602-
603-
但由于我的域名不是腾讯云平台解析的,因此没有 自动DNS验证的选项,只有其他两种,你可以点击详细说明,跟着操作即可。
604-
605-
![](http://image.iswbm.com/image-20200718101652899.png)
606-
607-
608-
609-
![](http://image.iswbm.com/20200729004207.png)
610-
611-
最后确认申请,提交审核。
612-
613-
审核通过后,就会给你颁发证书,你可以从控制台点击证书下载。
614-
615-
![](http://image.iswbm.com/20200729004307.png)
616-
617-
下载下来的会是一个 zip 包。
618-
619-
解压一下,会有不同的服务器类型的文件夹。
620-
621-
![](http://image.iswbm.com/20200729004456.png)
622-
623-
每个文件夹里面都是三个文件
624-
625-
1. 根证书
626-
2. 域名证书
627-
3. 私钥文件
628-
629-
630-
631-
![](http://image.iswbm.com/20200729005349.png)
632-
633-
## 6. 如何部署 SSL 证书
634-
635-
通过申请拿到了数字证书后,要想使用这个证书,需要在你的服务器上进行部署。
636-
637-
根据服务器的类型不同,部署安装的方式有有所区别,腾讯云的操作文档已经非常详细了,你可以通过这个链接访问到如下的文档:https://cloud.tencent.com/document/product/400/4143
638-
639-
![](http://image.iswbm.com/20200718105347.png)
640-
641-
642-
643-
## 7. TLS/SSL 保证信息的安全
339+
## 5. TLS/SSL 保证信息的安全
644340

645341
在信息安全性问题中,我们常常要做到三点才能保证信息的安全:
646342

@@ -662,18 +358,8 @@ $ openssl s_client -connect iswbm.com:443 -servername iswbm.com -CAfile server-c
662358

663359

664360

665-
[理解公钥与私钥](https://songlee24.github.io/2015/05/03/public-key-and-private-key/)
666-
667-
668-
669-
http://www.humenggroup.com/newsInfo-34-263.html
670-
671-
https://blog.caojun.xyz/posts/macos_trust_ssl/
672-
673-
https://www.cnblogs.com/xdyixia/p/11610102.html
674-
675-
[前端须知的 Cookie 知识小结](https://juejin.im/post/5cd60dd751882520365ab55a)
361+
## 参考文章
676362

677-
https://docs.rancher.cn/rancher2x/install-prepare/self-signed-ssl.html#_1-http-over-ssl
363+
- [HTTPS中CA证书的签发及使用过程](https://www.cnblogs.com/xdyixia/p/11610102.html)
678364

679-
[细说localStorage, sessionStorage, Cookie, Session](https://juejin.im/entry/5ac4d661f265da23a049c92a)
365+
![](http://image.iswbm.com/20200607174235.png)

0 commit comments

Comments
 (0)