前言
本文应用场景:使用OPENSSL自建HTTPS,并配置Apache2(信息安全实践课)
在高版本的浏览器中,使用HTTPS,浏览器需要检查SAN(Subject Alternative Name) ,配置时如果只有CN(CommonName)是不够的,会有如下警告
打开浏览器的控制面板中的Security,会发现提示去缺少SAN
解决办法: 解决方法就是按照如下的方式配置,只需要在https://blog.csdn.net/zzh2910/article/details/111090411该博客中的步骤中做一点点小小的改动即可,本文接下来的部分会在改动的部分做出提示。如果想看关于HTTPS的简单理论知识可以去看一下文末的参考链接的两篇文章。
1、生成CA
准备工作:
# 安装openssl
sudo apt-get install openssl
# 创建与CA有关的目录
cd && mkdir -p https/myCA/signedcerts && mkdir https/myCA/private && cd https/myCA
# 创建证书库,这两个文件存放了 CA 每一次颁发证书的记录
# 指定第一个颁发证书的序列号,并且创建一个空的index.txt文件,生成证书索引数据库文件,用于存放颁发证书的信息
echo '01' > serial && touch index.txt
创建caconfig.cnf的配置文件,再次感谢该文章的大佬给出示例(https://blog.csdn.net/zzh2910/article/details/111090411),其中需要修改的是username
注意该配置文件末尾的一段配置十分重要!是原文章中没有给到的
[ ca ]
default_ca = local_ca
[ local_ca ]
dir = /home/{username}/https/myCA # CA 目录
certificate = $dir/cacert.pem # 证书的位置
database = $dir/index.txt # 数据库位置
new_certs_dir = $dir/signedcerts
private_key = $dir/private/cakey.pem # 私钥位置
serial = $dir/serial
# 认证其他服务器证书设置
default_crl_days = 365 # 默认吊销证书列表更新时间
default_days = 1825 # 默认证书有效期
default_md = sha256 # 默认对证书签名时的摘要算法
# !!修改匹配策略!!
#默认匹配策略是:国家名,省份,组织名必须相同(match)。我们改为可选(optional),这样避免我们生成证书请求文件时(csr)去参考 CA 证书。
policy = local_ca_policy
x509_extensions = local_ca_extensions
[ local_ca_policy ]
countryName = match
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
#
#
# x509 extensions to use when generating server certificates.
#
[ local_ca_extensions ]
basicConstraints = CA:false
#
#
# The default root certificate generation policy.
# 生成 CA 根证书设置
[ req ]
default_bits = 2048 # 默认生成证书请求时的秘钥长度
default_keyfile = /home/{username}/https/myCA/private/cakey.pem # 默认私钥存放位置
default_md = sha256 # 默认证书签名时使用的摘要算法
#
prompt = no
distinguished_name = root_ca_distinguished_name
x509_extensions = root_ca_extensions
#
#
# Root Certificate Authority distinguished name. Change these fields to match
# your local environment!
#
[ root_ca_distinguished_name ]
commonName = myCA # CA 机构名
stateOrProvinceName = JS # 所在省份
countryName = CN # 所在国家(仅限两字符)
emailAddress = example@qq.com # 邮箱
organizationName = USTC # 组织名
organizationalUnitName = SE # 单位名
#
[ root_ca_extensions ]
basicConstraints = CA:true
# !!!需要额外在原文章的基础上添加这段配置!!!!
[v3_req]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = localhost
IP.1 = 127.0.0.1
之后使用配置文件生成CA证书即可
# 该命令用于给环境变量 OPENSSL_CONF 赋值为caconfig.cnf。
export OPENSSL_CONF=~/https/myCA/caconfig.cnf
# 生成 rsa 秘钥对和 pem 格式的 CA 自签名根证书,有效期 1825天
# 需要输入密码,每次对服务器证书进行签名都需要这个密码,最少4位
openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825
# 功能:生成 CA 根证书和密钥
# req用于证书生成与查看
# -x509 说明生成自签名证书
# -newkey 在生成证书时自动生成密钥,生成的密钥位置在配置文件中有说明,即default_keyfile字段
# -out指定生成的证书的名称,-outform说明文件格式
# rsa:1024 产生RSA密钥,位数由bits决定
# -days 失效日期
2、生成网站的密钥与证书
准备工作
# 在 myCA 同级目录下创建 server 目录存放服务器相关信息
cd .. && mkdir server && cd server
创建网站的证书配置文件
#
# server.cnf
#
[ req ]
prompt = no
distinguished_name = server_distinguished_name
[ server_distinguished_name ]
commonName = localhost # 服务器域名,由于在本地测试,设为 localhost 即可
stateOrProvinceName = JS # 服务器所在省份
countryName = CN # 服务器所在国家(仅限2字符)
emailAddress = example@qq.com # 邮箱
organizationName = USTC # 组织名
organizationalUnitName = SE # 单位名
生成密钥与证书
# 设置 openssl 环境变量,以服务器身份运行接下来的 openssl 命令
export OPENSSL_CONF=~/https/server/server.cnf
# 生成临时服务器秘钥和未经签名的证书文件
openssl req -newkey rsa:2048 -keyout tempkey.pem -keyform PEM -out tempreq.pem -outform PEM
# 上述大部分参数都与创建CA证书时一致
# 新增的-keyout 指明生成的私钥位置
# -keyform 说明生成私钥的格式
用上述步骤生成的私钥会经过加密,可以选择将加密后的私钥解密,也可以选择不解密,等服务器运行时输入密码即可。以下步骤二选一即可:
-
如果选择先解密
openssl rsa < tempkey.pem > server_key.pem
-
如果选择先不解密,等服务器运行时再输入密码
mv tempkey.pem server_key.pem
3、使用CA对网站证书签名
# 设置 openssl 环境变量,以 CA 身份运行接下来的 openssl 命令
export OPENSSL_CONF=~/https/myCA/caconfig.cnf
# 对服务器证书进行签名
openssl ca -in tempreq.pem -out server_crt.pem -extensions v3_req
# 其中-in参数表示的被加密(签名)的证书
# -out表示生成后的证书名
# -extensions是SAN的关键!表示从中添加证书扩展的部分
4、安装Apache2并开启HTTPS
参照https://blog.csdn.net/zzh2910/article/details/111090411,一文配置Apache2即可。
安装apache2
sudo apt install apache2
修改默认的ssl配置文件,默认ssl配置文件位置:
cd /etc/apache2/sites-available/
用sudo权限修改default-ssl.conf文件中的SSLCertificateFile 与 SSLCertificateKeyFile ,修改为如下
SSLCertificateFile /home/{username}/https/server/server_crt.pem
SSLCertificateKeyFile /home/{username}/https/server/server_key.pem
最后重启apache2
# 启用默认 ssl 站点和 ssl 模块
sudo a2ensite default-ssl.conf
sudo a2enmod ssl
# 重启 apache 服务
systemctl restart apache2
5、导入证书到浏览器
此处以firfox为例
打开设置中的Privacy & Security中的View Certificates
导入/home/hwb/https/myCA目录下的cacert.pem
两个都勾选即可
6、效果展示
在浏览器中输入https://localhost,即可
没有提示安全警告且地址栏中有对应的icon。完工。
参考资料:
https://blog.csdn.net/zzh2910/article/details/111090411
https://deepzz.com/post/based-on-openssl-privateCA-issuer-cert.html
https://www.cnblogs.com/libaoquan/p/7965873.html