知识准备
CA证书、自颁发证书、自签名证书
原文链接: CA证书、自颁发证书、自签名证书联系 - KylinZhuang - 博客园
理论基础
ssl : secure socket layer(安全套接层协议)的缩写,通过此协议可以保证两个应用通信的可靠性和保密性。
openssl : 是ssl协议的实现。提供了对称加密算法、非对称加密算法以及秘钥证书管理等功能。
**公钥私钥:**公钥和私钥组成一个密钥对,必须配对使用。一般公钥公开,私钥自己保留。
- 公钥加密,私钥解密,一般用于传输数据;
- 私钥加密,公钥解密,一般用于数字签名、验证身份。
**证书 :**全称是公钥证书,由第三方机构CA颁发。CA利用自己的私钥对真正的公钥施加数字签名并生成证书,客户拿到证书后,通过CA的公钥来对证书解密,拿到真正的公钥。证书有两种编码格式:
- pem :文本格式,以"-----BEGIN…“开头,以”-----end…"结尾,内容是base64编码,Apache和*nginx服务器一般使用这种编码;
- der :二进制格式,不可读,windows服务器一般偏向使用这种。
什么是CA证书、自颁发证书和自签名证书?
CA证书: CA证书是由证书授权机构(Certificate Authority,简称CA)颁发的数字证书。它包含了证书拥有者的身份信息、公钥、私钥以及CA机构的签名,用于在互联网通讯中验证通信实体的身份和公钥的合法性。CA证书是数字签名的技术基础保障,能够证明某一实体的身份及其公钥的合法性。
自颁发证书: 自颁发证书通常是指设备根据CA证书给自己颁发的证书,证书中颁发者名称是CA服务器的名称。这种证书主要用于设备本地,实现简单的证书颁发功能,但设备不支持对其生成的自签名证书进行生命周期管理,如证书更新、证书撤销等。
自签名证书: 自签名证书是由用户自己生成和签名的证书,而不是由公认的证书颁发机构签名。自签名证书分为两种:一种是不带CA的,即用户自己生成证书并签名;另一种是带CA的,即用户自己创建了一个CA并使用该CA签名证书。自签名证书虽然 免费 且未经过权威机构签名,通常 不受浏览器和客户端信任,但其生成过程相对简单,适用于测试环境或内部网络。
应用场景和优缺点:
CA证书: 适用于需要高安全性和信任度的场景,如电子商务网站、在线支付等。
- 优点是受到所有主要浏览器的信任。
- 缺点是需要向CA机构支付费用。
自颁发证书: 主要用于设备本地。
- 优点是实现简单证书颁发功能。
- 缺点是不支持复杂的生命周期管理。
自签名证书: 适用于测试环境、内部网络或个人开发者。
- 优点是免费且生成过程简单。
- 缺点是不受主流浏览器信任,需要手动安装才能使用。
CA证书和自签名证书的异同?
如果想要构建一个成功的网站,安全是关键因素之一,对于需要从访问者那里收集PIA(personally identifiable information,个人识别信息)的网站而言,尤其如此。
考虑一个需要输入社会保险号的网站,或更常见的,需要向其添加信用卡信息以完成购买行为的电子商务网站,在这样的网站上,安全不仅仅是来自那些访问者的期望,更是成功的关键。
如果你正在构建一个电子商务网站,首先就需要一个安全证书以便保证服务器的数据安全,对于证书的选择,即可以创建自签名证书,也可以从证书颁发机构(CA)获得由其签名的证书,让我们看看这两种证书的异同。
CA签名的证书和自签名证书的相似性
无论你的证书是由CA签名的,还是自己签名的,有一件事是完全相同的:你会得到一个安全的网站。通过HTTPS/SSL连接发送的数据将被加密,第三方无法窃听。
既然自签名证书也能做到这一点,那为何要向CA付款呢?
CA告诉你的客户:此服务器信息已由”信任源点“验证,最常用的CA是Verisign。CA会验证你的域名的所有权并颁发证书,这就能保证网站是安全而且合法的。
使用自签名证书的问题是,几乎每一个Web浏览器都会检查HTTPS连接是否由可信的CA签名,如果该连接是自签名的,则会将其标记为潜在风险并弹出错误消息,你的客户对该站点信任度就会降低。
**简要总结:**CA签名的证书兼具“身份证明”和“加密”双重功能,而由于自证身份不可信,自签名证书就只有加密功能,用于无需身份证明的场合。
在何种情况下可以使用自签名证书?
由于它们提供了相同的保护能力,所以能在任何使用CA签名证书的场合中使用自签名证书,但在某些场合特别适用自签名证书。例如,自签名证书非常适合测试HTTPS服务器,你不必仅仅为测试网站就要支付CA签名证书的费用,只需提醒测试人员他们的浏览器可能弹出警告信息。
也可以在需要输入隐私信息的情况下使用自签名证书,例如:
- 用户名和密码表单
- 收集个人(非财务)信息
当然,只有那些了解并信任你的人才会使用这样的网站。所以你看到了,归根结底就是“信任”二字。当你使用自签名证书时,你是在对客户说:“请相信我——我就是我说的我”;当你使用由CA签名的证书时,你是在说:“请相信我——因为Verisign可以证明我的身份”。
如果你在做电子商务,就需要一个CA签名证书。如果你使用自签名证书只是为了客户登录你的网站,那么他们可能会原谅你,但如果要求他们输入信用卡或Paypal的信息,那么你真的需要一个CA签名的证书,因为大多数人信任CA签名的证书,如果没有它,就不会通过HTTPS服务器做生意。所以如果你想在你的网站上卖东西,那就投资于证书吧,这只是做生意的成本。
关于PEM, DER, CRT, CER,KEY等各类证书与密钥文件后缀的解释
原文链接:一文搞懂:PEM, DER, CRT, CER, KEY等各类证书与密钥文件后缀解析
在计算机科学和安全领域,PEM, DER, CRT, CER, KEY等文件后缀经常出现在证书和密钥文件的命名中。这些后缀代表了不同的文件格式和编码方式,对于理解它们的含义和应用至关重要。本文将逐一解析这些后缀,帮助读者更好地理解和使用。
PEM(Privacy-Enhanced Mail)
PEM是一种基于ASCII编码的证书和密钥存储格式,广泛应用于安全领域,特别是在SSL/TLS协议中。PEM文件通常以“.pem”为后缀名,可以包含公钥、私钥、证书等敏感信息。PEM文件使用Base64编码,并且包含了起始标记和结束标记,以便于识别和区分不同类型的密钥和证书。由于PEM格式具有良好的可读性和可编辑性,它成为了一种广泛使用的证书和密钥文件格式。
DER(Distinguished Encoding Rules)
DER是一种二进制编码格式,用于表示X.509证书、CRL(证书吊销列表)和PKCS#7等数据结构。DER文件通常以“.der”或“.cer”为后缀名。与PEM格式相比,DER格式更加紧凑和高效,因为它使用二进制编码而不是Base64编码。然而,DER格式的文件不易于阅读和编辑,通常需要专业的工具才能查看和解析。
CRT(Certificate)和 CER(Certificate)
CRT和CER都是证书文件的扩展名,它们通常用于存储X.509证书。在Windows平台上,CRT文件通常用于存储公钥证书,而CER文件则用于存储包含公钥和私钥的证书。然而,在实际应用中,CRT和CER文件的区别并不严格,它们通常可以互换使用。CRT文件通常使用PEM或DER格式进行编码,而CER文件则通常使用DER格式进行编码。
KEY(Key)
KEY文件通常用于存储私钥或公钥。与证书文件不同,KEY文件只包含密钥信息,不包含证书信息。KEY文件可以使用PEM或DER格式进行编码。使用PEM格式编码的KEY文件具有良好的可读性和可编辑性,而使用DER格式编码的KEY文件则更加紧凑和高效。
总结
PEM、DER、CRT、CER和KEY等文件后缀代表了不同的证书和密钥文件格式和编码方式。在实际应用中,我们需要根据具体的需求和场景选择合适的文件格式和编码方式。例如,在需要可读性和可编辑性的情况下,我们可以选择使用PEM格式;在需要紧凑和高效的情况下,我们可以选择使用DER格式。同时,我们还需要注意不同文件格式之间的转换和兼容性,以确保证书和密钥的正确性和安全性。
CA与HTTPS理论_网络安全ca
网络安全服务基础Windows–第15节-CA与HTTPS理论_网络安全ca-优快云博客 文章介绍的更加详细,如共享的秘密密钥等。
自颁发证书、自签名证书
应用场景和网站环境
**应用场景:**内网测试。
网站环境:
准备域名,自定义要使用的域名为 t17.cn,网站分别是 wtd.t17.cn 和 qrg.t17.cn, 确保通过域名 80端口 能够正常(包括局域网)访问(关于nginx配置80口可上网查找其他资料或参考安装Tiny Core Linux 和 部署nginx_linux tiny安装-优快云博客 文章中的 配置基于域名的虚拟主机)。
wtd.t17.cn 如下图所示

