如何自签发HTTPS证书


=Start=

缘由:

在测试给Nginx新增模块的时候想试试HTTPS的配置方式,但是手上又没有多的域名了,原本想着是用IP申请一个免费的Let’s Encrypt的HTTPS证书的,照着「Let’s Encrypt,免费好用的 HTTPS 证书」操作了之后才发现——它已经不支持给IP配置HTTPS证书了;没办法,只好先自签发一个HTTPS证书做测试。

之前做过几次,但没有记录下来,所以现在想配置又需要去网上找,试了几个之后终于找到一个靠谱的文章「为nginx配置https并自签名证书」,照着一步一步执行了一遍,测试OK。所以在此记录一下,方便以后参考。

正文:

参考解答:
1、制作CA证书:

制作CA的私钥(ca.key):

openssl genrsa -des3 -out ca.key 2048

制作一个不需要密码的CA私钥(用处参见「给博客添加STARTSSL的免费SSL证书」):

openssl rsa -in ca.key -out ca_decrypted.key

制作CA的证书(ca.crt):

openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
2、制作网站(或IP)的证书并用CA签名认证

在这里,假设网站的域名为 blog.ixyzero.com

制作 blog.ixyzero.com 的证书私钥:

openssl genrsa -des3 -out blog.ixyzero.com.pem 1024

制作一个不需要密码的 blog.ixyzero.com 的证书私钥:

openssl rsa -in blog.ixyzero.com.pem -out blog.ixyzero.com.key

生成签名请求:

openssl req -new -key blog.ixyzero.com.pem -out blog.ixyzero.com.csr

在common name中填入网站域名,如 blog.ixyzero.com 即可生成该站点的证书,同时也可以使用泛域名如 *.ixyzero.com 来生成所有二级域名可用的网站证书。

用CA进行签名:

openssl ca -policy policy_anything -days 3650 -cert ca.crt -keyfile ca.key -in blog.ixyzero.com.csr -out blog.ixyzero.com.crt

其中,policy参数允许签名的CA和网站证书可以有不同的国家、地名等信息,days参数则是签名时限。

如果在执行签名命令时,出现「 `unable to open ‘/etc/pki/CA/index.txt’` 」的错误,可以通过修改 /etc/pki/tls/openssl.cnf 中 「`dir = ./CA`」,然后:

mkdir -p CA/newcerts
touch CA/index.txt
touch CA/serial
echo "01" > CA/serial

再重新执行签名命令。

最后,把 ca.crt 的内容粘贴到 blog.ixyzero.com.crt 后面。这个比较重要!因为不这样做,可能会有某些浏览器不支持。

好了,现在 HTTPS 需要的网站私钥 blog.ixyzero.com.key 和 网站证书 blog.ixyzero.com.crt 都准备完毕了。之后就可以开始配置Nginx了。

参考链接:

=END=

,

