签发CA并使用CA签发SSL证书
- 在
~/ca
创建CA证书和私钥,私钥为cakey.pem
,公钥为ca.pem
。ca.pem
后续将被安装到系统并信任。 - 在
~/ca/certs
创建自定义SSL证书,私钥为privkey.pem
,公钥为cert.pem
。他们将被用于启动https服务。
[ ! -d ~/ca ] &&{
mkdir ~/ca
}
cd ~/ca
[ ! -f cakey.pem -o ! -f ca.pem ]&&{
if [ -f cakey.pem ]; then
rm -f cakey.pem
fi
if [ -f ca.pem ]; then
rm -f ca.pem
fi
cat > openssl.conf <<\EOF
[ req ]
# Options for the `req` tool (`man req`).
default_bits = 2048
distinguished_name = req_distinguished_name
string_mask = utf8only
# Extension to add when the -x509 option is used.
x509_extensions = v3_ca
[ req_distinguished_name ]
# See <https://en.wikipedia.org/wiki/Certificate_signing_request>.
countryName_min = 0
stateOrProvinceName_min = 0
localityName_min = 0
organizationName_min = 0
organizationalUnitName_min = 0
commonName = Common Name
emailAddress_min = 0
[ v3_ca ]
# Extensions for a typical CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
EOF
# 使用liuganghuan.com创建SSL证书,作为CA
openssl req -config ~/ca/openssl.conf -x509 -newkey rsa:4096 -sha256 -nodes -keyout temp.pem -extensions v3_ca -out ca.pem -days 36500 -subj "/CN=liuganghuan"
openssl rsa -inform PEM -in temp.pem -outform PEM -out cakey.pem
openssl x509 -in ca.pem -noout -text
echo
echo -e "\033[32mnew ca.pem generated! please install ~/ca/ca.pem !!!\033[0m"
echo -e "\033[32m================================\033[0m"
}
[ ! -d ~/ca/certs ] &&{
mkdir ~/ca/certs
}
cd ~/ca/certs
# 使用CA给arloor.com颁发证书
openssl genrsa -out privkey.pem 2048
openssl req -new -key privkey.pem -out localhost.csr -subj "/CN=arloor.com"
# 设置证书的使用范围
cat > cert.ext <<EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
IP.2 = 127.0.0.1
DNS.3 = arloor.com
DNS.4 = *.arloor.com
DNS.5 = arloor.dev
DNS.6 = *.arloor.dev
EOF
openssl x509 -req -in localhost.csr -out cert.pem -days 36500 \
-CAcreateserial -CA ../ca.pem -CAkey ../cakey.pem \
-CAserial serial -extfile cert.ext
openssl x509 -in cert.pem -noout -text
openssl verify -CAfile ~/ca/ca.pem cert.pem
cat ~/ca/ca.pem >> cert.pem
Mac下安装自定义CA证书
使用访达打开 ~/ca
双击 ca.pem
,会打开“钥匙串访问”,将其安装到“系统”级别的“证书”下。
如果没有弹出安装CA证书的提示,也可以拖动ca.pem
到“系统”级别的“证书”的空白部分。
最后设置信任该自定义CA证书。
参考文档
私钥的各种格式
在 OpenSSL 和其他加密库中,您可能会遇到两种格式的私钥:-----BEGIN RSA PRIVATE KEY-----
和 -----BEGIN PRIVATE KEY-----
。这两种格式的主要区别在于它们的编码方式和包含的信息。
-----BEGIN RSA PRIVATE KEY-----
:
这种格式表示私钥是按照 PKCS#1 标准编码的。它仅包含用于 RSA 算法的私钥信息,不包含其他元数据。文件的内容是一个以 Base64 编码的 DER(Distinguished Encoding Rules)表示的 ASN.1(Abstract Syntax Notation One)结构。通常,这种私钥格式仅适用于 RSA 密钥。
-----BEGIN PRIVATE KEY-----
:
这种格式表示私钥是按照 PKCS#8 标准编码的。与 PKCS#1 不同,PKCS#8 可以用于多种类型的密钥(如 RSA、DSA、EC),并提供了更通用的编码结构。这种格式的私钥包含关于密钥类型和算法的附加信息。与 PKCS#1 类似,文件的内容也是一个以 Base64 编码的 DER 表示的 ASN.1 结构。
总结一下,-----BEGIN RSA PRIVATE KEY-----
是特定于 RSA 的 PKCS#1 格式的私钥,而 -----BEGIN PRIVATE KEY-----
是更通用的 PKCS#8 格式的私钥,可用于多种加密算法。尽管两者之间有区别,但在实际使用中,许多加密库和工具都可以处理这两种格式。
不使用CA生成证书和各种格式的私钥
生成证书和PKCS#1私钥
# 生成PKCS#1私钥
openssl genrsa -out privkey.pem 4096
# 从私钥生成证书
openssl req -x509 -key privkey.pem -sha256 -nodes -out cert.pem -days 3650 -subj "/C=/ST=/L=/O=/OU=/CN=example.com"
生成证书和PKCS#8私钥
openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout privkey.pem -out cert.pem -days 3650 -subj "/C=/ST=/L=/O=/OU=/CN=example.com"
生成证书和PKCS#8私钥,并转换成PKCS#1私钥
openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout temp.pem -out cert.pem -days 3650 -subj "/C=/ST=/L=/O=/OU=/CN=example.com"
## 转换成PKCS#1私钥
openssl rsa -inform PEM -in temp.pem -outform PEM -out privkey.pem
私钥转换格式的常用命令
# 转换成PKCS#8
openssl pkcs8 -topk8 -inform PEM -in privkey.pem -out pkcs8_private_key.pem -outform PEM -nocrypt
# 转换成PKCS#8,也称RSA密钥。
openssl rsa -inform PEM -in privkey.pem -outform PEM -out rsa_aes_privkey.pem
openssl s_client
通过 s_client
发送http1.1的请求并打印响应。不支持http2的二进制数据
-quiet
表示不打印证书信息-ign_eof
表示处理半关闭
更多可以看 man openssl
的 s_client 部分
(echo -ne "GET /ip HTTP/1.1\r\nConnection: Close\r\n\r\n") |openssl s_client -quiet -ign_eof -alpn http/1.1 -ignore_critical -connect www.arloor.com:443 2>/dev/null
交互式终端:在最后增加 -crlf
将换行设置为http协议的 \r\n
openssl s_client -showcerts -ign_eof -alpn http/1.1 -ignore_critical -connect www.arloor.com:443 -crlf 2>/dev/null
试试继续输入GET / HTTP/1.1
加两个Enter。
从pem格式证书和私钥生成pkcs12
surge mac的MitM解析https数据可以导入pkcs12格式的ca证书,这里就转换下
openssl pkcs12 -export -inkey cakey.pem -in ca.pem -password pass:"123456" -out ca.p12
查看:
openssl pkcs12 -in ca.p12 -password pass:"123456" -info