如何自签发HTTPS证书

本文最后更新于2016年12月17日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢!

=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=

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/3075.html

《如何自签发HTTPS证书》上的13个想法

  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环境使用。
    `

发表评论

电子邮件地址不会被公开。 必填项已用*标注