《 “如何自签发HTTPS证书” 》 有 14 条评论

  1. RSA 私钥文件的格式
    https://www.cryptosys.net/pki/rsakeyformats.html
    http://fileformats.archiveteam.org/wiki/PEM_encoded_RSA_private_key

    Differences between “BEGIN RSA PRIVATE KEY” and “BEGIN PRIVATE KEY”
    https://stackoverflow.com/questions/20065304/differences-between-begin-rsa-private-key-and-begin-private-key
    `
    The unencrypted PKCS#8 encoded data starts and ends with the tags:
    —–BEGIN PRIVATE KEY—–
    BASE64 ENCODED DATA
    —–END PRIVATE KEY—–

    RSA Private Key file (PKCS#1)
    The RSA private key PEM file is specific for RSA keys.It starts and ends with the tags:
    —–BEGIN RSA PRIVATE KEY—–
    BASE64 ENCODED DATA
    —–END RSA PRIVATE KEY—–
    `

    What is the SSL private key file format?
    https://crypto.stackexchange.com/questions/21102/what-is-the-ssl-private-key-file-format

  2. Nginx SSL快速双向认证配置(脚本)
    https://www.jianshu.com/p/ba7f3f346bb8
    https://blog.dteam.top/posts/2018-06/nginx-ssl%E5%BF%AB%E9%80%9F%E5%8F%8C%E5%90%91%E8%AE%A4%E8%AF%81%E9%85%8D%E7%BD%AE%E8%84%9A%E6%9C%AC.html
    `
    # SSL双向认证
    绝大多数SSL应用都以单向认证为主,即客户端只要信任服务端,就可以使用服务端的公钥加密后向服务端发起请求,由服务端的私钥解密之后获得请求数据。

    如果这个过程反过来,让服务端信任客户端,服务端使用客户端的公钥加密之后将数据返回给客户端,其实也是可以做到的,原理和实现跟单向认证都差不多。

    服务端信任客户端的操作往往也会伴随着客户端认证服务端的过程,所以让服务端信任客户端的SSL认证方式往往也被称为SSL双向认证,并且要配置SSL双向认证必须先开启服务端SSL,先配置客户端信任服务端。

    # Nginx的SSL双向认证配置
    第一步 开启https访问
    第二步 生成客户端证书并签证(脚本)
    `

  3. 本地https快速解决方案——mkcert
    https://blog.dteam.top/posts/2019-04/%E6%9C%AC%E5%9C%B0https%E5%BF%AB%E9%80%9F%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88mkcert.html
    https://github.com/FiloSottile/mkcert
    `
    在本地开发中,有时候我们经常需要模拟https环境,比如PWA应用要求必须使用https访问。在传统的解决方案中,我们需要使用自签证书,然后在http server中使用自签证书。由于自签证书浏览器不信任,为了解决浏览器信任问题我们需要将自签证书使用的CA证书添加到系统或浏览器的可信CA证书中,来规避这个问题。

    以前这些步骤需要一系列繁琐的openssl命令生成,尽管有脚本化的方案帮助我们简化输入这些命令(可以参考以前的blog: Nginx SSL快速双向认证配置)。但是仍然觉得对本地开发不那么友好,有些繁重了。本文将介绍一种更加简单友好的方式生成本地https证书,并且信任自签CA的方案——mkcert。

    # mkcert简介
    mkcert是一个使用go语言编写的生成本地自签证书的小程序,具有跨平台,使用简单,支持多域名,自动信任CA等一系列方便的特性可供本地开发时快速创建https环境使用。
    `

  4. What is SCEP (Simple Certificate Enrollment Protocol)?
    https://sectigo.com/resource-library/scep-simple-certificate-enrollment-protocol

    Simple Certificate Enrollment Protocol
    https://en.wikipedia.org/wiki/Simple_Certificate_Enrollment_Protocol

    简单认证登记协议概述
    https://www.cisco.com/c/zh_cn/support/docs/security-vpn/public-key-infrastructure-pki/116167-technote-scep-00.html

    简单证书注册协议(SCEP)详解
    https://hjk.life/posts/scep/
    `
    SCEP(Simple certificate enrollment protocol),简单证书注册协议,最初由 CISCO 起草,简而言之,就是一个用来注册数字证书的协议。

    RFC 8894描述了简单的证书注册协议(SCEP)。该协议的旧版本成为实际工业标准,用于实际提供数字证书,主要用于网络设备。该协议旨在使任何标准网络用户的要求和颁发的数字证书尽可能简单。这些流程通常需要网络管理员的密集输入,因此不适合大规模部署。

    简单的证书注册协议仍然是最受欢迎和广泛可用的证书注册协议,被许多网络设备和软件制造商使用,他们正在开发简化的处理证书的方法,以便向日常用户大规模实施。例如,思科 IOS 操作系统(即使思科正在推动功能稍多的 EST)和 iPhone 注册企业 PKI。大多数 PKI 软件(特别是 RA 实现)都支持它,包括活动目录证书服务的网络设备注册服务 (NDES)。
    `
    简单证书注册协议(SCEP)
    https://www.manageengine.cn/mobile-device-management/help/profile_management/windows/mdm_windows_scep.html

发表回复

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