【实战总结】自签证书

友情提示:自签名的SSL证书存在安全隐患,在生产环境上需要购买和使用经权威机构认证和颁发的证书
 

一、理论基础

前提:安装了OpenSSL

先推荐一篇https的文章可帮助了解CA证书的用途,比较长但很值得专心读完:https://blog.csdn.net/weixin_41385912/article/details/110605359

概念
CA:认证机构。有自己的证书,可以拿自己的证书给别人签名然后收钱,互联网中最顶级就叫根证书。在这里我们会虚拟出一个CA机构,然后用他来给自己的证书认证签名。
(网站)证书 :发送给客户端的证书,其中大部分是公钥。是一个包含自己网站的公钥、认证、签名等信息的文件。
(网站)私钥 :服务器留存的解密私钥(server)
注意区分 CA机构的证书(可以拿来给其他网站证书签名)和 自己网站的证书(不可以),不一样

基本流程

1、搞一个虚拟的CA机构,生成一个证书
2、生成自己的密钥,然后填写证书认证申请,拿给上面的CA机构去签名,于是就得到了(自建CA机构认证的)签名证书

3、使用:在Server中配置
声明开启HTTPS (SSL认证)
声明侦听443端口(并确保已在防火墙上打开443端口)
复制已签名的SSL证书和私钥到指定位置,并设置正确的文件权限
配置已签名的SSL证书(.crt)的位置
配置已签名的SSL证书私钥(.key)的位置
配置将HTTP请求都重定向到HTTPS

4、在浏览器中访问
在浏览器中打开https://来访问。
在Firefox浏览器中可以添加Security Exception来忽略HTTPS错误警告。
Chrome浏览器可以尝试通过导入CA证书的方式来忽略HTTPS错误警告。

二、实战部分

第4步 提供了脚本附件

1、根据实际的机器ip,在extCfg_client.ext 和extCfg_server.ext中修改配置,其中下面的配置可以根据需要任意增加多个,这样生成的证书就会对多个IP地址有效。

IP.1 = 17.1.1.17
DNS.1 = local.domain

2、把extCfg_client.ext 、extCfg_server.ext、createCrt.sh放在同一个目录下,执行createCrt.sh脚本就可以生成证书。

