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