转换框架拓扑
x1# OpenSSL将PEM转换为DER
2openssl x509 -outform der -in certificate.pem -out certificate.der
3
4# OpenSSL将PEM转换为PFX
5openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt
6
7# OpenSSL将将PFX转换为PEM
8openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes
9
10# jk
11C:\www.haudi.top._jks>keytool -list -keystore www.haudi.top.jks
12输入密钥库口令:
13密钥库类型: jks
14密钥库提供方: SUN
15
16您的密钥库包含 1 个条目
17
18www.xinbzhiba.cn, 2022-8-3, PrivateKeyEntry,
19证书指纹 (SHA1): D9:02:7B:74:F6:62:39:28:4B:E1:45:2F:A6:C4:D4:8D:67:D4:00:1A
20
21Warning:
22JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore www.haudi.top.jks -destkeystore www.haudi.top.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
23
24C:\www.haudi.top_jks>keytool -importkeystore -srckeystore www.haudi.top.jks -destkeystore www.haudi.top.jks -deststoretype pkcs12
25输入源密钥库口令:
26已成功导入别名 www.cqbszwfw.com.cn 的条目。
27已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消
28
29Warning:
30已将 "www.haudi.top.jks" 迁移到 Non JKS/JCEKS。将 JKS 密钥库作为 "www.haudi.top.jks.old" 进行了备份。
31
32C:\www.haudi.top._jks>
由于windows同时支持Base64/DER/pkcs12/pkcs7等编码方式的直接导出与转换(前提是扩展名要注意修改为常见的,否则默认双击打不开)
其中,windows中如果需要在导入证书时同时导入私钥,则需要先转换为pkcs12编码格式pfx才可以同时导入。单独导入证书不含私钥时,直接双击证书文件安装即可。
为方便验证,在此提供证书附件以供分析测试。
证书管理器或certmgr.msc
。Windows中的certmgr.msc
可让您查看有关证书,导出,导入,修改,删除或请求新证书的详细信息。根证书是用于管理网络认证和信息交换的数字文档。
选择已有证书上右键可以进行查看、导出、删除等管理操作,不选中具体某个证书时则可以导入证书
点击浏览器小锁图标,复制到文件,弹出证书导出向导...
首先证书的扩展名不重要,关键是看打开的程序怎么或能否实别文件内容。
不同编码格式都只是一种对原始数据的封装结果,与你肉眼看的是纯文本格式或二进制无关。说到这里,你会发现就像视频文件格式那样封装的格式又被称为数据的容器。其实你并没有直接看到原始数据(在计算机中是二进制),它却以多种编码形式在传播。下面介绍一般性的扩展名定义。
从Base64编码格式说起
.PEM = PEM扩展、.crt等 用于不同类型的X.509v3文件,是开始以-----BEGIN CERTIFICATE-----
,结束以-----END CERTIFICATE-----
为形式的ASCII(Base64)数据。Base64是一种基于64个可打印字符来表示数据的方法。
示例
xxxxxxxxxx
141-----BEGIN CERTIFICATE-----
2MIIGFTCCBP2gAwIBAgIQCOfT1LiMRgZbGpLeR8aRWjANBgkqhkiG9w0BAQsFADBy
3MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
4SW5jLjEdMBsGA1UECxMURG9tYWluIFZhbGlkYXRlZCBTU0wxHTAbBgNVBAMTFFRy
5dXN0QXNpYSBUTFMgUlNBIENBMB4XDTIxMTAzMDAwMDAwMFoXDTIyMTAyOTIzNTk1
6
7... 省略,总行数与证书生成时指定的位数有关,比如512、1024、2048、4096 bit
8...
9
10bNHcu9k4PaTOYnkPc+wmHRM0KzpAEiepPjdN0re0RguCvhdC3wbHO7bHuMKhDYwL
11eydOEnR74m2UxBhlfiIDsDv9lG/qwx1U+gnprIeC92T7afbQ4LZpSJZagdATP9qF
124cHDuBQtSRy8eBiH4MZk+9mwKN6Sq1VGy0YZxI3RoSsBbv5m8fwqH9H8NIPIGT+j
13Sfargc2AmGLpe9acDwqsgrz7NAEj298TRg==
14-----END CERTIFICATE-----
在应用中此编码格式可被nginx直接加载使用。其它类型
xxxxxxxxxx
31# nginx config
2ssl_certificate /usr/local/nginx/cert/ssl.pem; # pem文件的路径
3ssl_certificate_key /usr/local/nginx/cert/ssl.key; # key文件的路径,此key的形式是-----BEGIN RSA PRIVATE KEY-----,下面有示例
此处对比一下Openssl生成(ssh-keygen调用生成)的另一种类似格式,它一般被称作私钥(PRIVATE KEY),它们都是Base64纯文本且启止标记不同,所以是可以粘贴放在同一个文件中的。
xxxxxxxxxx
131-----BEGIN RSA PRIVATE KEY-----
2MIIEogIBAAKCAQEAp2pBrjVfiQoBu1D7iKQWMg0Hk1QIGQviJ3IbUQIIew8jSJPq
39e30iYkLqn3iyFlYE9ObzaxFCVxMFvd1neHWPKtk2lGWO9UpQkBHgntaX1+aiSnI
4qvYq38dqSL/jNqUsKr5cnX7+KiOFoU4fj2Jc1v1NNyKVcDd0iQ7bvz78zLf0m6QI
5
6... 省略,总行数与证书生成时指定的位数有关,比如512、1024、2048、4096 bit
7...
8
9vYu5AoGADaK1nRLWOlWyNfu47onGCVZkkQfBgmV+7KgRvRG3+2lvFXHy78zlYVYV
10JNP4MiNhFmd73GmXI6tKaxWTuDaqD0PfoGBO17X+9Hdf2twRpW0py3QguZg2tmZQ
11+yajJWq4ZCrrkO3HpY8f2Pa5Y+LtKbRcLfofYKwtgh7V4SiShrQ=
12-----END RSA PRIVATE KEY-----
13
DER扩展用于二进制DER编码证书
https://blog.csdn.net/linux_tcpdump/article/details/122136274
在windows中DER或Base64编码的证书不论是以.crt
、.cer
作为扩展名在双击或右键证书文件安装证书时都能自动识别。
https://blog.csdn.net/xiangguiwang/article/details/76400805
由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名。
公钥加密技术12号标准(Public Key Cryptography Standards #12,PKCS#12)为存储和传输用户或服务器私钥、公钥和证书指定了一个可移植的格式。它是一种二进制格式,这些文件也称为PFX文件。开发人员通常需要将PFX文件转换为某些不同的格式,如PEM或JKS,以便可以为使用SSL通信的独立Java客户端或WebLogic Server使用。
二进制编码的证书
证书中没有私钥,DER 编码二进制格式的证书文件,以cer作为证书文件后缀名。
Base64编码的证书
证书中没有私钥,私钥文件可单独也可以共存于一个文件中,BASE64 编码格式的证书文件,也是以cer作为证书文件后缀名。
在pfx证书的导入过程中有一项是“标志此密钥是可导出的。这将您在稍候备份或传输密钥”。一般是不选中的,如果选中,别人就有机会备份你的密钥了。如果是不选中,其实密钥也导入了,只是不能再次被导出。这就保证了密钥的安全。
如果导入过程中没有选中这一项,做证书备份时“导出私钥”这一项是灰色的,不能选。只能导出cer格式的公钥。如果导入时选中该项,则在导出时“导出私钥”这一项就是可选的。
如果要导出私钥(pfx),是需要输入密码的,这个密码就是对私钥再次加密,这样就保证了私钥的安全,别人即使拿到了你的证书备份(pfx),不知道加密私钥的密码,也是无法导入证书的。相反,如果只是导入导出cer格式的证书,是不会提示你输入密码的。因为公钥一般来说是对外公开的,不用加密
------------ pfx密钥 -----------
公钥 加密+验证签名
私钥 解密+签名
------------ pfx密钥 -----------
pfx 本来就不应该在网络上传播… 生成新的客户端证书只需要传 CSR, CER … 正确的过程应该是:
客户端: 生成私钥, 填写证书相关信息 CN/O/OU/EMail 等等, 用 私钥生成 证书请求 CSR …
把 CSR 通过网络发给 CA
CA: 对 CSR 进行签名, 生成 CER
CA 把证书发送回来
客户端: 打包私钥 + CER 为 PKCS#12 (pfx) 文件.
整个过程都不会传递私钥.
前面的的编码说的是原始数据的封装编码格式,下面说明查看证书中的有效信息(程序实现)
不同的浏览器不同,点击网址栏中的小锁图片
certutil命令是windows上的证书管理命令,支持文件转码
xxxxxxxxxx
21certutil -?
2# 查看更多帮助,本文不再赘述。
如前some.domain.crt.cer为Base64编码证书文件
如前示例1111.cer为DER二进制编码格式
此工具在各平台都可以获取使用
xxxxxxxxxx
181# 查看不同扩展名,但实际都是Base64编码的证书文件
2
3openssl x509 -in cert.pem -text -noout
4
5openssl x509 -in cert.cer -text -noout
6
7openssl x509 -in cert.crt -text -noout
8
9
10# 报错时一般是DER编码证书,使用如下命令查看
11
12openssl x509 -in certificate.der -inform der -text -noout
13
14# 转换
15# PEM到DER
16openssl x509 -in cert.crt -outform der-out cert.der
17# DER到PEM
18openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
在某些情况下,将多个X.509基础设施组合到单个文件中是有利的。一个常见的例子是将私钥和公钥两者结合到相同的证书中。
组合密钥和链的最简单的方法是将每个文件转换为PEM编码的证书,然后将每个文件的内容简单地复制到一个新文件中。这适用于组合文件以在Apache中使用的应用程序。
jks是jdk(java虚拟机)用的keystore文件。
pfx是pkcs12加密标准下的证书格式。它是一种更加通用且广泛使用的格式。
PKCS#12是一种交换数字证书的加密标准,用来描述个人身份信息。如:用户公钥、私钥、证书等。在密码学中,PKCS #12定义了一种存档文件格式,用于实现存储许多加密对象在一个单独的文件中。通常用它来打包一个私钥及有关的 X.509 证书,或者打包信任链的全部项目
下面是转换过程
xxxxxxxxxx
231C:\www.haudi.top._jks>keytool -list -keystore www.haudi.top..jks
2输入密钥库口令:
3密钥库类型: jks
4密钥库提供方: SUN
5
6您的密钥库包含 1 个条目
7
8www.xinbzhiba.cn, 2022-8-3, PrivateKeyEntry,
9证书指纹 (SHA1): D9:02:7B:74:F6:62:39:28:4B:E1:45:2F:A6:C4:D4:8D:67:D4:00:1A
10
11Warning:
12JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore www.haudi.top.jks -destkeystore www.haudi.top.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
13
14C:\www.haudi.top_jks>keytool -importkeystore -srckeystore www.haudi.top.jks -destkeystore www.haudi.top.jks -deststoretype pkcs12
15输入源密钥库口令:
16已成功导入别名 www.cqbszwfw.com.cn 的条目。
17已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消
18
19Warning:
20已将 "www.haudi.top.jks" 迁移到 Non JKS/JCEKS。将 JKS 密钥库作为 "www.haudi.top.jks.old" 进行了备份。
21
22C:\www.haudi.top._jks>
23
在tomcat中配置的TLS证书时的参数对比
xxxxxxxxxx
71
2<Connector port="8443″ protocol="HTTP/1.1"
3maxThreads="150″ SSLEnabled="true" scheme="https" secure="true"
4keystoreFile="/path/to/file.pfx"
5keystoreType="PKCS12″
6keystorePass="证书密码"
7clientAuth="false" sslProtocol="TLS" />
xxxxxxxxxx
51<Connector port="8443″ protocol="HTTP/1.1″
2maxThreads="150″ SSLEnabled="true" scheme="https" secure="true"
3keystoreFile="/path/to/file.jks"
4keystorePass="证书密码"
5clientAuth="false" sslProtocol="TLS" />
由于技术是相通的,不同平台只是实现上的区别,在此重点梳理开源平台下的技术细节。
先来看一下目录树
xxxxxxxxxx
661[root@666 ~]# tree /etc/pki/
2/etc/pki/
3├── CA
4│ ├── certs
5│ ├── crl
6│ ├── newcerts
7│ └── private
8├── ca-trust
9│ ├── ca-legacy.conf
10│ ├── extracted
11│ │ ├── java
12│ │ │ ├── cacerts
13│ │ │ └── README
14│ │ ├── openssl
15│ │ │ ├── ca-bundle.trust.crt
16│ │ │ └── README
17│ │ ├── pem
18│ │ │ ├── email-ca-bundle.pem
19│ │ │ ├── objsign-ca-bundle.pem
20│ │ │ ├── README
21│ │ │ └── tls-ca-bundle.pem
22│ │ └── README
23│ ├── README
24│ └── source
25│ ├── anchors
26│ ├── blacklist
27│ ├── ca-bundle.legacy.crt -> /usr/share/pki/ca-trust-legacy/ca-bundle.legacy.default.crt
28│ └── README
29├── java
30│ └── cacerts -> /etc/pki/ca-trust/extracted/java/cacerts
31├── nssdb
32│ ├── cert8.db
33│ ├── cert9.db
34│ ├── key3.db
35│ ├── key4.db
36│ ├── pkcs11.txt
37│ └── secmod.db
38├── nss-legacy
39│ └── nss-rhel7.config
40├── rpm-gpg
41│ ├── RPM-GPG-KEY-CentOS-7
42│ ├── RPM-GPG-KEY-CentOS-Debug-7
43│ ├── RPM-GPG-KEY-CentOS-Testing-7
44│ ├── RPM-GPG-KEY-EPEL-7
45│ ├── RPM-GPG-KEY-GETPAGESPEED
46│ └── RPM-GPG-KEY-litespeed
47├── rsyslog
48└── tls
49 ├── cert.pem -> /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
50 ├── certs
51 │ ├── ca-bundle.crt -> /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
52 │ ├── ca-bundle.trust.crt -> /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
53 │ ├── make-dummy-cert
54 │ ├── Makefile
55 │ └── renew-dummy-cert
56 ├── misc
57 │ ├── CA
58 │ ├── c_hash
59 │ ├── c_info
60 │ ├── c_issuer
61 │ └── c_name
62 ├── openssl.cnf
63 └── private
64
6522 directories, 39 files
66
PKI是Public Key Infrastructure的首字母缩写,翻译过来就是公钥基础设施;PKI是一种遵循标准的利用公钥加密技术为电子商务的开展提供一套安全基础平台的技术和规范。PKI技术是一种遵循既定标准的密钥管理平台,它的基础是加密技术,核心是证书服务,支持集中自动的密钥管理和密钥分配,能够为所有的网络应用提供加密和数字签名等密码服务及所需要的密钥和证书管理体系。
CA身份认证系统基于PKI理论体系构建,由认证服务器、管理服务器、客户端安全认证组件和SecurSecureKey(USB智能卡)组成,支持B/S结构和C/S结构的应用系统。
SecurSecureKey(USB智能卡):负责客户端的数字签名和加解密,也是用户数字证书和私钥的载体,同时私钥不出卡,不可复制。
客户端安全认证组件:负责提供客户端应用程序接口,完成对SecurSecureKey的驱动和访问,从而产生客户端用户认证请求。对于B/S结构的应用系统,提供浏览器安全插件,与浏览器无缝结合;对于C/S结构的应用系统,提供COM组件。
认证服务器:负责提供服务器端应用程序接口,并对客户端提交的用户认证请求进行认证,鉴别用户身份,控制用户对应用系统的访问。
管理服务器:包括用户管理、证书管理和SecurSecureKey管理等模块,完成用户授权、证书申请和SecureKey制作,并提供全面的系统管理和审计功能。
包含内容 | 作用 | |
---|---|---|
安全服务器 | 用于提供证书申请、浏览、证书撤消列表以及证书下载等安全服务 | |
CA服务器 | CA服务器是整个证书机构的核心,负责证书的签发 | |
登记中心RA | 登记中心服务器面向登记中心操作员,在CA体系结构中起承上启下的作用 | |
LDAP服务器 | LDAP服务器提供目录浏览服务,其他用户通过访问LDAP服务器就能够得到其他用户的数字证 书 | |
数据库服务器 | 数据库服务器是认证机构中的核心部分,用于认证机构数据(如密钥和用户信息等)、日志和统计信息的存储和管理 |
1、私钥算法
私钥加密算法,又称 对称加密算法,因为这种算法解密密钥和加密密钥是相同的。也正因为同一密钥既用于加密又用于解密,所以这个密钥是不能公开的。常见的有《DES加密算法》、《AES加密算法》。
2、公钥算法
公钥加密算法,也就是 非对称加密算法,这种算法加密和解密的密码不一样,一个是公钥,另一个是私钥:
公钥和私钥是相对的,两者本身并没有规定哪一个必须是公钥或私钥。
要实现数据的安全传输,当然就要对数据进行加密了。
如果使用对称加密算法,加解密使用同一个密钥,除了自己保存外,对方也要知道这个密钥,才能对数据进行解密。如果你把密钥也一起传过去,就存在密码泄漏的可能。所以我们使用非对称算法,过程如下:
由于在非对称算法中,公钥加密的数据必须用对应的私钥才能解密,而私钥又只有接收方自己知道,这样就保证了数据传输的安全性。
除了保证数据的安全传输之外,公钥体系的另一个用途就是对数据进行签名。通常“数字签名”是用来验证发送方的身份并帮助保护数据的完整性。
例如:一个发送者 A 想要传些资料给大家,用自己的私钥对资料加密,即签名。这样一来,所有收到资料的人都可以用发送者的公钥进行验证,便可确认资料是由 A 发出来的了。(因为只有A使用私钥签名得到的信息,才能用这个公钥来解) 采用数字签名,可以确认两点:
之所以可以确认这两点,是因为用公钥可以解密的必然是用对应的私钥加的密,而私钥只有签名者持有。
现实中,公钥机制也有它的缺点,那就是效率非常低,比常用的私钥算法(如 DES 和 AES)慢上一两个数量级都有可能。所以它不适合为大量的原始信息进行加密。为了同时兼顾安全和效率,我们通常结合使用公钥算法和私钥算法:
ca-bundle.trust.crt持有带有“扩展验证”的证书。
“普通”证书与带有EV的证书之间的区别在于,您的EV证书需要个人或公司身份验证之类的内容,即通过其护照来验证某人的身份。
这意味着,如果您想获得ev证书,则必须通过您的护照向证书发行者标识自己。如果您“是”一家公司,则必须执行等效程序(不完全了解)。这对于在线银行至关重要:必须确保不仅连接的服务器经过认证,而且银行也经过认证。
因此,EV证书更加“复杂”,并且包含其他字段,不仅可以“标识”服务器,还可以“标识”公司。
回到您的答案:这取决于您的使用情况。大多数人应该使用ca-bundle.crt。如果您“是”需要非常高级别的认证和“信任”的银行或在线商店,则应使用ca-bundle.trust.crt。
比如Alpine Linux
##
用到的有tomcat等以JDK环境为运行基础的应用。
Keytool
是一个Java数字证书的管理工具。jks = java keystore,后期升级并使用了PFX这一更加规范的编码格式。
-genkey
: 在用户主目录中创建一个默认文件.keystore
,还会产生一个mykey
的别名作为缺省alias,mykey
中包含用户的公钥、私钥和证书。没有指定目录,会生成在默认目录下。
-alias
: 产生别名
-keystore
: 指定秘钥库的名称。加上此命令,生成的各类信息将不在.keystore
文件中
-keyalg
: 指定秘钥的算法,默认DSA
,可以设置成`RSA
-validity
: 创建的证书有效期是多少天
-keysize
: 指定秘钥长度
-storepass
: 指定秘钥库的访问密码(查看秘钥库内容需要)
-keypass
: 指定别名条目的密码(私钥的密码)
-dname
: 指定证书拥有者的信息`CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=州或省份名称,C=单位的两字母国家代码
-list
: 显示密钥库中的证书信息,例如keytool -list -v -keystore
,-storepass
指定密码
-v
: 显示秘钥库中的证书详细信息
-export
: 将别名指定的证书导出到文件,-alias
指定导出的别名,-keystore
指定keystore,-file
指定导出证书的位置及证书名称,-storepass
密码
-file
: 指定导出文件的文件名
-delete
: 删除秘钥库中某条目,keytool -delete -alias
指定删除的别名
-printcert
: 查看导出的证书信息keytool -printcert -file xxx.crt
查看导出的证书信息
-keypasswd
: 修改秘钥库中指定条目口令,-keypasswd -alias
指定需要修改的别名,-keypass 旧密码 -new 新密码 -storepass keystore密码 -keystore xxx
-storepasswd``: 修改
keystore口令,
-storepasswd -keystore e:\sture.keystore(需修改口令的keystore) -storepass 123456(原始密码) -new 321(新密码)
-import
: 将签名数字证书导入秘钥库keytool -import -alias
指定导入条目的别名-keystore
,-file
指定导入的证书
总结:
详细演示如下
xxxxxxxxxx
11
xxxxxxxxxx
51 <Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"
2 maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
3 clientAuth="false" sslProtocol="TLS" keystoreFile="/xxx/xxx/xxx.jks" keystorePass="xxxx" keyAlias="xxxx"/>
4
5<!-- 此处的示例说明:指定证书文件keystoreFile路径、证书密码keystorePass-->
证书附件下载,包括如下截图中的所有类型。其实本质还是前面3种编码方式,有相当大的重复存在。
cert_manager_of_haudi.top_history_certs.zip
xxxxxxxxxx
31listen 443 ssl;
2ssl_certificate nginx.ssl.pem.crt;
3ssl_certificate_key nginx.ssl.key;
xxxxxxxxxx
11bind *:443 ssl crt /path/to/certs_servername.pem
tomcat中配置的TLS证书时的参数对比
xxxxxxxxxx
61<Connector port="8443″ protocol="HTTP/1.1"
2maxThreads="150″ SSLEnabled="true" scheme="https" secure="true"
3keystoreFile="/path/to/file.pfx"
4keystoreType="PKCS12″
5keystorePass="证书密码"
6clientAuth="false" sslProtocol="TLS" />
xxxxxxxxxx
51<Connector port="8443″ protocol="HTTP/1.1″
2maxThreads="150″ SSLEnabled="true" scheme="https" secure="true"
3keystoreFile="/path/to/file.jks"
4keystorePass="证书密码"
5clientAuth="false" sslProtocol="TLS" />
罗列知识,检索便捷