虽然说都8102年了,Let’s Encrypt都支持通配符证书了,但是对我这种不想再去买个域名来给我内网的机器做证书的人来说,用自签名证书当然是最好的方式了。使用OpenSSL做自签名证书的教程网上一搜一把,但是搜出来的那些生成的证书居然都在Firefox下无法通过。究其原因,是没有设置subjectAltName惹的祸。这里给一个生成脚本,让你一键(其实并没有)生成自签名的SSL证书。注意使用前需要修改openssl.cnf文件,删除[ req ]节下的 x509_extensions = v3_ca前面的注释符号,以支持V3版本的证书生成。
输入subjectAltName的时候,可以输入域名或者是IP,但是不要输错了。我就是因为将IP输入到域名区域,导致了firefox不认域名。
#!/bin/bash
echo "自签名证书生成脚本"
read -p "根证书存放位置(不含扩展名): " RootCA
if [ ! -f $RootCA.key ]; then
echo "$RootCA不存在,将生成一个根证书"
openssl genrsa -out $RootCA.key
read -p "根证书过期时间" ExpireDays
openssl req -new -x509 -key $RootCA.key -out $RootCA.crt -days $ExpireDays
fi
read -p "你要生成的证书名称: " CertCA
if [ ! -f $CertCA.pem ]; then
echo "$CertCA证书不存在,将生成一个新的证书"
openssl genrsa -des3 -out $CertCA.pem
echo "$CertCA私钥不存在,将从证书中解密私钥"
openssl rsa -in $CertCA.pem -out $CertCA.key
fi
if [ ! -f $CertCA.key ]; then
echo "$CertCA私钥不存在,您可能需要手工使用下列命令生成"
echo "openssl rsa -in $CertCA.pem -out $CertCA.key"
fi
echo "为$CertCA生成证书请求文件…"
openssl req -new -key $CertCA.pem -out $CertCA.csr
read -p "DNS名称(subjectAltName)[DNS:localhost, IP:127.0.0.1, ...]" AltName
read -p "根证书过期时间(天): " ExpireDays
openssl x509 -req -days $ExpireDays -CA $RootCA.crt -CAkey $RootCA.key -in $CertCA.csr -out $CertCA.crt -CAcreateserial -extfile
if [ -f $CertCA.key ]; then
cat $CertCA.crt $RootCA.crt > $CertCA.bundle.crt
echo "生成完毕。你现在可以将$CertCA.bundle.crt与$CertCA.key复制到你的web服务器上了。"
else
echo "证书生成失败"
exit 1;
fi
read -p "是否想要显示证书内容?(yes(y)|no(n)): " need
case $need in
yes|y)
openssl x509 -in $CertCA.crt -text -noout
;;
no|n)
#do anything you wannt
;;
*)
#do anything you wannt as default(直接回车)
openssl x509 -in $CertCA.crt -text -noout
;;
esac