=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 条评论
HTTPS 证书(Let’s Encrypt)申请及配置
https://lyfeyaj.com/2016/12/29/how-to-apply-and-install-https-certification-with-lets-encrypt/
How to create a self-signed certificate with openssl? (如何用OpenSSL创建一个自签发证书)
https://stackoverflow.com/questions/10175812/how-to-create-a-self-signed-certificate-with-openssl
x509 certificate verification in C (C语言中如何实现x509证书的认证)
https://stackoverflow.com/questions/2756553/x509-certificate-verification-in-c
How do you verify a public key was issued by your private CA?
https://stackoverflow.com/questions/3412032/how-do-you-verify-a-public-key-was-issued-by-your-private-ca
https://stackoverflow.com/questions/tagged/openssl
https://gist.github.com/nathan-osman/5041136
企业中常用的自签名证书相关的安全性问题
https://securingtomorrow.mcafee.com/mcafee-labs/self-signed-certificates-secure-so-why-ban/
如何查看本机openssl的版本信息
https://serverfault.com/questions/604256/why-do-i-get-different-openssl-versions
https://en.wikipedia.org/wiki/OpenSSL
`
openssl version
yum info openssl
rpm -q –changelog openssl #信息最全、最详细
`
ctfr – 滥用证书透明度日志获取HTTPS网站子域名的工具
https://github.com/UnaPibaGeek/ctfr
getaltname – 从 SSL 证书中提取域名的工具
https://github.com/franccesco/getaltname
mkcert – 制作本地信任证书的工具
https://github.com/FiloSottile/mkcert
openssl基本密码学操作
https://paper.tuisec.win/detail/39290761fb9be0f
https://www.anquanke.com/post/id/151220
`
openssl的基本检查
speed test
对称加解密
摘要生成
RSA的生成和使用
公私钥对的生成和管理
加解密
签署验证
ECC的生成和使用
DH的生成和使用
私钥生成
derivation
DSA的生成和使用
公私钥对的生成
签署验证
`
静态网站需要启用 HTTPS 的原因,来自 Troy Hunt 的探讨
https://www.troyhunt.com/heres-why-your-static-website-needs-https/
使用 mkcert 为 localhost 主机添加 HTTPS 证书
https://blog.filippo.io/mkcert-valid-https-certificates-for-localhost/
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
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访问
第二步 生成客户端证书并签证(脚本)
`
本地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环境使用。
`
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