3、 证书格式转换(拿到的证书文件后,可以根据实际需要做一下PKCS#8编码 格式转换)

我们知道pkcs8是私钥的语法标准。看到支付宝的文档上有个注意事项:java用户需要将私钥转换成pkcs8格式,而对于.net和php则不需要。在php5.5.29测试,确实对于php私钥转不转pkcs8都可以加解密。

在用java作为服务器端语言,对信息进行RSA签名的时候,私钥要求是PKCS8格式的。可以通过以下命令对原始key进行格式转换:

.key结尾的client.key、server.key文件类似下面这样转换一下就得到新的new_client.key文件

openssl pkcs8 -in client.key -topk8 -nocrypt -out new_client.key

4、附件

extCfg_client.ext

keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName=@SubjectAlternativeName

[ SubjectAlternativeName ]
IP.1 = 17.1.1.181
DNS.1 = client.local.domain.181
IP.2 = 17.1.1.182
DNS.2 = client.local.domain.182

extCfg_server.ext

keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName=@SubjectAlternativeName

[ SubjectAlternativeName ]
IP.1 = 17.1.1.171
DNS.1 = server.local.domain.171
IP.2 = 17.1.1.172
DNS.2 = server.local.domain.172

createCrt.sh

#!/bin/bash

#第一部分:虚构一个CA认证机构出来

# 生成CA认证机构的证书密钥key,需要设置密码4位以上
openssl genrsa -passout pass:1111 -des3 -out ca.key 4096
# 用私钥ca.key生成CA认证机构的证书ca.crt
# 其实就是相当于用私钥生成公钥,再把公钥包装成证书,这个证书ca.crt有的又称为"根证书",因为可以用来认证其他证书
openssl req -passin pass:1111 -new -x509 -days 365 -key ca.key -out ca.crt -subj "/CN=testCA.com"


#第二部分:生成网站的证书(server),用上面那个虚构出来的CA机构来认证

# 生成自己网站的密钥server.key,需要设置密码4位以上
openssl genrsa -passout pass:4444 -des3 -out server.key 4096
# 生成自己网站证书的请求文件,如果找外面的CA机构认证,也是发个请求文件给他们
# 这个私钥就包含在请求文件中了,认证机构要用它来生成网站的公钥,然后包装成一个证书  
openssl req -passin pass:4444 -new -key server.key -out server.csr -subj "/CN=server.local.domain"
# 使用虚拟的CA认证机构的证书ca.crt,来对自己网站的证书请求文件server.csr进行处理,生成签名后的证书server.crt,注意设置序列号和有效期(一般都设1年)
openssl x509 -req -passin pass:1111 -days 365 -in server.csr -extfile extCfg_server.ext -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
#(拓展内容,不需要的话可以注释掉)去除私钥中的密码 注意:-in输入的是有密码的私钥server.key,-out输出的是没有密码的私钥server.key
openssl rsa -passin pass:4444 -in server.key -out server.key
#证书格式转换,合成 pkcs#8 证书(含私钥)
openssl pkcs8 -topk8 -nocrypt -in server.key -out server.pem  


#第三部:生成访问用户(client)的证书,用上面那个虚构出来的CA机构来认证

openssl genrsa -passout pass:5555 -des3 -out client.key 4096
openssl req -passin pass:5555 -new -key client.key -out client.csr -subj "/CN=client.local.domain"
openssl x509 -passin pass:1111 -req -days 365 -in client.csr -extfile extCfg_client.ext -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
openssl rsa -passin pass:5555 -in client.key -out client.key
openssl pkcs8 -topk8 -nocrypt -in client.key -out client.pem


常用后缀名

.crt .cer    证书(Certificate) 由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息
.key    密钥/私钥(Private Key) 服务器上的私钥文件,用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密
.csr    证书认证签名请求(Certificate signing request) 证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名
*.pem    base64编码文本储存格式,可以单独放证书或密钥,也可以同时放两个;base64编码就是两条-------之间的那些莫名其妙的字符;
        PEM的明显好处是可以安全地粘贴到电子邮件的正文中,因为它具有定位线并且是7位纯净的。不要太注意文件扩展名;
        该名称来自“ 隐私增强邮件(PEM)”,这是一种用于保护电子邮件的失败方法,但是其使用的容器格式仍然存在,并且是x509 ASN.1密钥的base64转换。
*.der    证书的二进制储存格式(不常用)

参数说明

# genrsa    生成RSA私钥
# rsa  RSA数据管理
# -passin 输入这个加密密钥文件的解密密钥(如果在生成这个密钥文件的时候,选择了加密算法了的话)
# -passout 如果希望输出的密钥文件继续使用加密算法的话则指定密码 

# -des3    des3算法
# -out server.key 生成的私钥文件名
# 2048 私钥长度

# req 生成证书签名请求
# -req 表明输入文件是一个"请求签发证书文件(CSR)",等待进行签发 
# -new 新生成
# -key 私钥文件
# -out 生成的CSR文件
# -subj 生成CSR证书的参数 set or modify request subject
# -days 证书有效期
# -nocrypt 

#在密码学中,X.509是一个标准,规范了公开秘钥认证、证书吊销列表、授权凭证、凭证路径验证算法等。
# x509 输出一个X509格式的证书
# -x509 加上-x509 表示直接输出证书

# subjectAltName,主体别名扩展项。为证书提供了形式更加灵活的命名方式,理论上可以包含IP地址、URL、email、DNS域名、RID(已注册对象标识)及IP地址等信息作为主体别名。

subj参数说明如下:

字段    字段含义    示例
/C=    Country 国家    CN
/ST=    State or Province 省    Guangdong
/L=    Location or City 城市    Guangzhou
/O=    Organization 组织或企业    xdevops
/OU=    Organization Unit 部门    xdevops
/CN=    Common Name 域名或IP    gitlab.xdevops.cn

参考文档(以下文档值得结合本文一起阅读,理解会更透彻)

https://blog.csdn.net/nklinsirui/article/details/89432430
https://www.jianshu.com/p/0e9ee7ed6c1d
https://blog.csdn.net/scuyxi/article/details/54884976
https://blog.csdn.net/gengxiaoming7/article/details/78505107
https://blog.csdn.net/cangzihu/article/details/53488995
https://blog.csdn.net/Crystal360/article/details/79291393
https://blog.csdn.net/wzfgd/article/details/109805158
https://qastack.cn/server/9708/what-is-a-pem-file-and-how-does-it-differ-from-other-openssl-generated-key-file

使用OpenSSL工具制作X.509证书的方法及其注意事项总结

如何使用OpenSSL生成RSA公钥和私钥

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值