qrg.t17.cn 如下图所示

工具
本文使用的工具是XCA。
XCA(X Certificate and key management) 是作为证书和密钥存储,以及作为签发证书的签名应用程序,是一个开源 (项目地址)的工具,底层还是基于openssl的类库和API的。进入 下载 页面,选择免安装版即可,目前的版本是2.8.0,点击 xca-portable-2.8.0.zip 下载。

下完成后,自行找个地方解压,运行 xca.exe。
自颁发证书
参考文章 使用XCA自制CA证书并签发https证书 - Giant150 - 博客园
创建CA证书



设置密码,后点击确定

提示不安全的PKCS#12算法,自然选择更改

点击 PKCS#12加密算法 的下拉框修改加密算法

只有 AES-256-CBC 一项是安全的,选择完成后点击 确定

右下角显示打开的数据库路径

切换到 私钥 页面,点击 创建密钥 (也可以直接点击 创建证书 跳过创建密钥这一步,在创建证书的过程中在生成密钥,都是一样的)

为密钥起名,不要轻易修改密钥类型(有可能有的浏览器会有问题)(待修订?)

切换到 证书 页面,点击 创建证书

来源页, 签名算法选择 SHA512 ,不要选择 SHA3 系列,选择SHA3-512,浏览器返回消息是错乱的数据(还没搞明白的地方)。

