SECURITY
自签名证书详解
总结下来,其实生成证书就两句话:
1 2 3 4 5 6 7 8 9 |
DOMAIN='www.example.com' SUBJECT="/C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=$DOMAIN" openssl req -nodes -new -subj $SUBJECT -keyout $DOMAIN.key -out $DOMAIN.csr printf "subjectAltName=DNS:localhost,IP:192.168.1.1" | \ openssl x509 -req -sha256 -days 3650 -in $DOMAIN.csr \ -signkey $DOMAIN.key -out $DOMAIN.crt \ -extfile /dev/stdin |
———————————————- 有一个shell脚本来自动生成证书:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#!/bin/sh # create self-signed server certificate: read -p "Enter your domain [www.example.com]: " DOMAIN echo "Create server key..." openssl genrsa -des3 -out $DOMAIN.key 1024 echo "Create server certificate signing request..." SUBJECT="/C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=$DOMAIN" openssl req -new -subj $SUBJECT -key $DOMAIN.key -out $DOMAIN.csr echo "Remove password..." mv $DOMAIN.key $DOMAIN.origin.key openssl rsa -in $DOMAIN.origin.key -out $DOMAIN.key echo "Sign SSL certificate..." openssl x509 -req -days 3650 -in $DOMAIN.csr -signkey $DOMAIN.key -out $DOMAIN.crt echo "TODO:" echo "Copy $DOMAIN.crt to /etc/nginx/ssl/$DOMAIN.crt" echo "Copy $DOMAIN.key to /etc/nginx/ssl/$DOMAIN.key" echo "Add configuration in nginx:" echo "server {" echo " ..." echo " listen 443 ssl;" echo " ssl_certificate /etc/nginx/ssl/$DOMAIN.crt;" echo " ssl_certificate_key /etc/nginx/ssl/$DOMAIN.key;" echo "}" |
另一个脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
#!/bin/sh domain='gpaas.yyuap.com' # 生成证书和key的对应文件名 ca_file=${domain}.ca key_file=${domain}.key cert_file=${domain}.crt printf "[req] default_bits = 4096 default_md = sha256 prompt = no encrypt_key = no string_mask = utf8only distinguished_name = cert_distinguished_name req_extensions = req_x509v3_extensions # 将下面的信息替换成你的信息 [ cert_distinguished_name ] C = CN ST = GD L = GZ O = yyuap OU = yyuap CN = gpaas.yyuap.com [req_x509v3_extensions] basicConstraints = critical,CA:true subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer keyUsage = critical,digitalSignature,keyCertSign,cRLSign #,keyEncipherment extendedKeyUsage = critical,serverAuth #, clientAuth subjectAltName=@alt_names # 将下面的信息替换成你的信息, 如果无需绑定域名或IP, 可以将其多余删除 [alt_names] DNS.1 = *.yyuap.com IP.1 = 172.20.47.38 IP.2 = 127.0.0.1 " >$ca_file openssl ecparam -out $key_file -name prime256v1 -genkey openssl req -new -sha256 -x509 -days 7300 -config $ca_file -extensions req_x509v3_extensions -key $key_file -out $cert_file openssl x509 -in $cert_file -serial -noout openssl x509 -noout -text -in "$domain-cert.pem" echo -e "\e[1m\e[34m基于openssl verify校验证书可用性:\e[0m" # 返回ok字样代表自签名证书是有效的. openssl verify -verbose -CAfile $cert_file $cert_file echo -e "\e[1m\e[34m基于openssl s_server校验证书可用性:\e[0m" openssl s_server -cert $cert_file -key $key_file -CAfile $cert_file -Verify 3 -accept 4430 -www & openssl_pid=$! # 测试证书有效性, 127.0.0.1可以改成alt_names中你想测试的域名或IP, 前提是被测试的域名需要被正确解析到本机. # 返回Verify return code: 0 (ok)代表自签名证书是有效的. echo 'GET /HTTP/1.1' | openssl s_client -connect 127.0.0.1:4430 -cert $cert_file -key $key_file -CAfile $cert_file kill ${openssl_pid} |
参考:https://www.fullstackmemo.com/2018/05/10/openssl-gen-https-self-signed-cer/ nginx配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
server { listen 80; server_name xxx.com gpaas.xxx.com; #return 301 https://$server_name$request_uri; #rewrite ^/(.*) https://$server_name$request_uri? permanent; # 80端口全部重定向到 https if ($scheme = http){ return 301 https://$host$request_uri; } } #启用 https, 使用 http/2 协议, nginx 1.9.11 启用 http/2 会有bug, 已在 1.9.12 版本中修复. listen 443 ssl http2; charset utf-8; server_name xxx.com gpaas.xxx.com; #告诉浏览器当前页面禁止被frame add_header X-Frame-Options DENY; #告诉浏览器不要猜测mime类型 add_header X-Content-Type-Options nosniff; #证书路径 ssl_certificate cert/meaninglive.com/full_chain.pem; #私钥路径 ssl_certificate_key cert/meaninglive.com/private.key; #安全链接可选的加密协议 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #可选的加密算法,顺序很重要,越靠前的优先级越高. ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; #在 SSLv3 或 TLSv1 握手过程一般使用客户端的首选算法,如果启用下面的配置,则会使用服务器端的首选算法. ssl_prefer_server_ciphers on; #储存SSL会话的缓存类型和大小 ssl_session_cache shared:SSL:10m; #缓存有效期 ssl_session_timeout 60m; |
—————证书知识补充——————————- 自签名证书 + Nginx 实现 HTTP 升级 HTTPS 很多内网平台在开发时候并没有考虑 HTTPS,想要从 HTTP 升级到 HTTPS 一般有两种方法:一种是更新所有相关前后端代码;另一种是基本不改变代码,用 Nginx 把 HTTPS 反向代理到 HTTP 接口。第一种方法工作量有点大,本文介绍下第二种方法,当然首先要做的是生成自签名证书。 准备工作 内网 环境受影响的是 软件安装升级 和 证书申请,所以需要 制作本地 yum 和 自签名证书,自签名证书稍后讲,制作本地 yum 库可参考链接内容, HTTPS 和 CA 基础知识 查看这里 。 制作本地 yum 库,为了自动处理软件之间的依赖关系,一般都会用 yum 等软件包管理器来安装更新软件,默认 yum 是从互联网获取各种软件包的,内网环境就需要制作本地 yum Read more…