文章目录

  1. 前置知识
  2. 生成一份 CA 根证书
  1. 创建私钥
  2. 生成证书请求文件(CSR)
  3. 自签署证书
  1. 颁发服务器证书
  1. 创建服务器私钥
  2. 生成证书请求文件(CSR)
  3. 使用 CA 证书进行签署,生成 crt 文件
  1. 实践总结
  2. 对于 IIS 的设置
  3. 解决 Chrome 报 missing_subjectAltName 的问题
  4. 更多用法
  1. 通过配置文件,非交互式生成证书请求文件(CSR)
  2. 一句话生成 key 和 crt 文件
  1. 自制脚本

在安装小插曲 make config 的时候,可能会提示libssl.so.1.1找不到,已经安装libssl 解决方法添加搜索path echo "/usr/local/lib64" >> /etc/ld.so.conf ldconfig -v


  1. 前置知识 KEY 通常指私钥。

CSR 是 Certificate Signing Request 的缩写,即证书签名请求,这不是证书,只是包含申请证书的基本信息。生成证书时要把这个提交给权威的证书颁发机构,颁发机构审核通过之后,再根据这些申请信息生成相应的证书。

CRT 即 certificate的缩写,即证书。

X.509 是一种证书格式。对X.509证书来说,认证者总是CA或由CA指定的人,一份X.509证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息。

X.509的证书文件,一般以.crt结尾,根据该文件的内容编码格式,可以分为以下二种格式:

PEM - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN…“开头,”-----END…"结尾,内容是 BASE64 编码。Apache 和 *NIX 服务器偏向于使用这种编码格式。

DER - Distinguished Encoding Rules,打开看是二进制格式,不可读。Java 和 Windows 服务器偏向于使用这种编码格式。

  1. 生成一份 CA 根证书
  1. 创建私钥 #输出 key 密钥文件。

openssl genrsa -des3 -out ca.key 2048 # 长度为2048 1 2 3 参数说明:

genras 使用 rsa 算法生成密钥。 -des3 (可选)加密密钥,此时需要设置密码,后续使用该密钥时需要验证密码才能使用。 -out 生成私钥文件。 chmod 400 ca.key (修改权限为仅root能访问) openssl rsa -noout -text -in ca.key (查看创建的证书

  1. 生成证书请求文件(CSR) #输入 key 文件, 输出 csr 请求文件。

openssl req -new -key ca.key -out ca.csr 1 2 3 参数说明:

req 产生证书签发申请命令。 -new 新的申请。 -key 输入的 key 文件,由第一步生成。 -out 输出为 CSR 文件,这是一个请求文件。 运行此命令后进入交互模式,需要输入一些证书信息。

一般需要输入的信息如下:

C 国家 ST 省份 L 市 O 机构 OU 部门 CN (Common Name) 一般是域名 emailAddress 邮箱 3) 自签署证书 正常的证书是你把上面生成的请求文件(.CSR)发送给可信机构(CA),让可信机构根据你的请求去生成和签署证书,再给你发回来。这里是自己给自己签署。

#输入 csr 请求文件,指定签署的 key,输出证书 crt 文件。

openssl x509 -req -sha256 -days 3650 -in ca.csr -signkey ca.key -out ca.crt 1 2 3 参数说明:

x509 签发X.509格式证书命令。 -req 证书输入请求。 -days 证书有效天数。 -in 输入文件,这里是上一步生成的请求文件(.CSR) -signkey 签名密钥(key)文件,由第一步生成。 -out 输出文件,生成证书文件(.CRT)。 以上 2、3 两步可以合成一步来执行:

#输入 key 文件,输出证书 crt 文件。(自签署)

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

chmod 400 ca.crt (修改权限为仅root能访问) openssl x509 -noout -text -in ca.crt (查看创建的证书)

省去生成请求文件的步骤。

此时 CA 证书生成完成。

一般情况下,上面的 key 和 crt 可以直接拿来应用了。 以下演示把当前的证书当成 CA 给其他的请求进行颁发证书。

  1. 颁发服务器证书
  1. 创建服务器私钥 #输出 key 密钥文件。

openssl genrsa -out server.key 2048 # 长度为2048 1 2openssl rsa -noout -text -in servert.key 3 参数说明:

genras 使用 rsa 算法生成密钥。 -out 生成私钥文件。 2) 生成证书请求文件(CSR) #输入 key 文件, 输出 csr 请求文件。