主题页,填写基本信息

扩展页,设置证书类型和有效期
可以参考 自建CA实战之 《0x00 环境的准备》_xca 密钥用法-优快云博客 文章中的各种类型的密钥用法的含义

密钥用法页,设置证书的用途,点击 确定 执行创建证书

证书页中显示创建的证书
导出证书
把这个 CA 证书导出,然后再导入到局域网内的其他电脑,以后这个 CA 证书 签发的所有证书就都会自动信任


导入证书
导出 CA 证书 (T17-CA.crt)拷贝到局域网内其他电脑上,打开命令行工具 输入
mmc

按下键盘上 回车 键

点击 文件 - 添加/删除管理单元(M)

选择 证书 点击 添加

选择 计算机账户 ,点击 下一页

点击 完成

点击 确定

展开 证书(本地计算机) - 受信任的根证书颁发机构 - 证书,在 证书 上右键选择 所有任务 - 导入

点击 下一步

选择 CA证书 T17-CA.crt 文件, 点击 下一步

保持默认(在导出时就只导出CA根证书),点击 下一步

点击 完成

可以看到 T17 CA 颁发给 T17 CA ,这就完成了 自颁发证书 操作。 关闭 控制台1。
自签名证书
网站签名
有了 CA 证书,就可以为网站进行签名

选择 T17-CA CA证书,点击 创建证书

按图上1到4操作后,需要注意的是 使用模板选择的是 TLS_Server,切换到 主题 界面

填入 基础信息 (这和自颁发证书中描述是一样的), 这里以 T17 的WEB服务为例填写,然后点击 生成新密钥 (因为没有密钥分配所以私钥中显示空,密钥是必要的)

弹出的新密钥框中输入内部名称,最好加上关键字 KEY,需要注意的是密钥类型使用默认(切换成其他可能存在浏览器不兼容等情况,待后续切换其他试用验证),在xca数据库导出时容易区分KEY和证书,点击 创建。

创建完成,可以看到选择了新创建的密钥,切换到 扩展

类型 选择 终端实体(End Entity),按图上进行设置。第4步 X509v3 Subject Alternative Name 编辑是主要操作,这里就是设置要签名的网站,点击编辑后弹出下面的界面

选择IP表示为IP进行签名,选择DNS表示为域名签名。本文中描述要为两个网站签名,采用为二级域名的所有子域名通配签名方式

双击内容列,输入 *.t17.cn ,其中 * 是通配符,点验证测试是否通过,点击 应用 确定

切换到 密钥用法 页面

按图上配置后点击 确定

导出签名证书和密钥
导出签名证书

选择 网站签名证书 ,点击 右侧的 导出 按钮

选择 PEM证书链(.pem) ,点击 确定
导出密钥
切换到 私钥 页面点击 导出

配置网站(nginx) SSL
签名证书文件和私钥文件部署

经过 导出签名证书和密钥 操作,得到 T17-WEB.pem 签名证书文件和 T17-WEB-KEY.pem 网站私钥文件,把这两个文件拷贝到 nginx 配置目录ssl文件(没有可以自己建,路径随便,只要配置中能找到就可以),并把 T17-WEB-KEY.pem 重新命名为 T17-WEB.key (这不是必须,只是看的整齐些)

修改nginx的配置文件
打开 nginx 的配置文件,将两个网站的 80端口的配置拷贝并都复制一份,其中以 wtd.t17.cn 为例
wtd.t17.cn 80口配置
server {
listen 80;
server_name wtd.t17.cn;
location / {
proxy_pass http://192.168.1.92:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
wtd.t17.cn 443口配置
server {
listen 443 ssl; # 修改端口号
server_name wtd.t17.cn;
ssl_certificate ssl/T17-WEB.pem; # ssl 签名证书
ssl_certificate_key ssl/T17-WEB.key; # ssl 签名密钥
location / {
proxy_pass http://192.168.1.92:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
通过命令行方式进入到nginx的目录,启动 nginx,这样可以直接看到是否有错误,如下

报告了一条绑定 443 端口失败了,根据自己的情况查找分析并解决问题,本文中是因为svn的服务占用了443,将其停止掉后再次运行,看到没错误。

停止 nginx 再开一个命令窗口 输入
nginx -s "stop"

在浏览器中输入
https://wtd.t17.cn

https://qrd.t17.cn

Edge浏览器地址栏中 已经没有 不安全 字样了,显示的是 https
http重定https
将80口的内容修改如下
server {
listen 80;
server_name wtd.t17.cn;
return 301 https://$host$request_uri;
}
server {
listen 80;
server_name qrg.t17.cn;
return 301 https://$host$request_uri;
}
Nginx SSL 性能优化
性能优化不是本文的重点。引用参考文章
3324

被折叠的 条评论
为什么被折叠?



