HTTPS - 自认证根证书CA生成/签发/发布

即使是非对称加密系统,也不能保证公钥的分发是可靠的. 为了防范公钥分发过程中的中间人攻击,需要一个可信的"始祖"公证人,这就是CA机构存在的意义.

由CA签发证书认证网站的过程

  1. CA机构生成密钥对: 公钥 ca.cer 和 私钥 ca.key
  2. 浏览器/操作系统携带证书ca.cer
  3. 网站生成私钥 cert.key
  4. 网站将公钥及网站信息(域名/组织等),提交给CA机构
  5. CA机构使用私钥ca.key签发网站证书cert.cer
  6. 网站运营商通过cert.key和 cert.cer运行https
  7. 用户访问网站,获得cert.cer,由于该证书使用CA机构的私钥签发,因此可以通过保存在本地的公钥ca.cer验证
  8. 验证通过并得到了公钥-> 显示绿色https标志; 否则,提示用户风险信息
  9. 用户通过公钥与网站服务器交换对称加密密钥,进行正式的SSL会话

通过上述步骤可以看出,只要能保证网站公钥的可靠性即可,所以如果客户端直接存放了网站的证书,那么也是可以保证https正常进行的.
但是无论是何种证书,都需要可靠的分发到客户端才能保证安全.在开发过程中我们可能有各种各样的服务端,相较于为每一个服务端向客户端分发证书,还不如直接分发根证书,这样只需一次分发,客户端就可以完成后续的签发过程.

自认证CA根证书生成及签发

证书生成过程可以通过openssl完成.为了简化操作,我写了一个shell脚本,只需两步即可生成根证书及使用根证书签发网站证书
保存以下代码为gen_crt.sh,然后按照帮助内容使用即可.

  1. 生成根证书
    ./gen_crt.sh root aes128 2048 365 "/CN=MyCA"

    此时目录下有ca.key及ca.cer两个文件,ca.cer需要发布到客户端
    为了保证私钥的安全,生成过程中需要一个对ca.key加密的密码

  2. 签发网站证书
    ./gen_crt.sh sign aes128 2048 365 "/CN=www.mysite.com" ca.key ca.cer

为了保证私钥的安全,生成过程中需要一个对cert.key加密的密码.

    #!/bin/sh

    help()
    {
        echo "Example: ./gen_crt.sh root aes128 2048 365 \"/CN=CustomCA\""
        echo "Example: ./gen_crt.sh sign aes128 2048 365 \"/CN=www.mysite.com\" ca.key ca.cer"
        echo "key_length: 1024|2048|4096"
        methods="aes128|aes192|aes256|camellia128|camellia192|camellia256|des|des3|idea"
        echo "Supported encryption methods:" $methods
        exit 1
    }

    operation=$1
    method=$2
    key_length=$3
    expire_days=$4
    subj=$5
    ca_key=$6
    ca_cer=$7

    RED="\033[0;31m"
    GREEN="\033[0;32m"
    NC="\033[0m"


    if [ "$operation" = "root" ];then
        if [ $# -ne 5 ];then
            echo "${RED}Invalid argument num:$#${NC}"
            help
        fi
    elif [ "$operation" = "sign" ];then
        if [ $# -ne 7 ];then
            echo "${RED}Invalid argument num:$#${NC}"
            help
        fi
    else
        echo "${RED}Invalid operation $operation${NC}"
        help
    fi

    echo "Operation" $operation

    case $method in
        aes128|aes192|aes256|camellia128|camellia192|camellia256|des|des3|idea)
            echo "Using cryption method:" $method
            ;;
        *)
            echo "Wrong parameters"
            help
            ;;
    esac

    case $key_length in
        1024|2048|4096)
            echo "RSA Key length:" $key_length
            ;;
        *)
            echo "Wrong RSA key length"
            help
            ;;
    esac

    if [$expire_days -lt 0]; then
        echo "Invalid expire days:" $expire_days
        help
    fi

    if [ "$operation" = "root" ];then
        echo "Creating Root CA..."
        openssl genrsa -$method -out ca.key $key_length
        openssl req -x509 -new -key ca.key -out ca.cer -days 750 -subj $subj
        echo "${GREEN}Please distribute ca.cer anywhere needed"
        echo "${RED}Please keep ca.key in a private place${NC}"
    elif [ "$operation" = "sign" ];then
        openssl genrsa -$method -out cert.key $key_length
        openssl req -new -out cert.req -key cert.key -subj $subj
        openssl x509 -req -in cert.req -out cert.cer -CAkey $ca_key -CA $ca_cer -days $expire_days -CAcreateserial
        -CAserial serial
        echo "${GREEN}Please distribute cert.cer freely"
        echo "${RED}Please keep cert.key privately${NC}"
    else
        echo "Unknown operation: $operation"
        help
    fi

在nginx中使用证书

修改nginx配置文件 /etc/nginx/sites-available/xxxx
加入形如以下配置:

listen 443 ssl default_server;
listen [::]:443 ssl default_server;

ssl_certificate /home/ethan/workspace/homesite/tools/cert.cer;
ssl_certificate_key /home/ethan/workspace/homesite/tools/cert.key;

分发CA根证书

分发安全

可以通过可靠的服务(如通过安全验证的邮箱服务提供商、存储下载提供商)将根证书发放给客户端。直接通过http链接发放给客户端(如12306)的方式是不安全的,仅限于实验环境使用

Linux分发(SSH/Python的HTTPS访问等)

浏览器中分发

Chrome:设置->高级设置->HTTPS/SSL "管理证书"
Firefox: Preferences->Advanced->View Certificates->Certificate Manager

iOS分发

待进一步研究

Android分发

待进一步研究

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341

推荐阅读更多精彩内容

  • HTTPS介绍 超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩...
    齐滇大圣阅读 8,892评论 8 96
  • 数字证书就是网络通讯中标志通讯各方身份信息的一系列数据,其作用类似于现实生活中的身份证。它是由一个权威机构发行的,...
    拉肚阅读 21,105评论 1 17
  • 证书的三个作用 加密通信和身份验证(验证对方确实是对方声称的对象)和数据完整性(无法被修改,修改了会被知) 证...
    SuperRoot阅读 12,190评论 1 11
  • java的环境搭配主要是JDK和eclipse,其实说难不难,我都是从百度搜索下载的,JDK下载的时候版本到没怎么...
    小豪1阅读 283评论 0 1
  • “用你的笑容去改变这个世界,别让这个世界改变了你的笑容” 这句话让我想到我们的一个病人 一个积极乐观勇敢和癌症作斗...
    一1人木阅读 1,276评论 0 0