简介

有时候我们在局域网做实验的时候需要使用到SSL证书,但是由于是局域网环境,没有公网IP,所以就无法使用Let's Encrypt等证书。

但是这并不意味着没有办法了,我们还可以使用自签证书来进行实验。

当然,自签证书可以使用一键脚本来生成,本站也有一键生成自签证书的脚本,但是本站上的脚本生成的信息是默认的,如果使用手动生成的方法就可以自定义一些域名信息。



安装openssl

需要生成自签证书就需要有openssl工具,这个工具大部分linux系统都是默认有的,如果不确定自己的系统有么有可以直接重新在安装一遍。

安装openssl直接使用自己的linux系统的源安装即可

yum -y install openssl

1.png



创建工作目录

在生成证书前,我们需要创建一些目录来存放待会生成的密钥等文件

具体目录如下结构:

/root
|-ssl
  |-ca
  |-server

具体命令如下:

mkdir -p /root/ssl/{ca,server}

2.png



创建CA密钥

进入ssl目录

直接使用下面命令生成CA密钥

CA密钥是待会用来创建CA证书的主要文件

openssl genrsa -out ./ca/ca.key 2048

执行上述命令后,如果不报错的话,就可以在/root/ssl/ca目录下看到一个ca.key文件

3.png



创建CA证书

CA密钥创建完成后,就可以使用密钥来创建证书了

创建证书命令如下:

openssl req -x509 -new -nodes -key ./ca/ca.key -sha256 -days 3650 -out ./ca/ca.crt

执行上面命令后,需要按照提示输入相关信息

第一个提示Country Name (2 letter code) [XX]:需要输入两个字母的国家代码,中国的国家代码为CN,可以回车跳过

第二个提示State or Province Name (full name) []:需要输入省份,按需输入即可,可以回车跳过

第三个提示Locality Name (eg, city) [Default City]:需要输入所在地名,也是按需输入,可以回车跳过

第三个提示Organization Name (eg, company) [Default Company Ltd]:输入公司名称,可以回车跳过

第四个提示Organizational Unit Name (eg, section) []:输入组织单位或者部门,可以回车跳过

第五个提示Common Name (eg, your name or your server's hostname) []:非常重要,这里可以输入第二级域名 Root AC,例如现在我需要自签一个域名是xiluokeji.com的域名,那么这个地方输入Xiluokeji Root CA

第六个提示Email Address []:输入邮箱地址,可以回车跳过

4.png

上诉命令执行完成后即可在/root/ssl/ca目录下看到ca.crt文件了,这个就是ca证书文件

5.png



创建证书私钥

证书私钥是生成证书的关键,使用下面命令生成私钥

openssl genrsa -out ./server/server.key 2048

不出意外的话就可以在/root/ssl/server目录下看到server.key文件了,这个就是证书私钥

6.png



创建证书签名请求

得到证书私钥后,需要利用证书私钥来创建证书签名请求

命令如下:

openssl req -new -key ./server/server.key -out ./server/server.csr

使用上面命令创建证书签名请求的时候,也会弹出提示,需要按提示输入信息

在弹出来的提示中,前面五个提示和创建CA证书的时候的提示一样,也是按需填入或者是跳过即可

但是Common Name (eg, your name or your server's hostname) []:这个提示,也就是第五个提示是不能跳过的,这里需要填写这个证书的域名,如果是泛域名的话就填写*.xiluokeji.com,如果需要具体域名则填写具体域名,例如www.xiluokeji.com

提示输入邮箱结束后,还会有两个提示,分别是A challenge password []:An optional company name []:,这两个提示直接回车跳过即可。

7.png

这时候就可以在/root/ssl/server目录下看到server.ccr文件了

8.png



创建补丁文件

签名请求创建完成后,需要创建一个补丁文件,使用vi编辑器创建一个名称为v3.ext的文件,然后填入下面内容

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = xiluokeji.com
DNS.2 = *.xiluokeji.com

在早期的网络中,SSL 证书只要在 Common Name里写上域名就算合格了。但随着安全标准升级,现代系统(如 Go 语言、Chrome 浏览器)认为 CN 已经过时且不够安全。v3.ext 的作用就是告诉 OpenSSL:除了基础信息外,还要在证书里加入“现代化的功能字段”(例如 SAN 字段)。

第一行“authorityKeyIdentifier=keyid,issuer”是将证书的公钥 ID 与颁发者(CA)的 ID 关联起来,这可以让系统快速理清是谁签发的证书链关系。

第二行“basicConstraints=CA:FALSE”声明这个证书不是一个 CA 根证书。它只能作为“终端证书”给服务器使用,不能再去签发别的证书。

第三行“keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment”定义了可以干嘛,digitalSignature是数字签名,nonRepudiation是不可否认性,keyEncipherment/dataEncipherment: 密钥和数据加密,是HTTPS的核心。

第四行“subjectAltName = @alt_names”是最重要的,它告诉 OpenSSL:“别只看 CN 字段了,去下面 [alt_names] 列表里找这个证书支持的所有域名。”

最后是“[alt_names]”列表,这里列出了该证书保护的真实名单,DNS.1是主域名,DNS.2使用了通配符域名,也就是这个证书支持这个域名的所有三级域名

9.png



生成证书文件

接下来就可以使用CA证书和签名请求生成服务器证书了,生成服务器证书命令如下:

openssl x509 -req -in ./server/server.csr -CA ./ca/ca.crt -CAkey ./ca/ca.key -CAcreateserial -out ./server/server.crt -days 365 -sha256 -extfile v3.ext

执行完成后就可以得到自签证书文件了

10.png

二维码

发表评论