openssl req -new -key server.key -out server.csr 1 2 3 参数说明同上一节。

  1. 使用 CA 证书进行签署,生成 crt 文件 #输入服务器给的 csr 请求文件,使用指定 CA 的私钥和证书来签署,输出服务器证书 crt。

openssl x509 -req -sha256 -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt 1 2 3 4. 实践总结 CA 证书和服务器证书的区别只有最后签署时,是自己给自己签署,还是让别人给你签署。 实际应用时需要的是私钥(key)和证书(crt)文件。其中私钥文件很重要,不要公开出去。证书文件可以随意分发。 把 crt 证书文件加入可信任的根机构中,则该证书和其签署的所有证书都会被信任。那么在一个机构内部可以自建一个 CA 证书,CA 证书加入可信列表,然后机构内部的所有其他证书都使用该证书来签署,则只需要信任一次就够了。 nginx 中使用 ssl 的方式是,在配置文件中加入以下语句:

ssl_certificate /path/to/your.crt; ssl_certificate_key /path/to/your.key; 1 2 5. 对于 IIS 的设置 在 IIS 中,需要的是一个 PFX 文件,这个文件需要包含 key 和 crt。生成方法如下:

#输入 key 和 crt 文件,输出 pfx 文件。

openssl pkcs12 -export -inkey server.key -in server.crt -out server.pfx 1 2 3 执行上述命令时,会要求输入一个 export 密码。 该密码在导入 pfx 文件时需要。

在 IIS 中选择“导入证书”,文件选择该 pfx 文件,密码填写导出时的密码,导入位置选择“个人”。

如要修改证书的 friendly name ,则在证书管理中修改(需要从 mmc 中打开计算机级别的证书管理器)。

  1. 解决 Chrome 报 missing_subjectAltName 的问题 chrome 会查看当前域名是否在证书中声明,该声明由 subjectAltName 字段设置。上述的生成步骤默认未设置该字段。

解决方法如下:

新建一个文件,起名为 v3.ext (名字自定),编辑内容如下:

subjectAltName = @alt_names

[alt_names] DNS.1 = www.company.com DNS.2 = company.com DNS.3 = *.company.net 1 2 3 4 5 6 域名要与你的证书实际绑定的域名一致。如有多个域名,按示例写多个。

在签署时,额外增加一个参数: -extfile v3.ext

#这是上面服务器签署的示例,只在最后增加一个参数,指定扩展字段的配置文件。

openssl x509 -req -sha256 -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -extfile v3.ext 1 2 3 7. 更多用法

  1. 通过配置文件,非交互式生成证书请求文件(CSR) 新建一个文件,如 my.cnf ,相应字段按自己需求修改:

[req] default_bits = 2048 prompt = no default_md = sha256 distinguished_name = req_distinguished_name

[req_distinguished_name] C = CN ST = GuangDong L = ShenZhen O = your_company OU = your_organize CN = www.myserver.com emailAddress = admin@myserver.com 1 2 3 4 5 6 7 8 9 10 11 12 13 14 在生成请求文件时,额外增加参数: **-config my.cnf **

#指定配置文件,此时不会出现交互模式,相交信息自动设置。

openssl req -new -key server.key -out server.csr -config my.cnf 1 2 3 2) 一句话生成 key 和 crt 文件 该情形适合于自签署证书时。

请求的配置和 ext 的配置可以写在一起,如下

[req] default_bits = 2048 prompt = no default_md = sha256 distinguished_name = req_distinguished_name x509_extensions = v3_req

[req_distinguished_name] C = CN ST = GuangDong L = ShenZhen O = your_company OU = your_organize CN = www.myserver.com emailAddress = admin@myserver.com

[v3_req] keyUsage = critical, digitalSignature, keyAgreement extendedKeyUsage = serverAuth subjectAltName = @alt_names

[alt_names] DNS.1 = myserver.com DNS.2 = *.myserver.com 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 然后运行如下命令:

#一句命令,输入配置文件 my.conf, 输出 key 和 crt 文件。适合于自签署证书。

openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:1024 -keyout app.key -out app.crt -config my.conf 1 2 3 8. 自制脚本 参见: https://github.com/ljskr/ssl_tool ———————————————— 版权声明:本文为CSDN博主「LJSKR」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/ljskr/article/details/84570254