跳转至主要内容
晴雨技术笔记

带有自定义CA的自签名SSL创建与使用

杏川铭心 杏川铭心
发表于 2024年6月1日
  • 本文最后编辑于 458 天前,部分信息可能已严重过时,请注意甄别。
  • 最近在本地测试网站的时候因为某些原因需要用到HTTPS,所以很自然的想到自签名SSL。用自定义CA主要是因为我本地跑的测试站比较多,有CA的话可以直接把CA证书添加到信任链里面,而不用一个个添加每个网站的SSL证书。

    创建自定义CA密钥

    openssl genrsa -des3 -out rootCA.key 4096

    这一步创建我们的自定义CA密钥,如果不需要密码保护把-des3去掉即可。4096是指4096位加密。

    创建自定义CA证书

    openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.crt

    这一步创建一个证书。-days后面跟证书生效时间,如3650就是10年。

    上面两步好了之后会得到两个文件,rootCA.keyrootCA.crt。其中rootCA.crt是后面要反复用到的。

    创建自签名SSL

    openssl genrsa -out example.com.key 2048
    openssl req -new -key example.com.key -out example.com.csr

    每一个域名都需要创建一次。2048是指2048-bits加密。第一步创建密钥,第二步则是创建CSR(证书签名请求)。

    创建CSR的时候就可以把SAN数据附加上去了。(没有SAN数据的话浏览器会报安全错误。)当然在创建证书的时候也可以附加SAN数据,我一般是在创建证书的时候附加。

    openssl req -new -sha256 \
        -key example.com.key \
        -subj "/C=US/ST=CA/O=MyOrg, Inc./CN=example.com" \
        -reqexts SAN \
        -config <(cat /etc/ssl/openssl.cnf \
            <(printf "\n[SAN]\nsubjectAltName=DNS:example.com,DNS:*.example.com")) \
        -out example.com.csr

    创建的时候会问你一堆有的没的的问题,包括国家和地区,公司,通用名等。其中通用名填你要用的域名,其他的爱怎么填怎么填。也可以像上面这个例子一样,提前把这些数据写在-subj参数后面。(CN就是通用名。不是中国的意思!)

    得到example.com.keyexample.com.csr

    然后拿着CSR去生成证书。

    openssl x509 -req -in example.com.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out example.com.crt -days 365 -sha256

    同样-days是证书的有效日期。

    也可以在这一步的时候附加SAN数据,首先新建一个名为example.com.ext的文件:

    vim example.com.ext

    然后写入以下内容:

    subjectKeyIdentifier   = hash
    authorityKeyIdentifier = keyid:always,issuer:always
    basicConstraints       = CA:FALSE
    keyUsage               = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyAgreement, keyCertSign
    subjectAltName         = DNS:example.com, DNS:*.example.com
    issuerAltName          = issuer:copy

    其中subjectAltName就是SAN数据,一般有DNS:IP:两种,其中DNS:后跟域名,IP:后跟IP地址,不同SAN数据之间用逗号隔开。

    最后把-extfile example.com.ext这个参数加到命令后方:

    openssl x509 -req -in example.com.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out example.com.crt -days 365 -sha256 -extfile example.com.ext

    就得到了带有SAN数据的证书。(如果在生成CSR的时候就附带了SAN数据那么可以无视这一步。)

    把自定义CA加入信任链

    这里以Debian 12系统为例:

    sudo cp rootCA.crt /usr/local/share/ca-certificates
    sudo update-ca-certificates

    某些浏览器(例如Chromium)有自己的信任链,这种情况下需要手动去浏览器设置里添加刚才创建的CA证书。

    延伸阅读

    • 特别提醒:

      评论看到就会回,但是不保证速度,有的时候站长忘记看的话就会出现审核好几天也没有动静的情况……

      有垃圾评论检查,如果评论之后直接消失、没反应说明被识别为垃圾评论了。

      如果等不及的话,可以加群!

    杏川铭心
    杏川铭心

    群号:1101838302,欢迎友好交流 :P 曾用名Frank419(现在也是我在很多地方的用户名),网站站长。

    分类:
    标签:

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注