带SAN的自建HTTPS

前言

本文应用场景:使用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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值