一、什么是数字证书

1. 证书定义

数字证书通常代表符合X509标准的公钥证书
公钥证书:由CA机构使用CA机构自身私钥加密的密文,加密信息为网站域名,邮箱等等信息

2. 证书类型

2.1 自签证书

您可以创建自己的“自签名”SSL证书。虽然这是免费的,但却没有身份验证。当用户访问使用自签名证书时,浏览器将显示安全警告,告诉用户该网站不受信任。就因为他们是免费的,为了节省开支,所以经常被内联实验室在开发网页和系统时使用。

2.2 DV证书(验证域名)

DV SSL 证书是 Domain Validation SSL Certificate 英文全称的简写,翻译成中文是域名型 SSL证书 或 域名验证 SSL证书。1-2个小时左右就可完成域名确认和快速颁发证书,无需递交纸质文件,仅验证域名管理权,无需人工验证申请单位真实身份。 DV SSL 证书不在证书中显示申请单位名称,只显示网站域名。证书购买后,一般 1-2个小时左右即可获得来自证书颁发机构签发的 SSL 证书。

2.3 OV证书(验证组织)

这些证书包括了完整的业务及公司验证。该证书验证是来自证书颁发机构,使用目前被认可和接受的手动审批程序。就是因为这个要求,这种证书提供比DV SSL证书更高水平的信任和安全性。但是,该这种证书并没有通过由CA/B论坛的设定的发行标准,也不会使最新版本浏览器的地址栏变成绿色。这主要是要告诉您该网站的组织已经通过认证,您可以安全地进行任何交易。

2.4 EV证书(验证增强)

EV证书是通过CA/B论坛设定的严格指导方针而被验证的。CA/B论坛是一个独立的标准组织,在颁发证书前,会对企业进行深入的合法性核查。正因如此,EV证书提供安全级别的安全性和信任给终端用户。为了显示更高的信任级别,如果您正访问使用扩展验证的网站,那么浏览器将地址栏变成绿色并直接显示网站所属企业名称。
 

3. 证书品牌

3.1 免费自签证书

3.2 GeoTrust

GeoTrust 是第二大数字证书颁发机构(CA),也是身份认证和信任认证领域的领导者,该公司各种先进的技术使得任何大小的机构和公司都能安全地低成本地部署SSL数字证书和实现各种身份认证。 150多个国家有超过10万个用户在使用 GeoTrust 的产品来进行安全的电子交易和确认并保护网上真实身份,为用户的电子商务保驾护航。GeoTrust产品的市场占有率已经超过30%,每年的增长率高达150% GeoTrust 专注于SSL证书产品,GeoTrust SSL 证书主要有 5 种: QuickSSL Premium、QuickSSL Premium Wildcard、True Business ID 、True BusinessID Wildcard 与 True Business ID with EV

3.3 Digicert

Digicert为超过146个国家和地区的70,000多客户提供了数字证书,提供SSL证书和SSL管理工具的超过十年认证。 Digicert 是总部设在美国的证书颁发机构,并一直以来致力于提供SSL证书和SSL管理工具超过十年。不像其他那些证书颁发机构提供数十个甚至数百个与SSL加密无关的产品,创建最安全的SSL数字证书是我们所做的一切。这使得我们可以提供最好的SSL产品和无与伦比的技术支持。

3.4 其他品牌

4. 证书格式

4.1 JKS

JKS和JCEKS是Java密钥库(KeyStore)的两种比较常见类型,JKS的Provider是SUN,在每个版本的JDK中都有,JCEKS的Provider是SUNJCE,1.4后我们都能够直接使用它。

4.2 JCEKS

JCEKS在安全级别上要比JKS强,使用的Provider是JCEKS(推荐),尤其在保护KeyStore中的私钥上(使用TripleDES)

4.3 PFX(PKCS12)

PFX(PKCS#12)是公钥加密标准,它规定了可包含所有私钥、公钥和证书。其以二进制格式存储,在windows中可以直接导入到密钥区,注意,PKCS#12的密钥库保护密码同时也用于保护Key。

4.4 BKS

BKS来自BouncyCastleProvider,它使用的也是TripleDES来保护密钥库中的Key,它能够防止证书库被不小心修改(Keystore的keyentry改掉1个bit都会产生错误),BKS能够跟JKS互操作。

4.5 UBER

UBER 比较特别,当密码是通过命令行提供的时候,它只能跟keytool交互。整个keystore是通过PBE/SHA1/Twofish加密,因此 keystore能够防止被误改、察看以及校验。SunJDK允许你在不提供密码的情况下直接加载一个Keystore,类似cacerts,UBER不 允许这种情况。
 
 

5. 名词释义

5.1 PKCS

由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准
包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议
5.2 公钥证书
由CA机构签发的证书,主要功能在于CA生成的证书绑定了用户身份,真实性由CA机构生成的签名保证

5.3 PKI

从狭义上讲,PKI就是指CA机构,即实现了证书申请、审核、颁发、吊销、更新等管理功能的权威机构
从广义上讲,PKI不仅包含CA机构,还应包含证书及密钥处理程序,并且这些程序应无处不在,使人们能够在任何时间、任何地点来使用证书,这样才能算是真正意义上的基础设施。从这个角度看,PKI还应该包含处于各种应用环境中的、标准化的证书及密钥处理程序。

5.4 X.509标准

服务器SSL数字证书和客户端单位数字证书的格式遵循 X.509 标准。 X.509 是由国际电信联盟(ITU-T)制定的数字证书标准。为了提供公用网络用户目录信息服务, ITU 于 1988 年制定了 X.500 系列标准。其中 X.500 和 X.509 是安全认证系统的核心, X.500 定义了一种区别命名规则,以命名树来确保用户名称的唯一性; X.509 则为 X.500 用户名称提供了通信实体鉴别机制,并规定了实体鉴别过程中广泛适用的证书语法和数据接口, X.509 称之为证书。
X.509 给出的鉴别框架是一种基于公开密钥体制的鉴别业务密钥管理。一个用户有两把密钥:一把是用户的专用密钥,简称为:私钥,另一把是其他用户都可得到和利用的公共密钥,简称为:公钥。用户可用常规加密算法(如 DES)为信息加密,然后再用接收者的公共密钥对 DES 进行加密并将之附于信息之上,这样接收者可用对应的专用密钥打开 DES 密锁,并对信息解密。该鉴别框架允许用户将其公开密钥存放在CA的目录项中。一个用户如果想与另一个用户交换秘密信息,就可以直接从对方的目录项中获得相应的公开密钥,用于各种安全服务。
 
为了进行身份认证, X.509 标准及公共密钥加密系统提供了一个称作数字签名的方案。用户可生成一段信息及其摘要(亦称作信息“指纹”)。用户用专用密钥对摘要加密以形成签名,接收者用发送者的公共密钥对签名解密,并将之与收到的信息“指纹”进行比较,以确定其真实性。

5.5 邓白氏编码

(D-U-N-S® Number,是Data Universal Numbering System 的缩写)。它是一个独一无二的9位数字全球编码系统,相当于企业的身份识别码 (就像是个人的身份证),被广泛应用于企业识别、商业信息的组织及整理。这个号码是由邓白氏公司签发的,每个号码会跟一个唯一的企业实体相对应,不会重复 使用。也就是说,一个号码代表一个公司实体。通过邓氏编码,浏览者可以迅速获得独创、丰富且高质量的信息产品和服务。

二、证书运行原理

1. 基本运行过程

SSL/TLS协议的基本思路是采用公钥加密法。
(1) 客户端向服务器端索要并验证公钥。
(2) 双方协商生成"对话密钥"。
(3) 双方采用"对话密钥"进行加密通信。
(1)(2)为握手阶段,此阶段报文为明文传输。
但是,这里有两个问题。

1.1 如何保证公钥不被篡改?

解决方法:将公钥放在SSL数字证书中。只要证书是可信的,公钥就是可信的。

1.2 公钥加密计算量太大,如何减少耗时时间?

解决方法:每一次对话(session),客户端和服务器端都生成一个"对话密钥"(session key),用它来加密信息。由于"对话密钥"是对称加密,所以运算速度非常快,而服务器公钥只用于加密"对话密钥"本身,这样就减少了加密运算的消耗时间。

2. 详细运行过程

2.1 客户端发起请求

首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。 在这一步,客户端主要向服务器提供以下信息。
(1) 支持的协议版本,比如TLS 1.0版。
(2) 一个客户端生成的随机数,稍后用于生成"对话密钥"。
(3) 支持的加密方法,比如RSA公钥加密。
(4) 支持的压缩方法。
这里需要注意的是,客户端发送的信息之中不包括服务器的域名。也就是说,理论上服务器只能包含一个网站,否则会分不清应该向客户端提供哪一个网站的SSL数字证书。这就是为什么通常一台服务器只能有一张数字证书的原因。 对于虚拟主机的用户来说,这当然很不方便。2006年,TLS协议加入了一个Server Name Indication扩展,允许客户端向服务器提供它所请求的域名。
 

2.2 服务端回应

服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。服务器的回应包含以下内容。 (1) 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
(2) 一个服务器生成的随机数,稍后用于生成"对话密钥"。
(3) 确认使用的加密方法,比如RSA公钥加密。
(4) 服务器证书(返回给客户端的的是CA签发的公钥证书)。
除了上面这些信息,如果服务器需要确认客户端的身份(即双向证书,例如微信支付V2版本逆向资金接口),就会再包含一项请求,要求客户端提供"客户端证书"。比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。

2.3 客户端回应

客户端收到服务器回应以后,首先验证服务器证书。
验证证书合法性,是否由指定机构颁发,依据X509标准进行验证证书签名来鉴别
如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。 如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息。 (1) 一个随机数。该随机数用服务器公钥加密,防止被窃听。
(2) 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
(3) 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。
上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称"pre-master key"。有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥"。
至于为什么一定要用三个随机数,来生成"会话密钥", "不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于SSL协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。
对于RSA密钥交换算法来说,pre-master-key本身就是一个随机数,再加上hello消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。
pre master的存在在于SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么pre master secret就有可能被猜出来,那么仅适用pre master secret作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上pre master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。" 此外,如果前一步,服务器要求客户端证书,客户端会在这一步发送证书及相关信息。

2.4 服务单最后回应

服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"。然后,向客户端最后发送下面信息。
(1)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
(2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。
至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。
 

三、手动实践(自签证书)

1. 使用Keytool生成证书

1.1 创建keystore和密钥对

命令:
keytool -genkey -alias www.yonyong.top -keyalg RSA -keystore keystore.jks -keysize 2048

 

D:\data\certs\jks\www.yonyong.top>keytool -genkey -alias www.yonyong.top -keyalg RSA -keystore keystore.jks -keysize 2048
输入密钥库口令:
密钥库口令太短 - 至少必须为 6 个字符
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
  [Unknown]:  yangde
您的组织单位名称是什么?
  [Unknown]:  yangde
您的组织名称是什么?
  [Unknown]:  yangde
您所在的城市或区域名称是什么?
  [Unknown]:  nj
您所在的省/市/自治区名称是什么?
  [Unknown]:  jiangsu
该单位的双字母国家/地区代码是什么?
  [Unknown]:  CN
CN=yangde, OU=yangde, O=yangde, L=nj, ST=jiangsu, C=CN是否正确?
  [否]:  y

输入 <www.yonyong.top> 的密钥口令
        (如果和密钥库口令相同, 按回车):
再次输入新口令:

Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

D:\data\certs\jks\www.yonyong.top>

1.2 将秘钥转成行业标准格式PKCS12

keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.jks -deststoretype pkcs12

 

D:\data\certs\jks\www.yonyong.top>keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.jks -deststoretype pkcs12
输入源密钥库口令:
已成功导入别名 www.yonyong.top 的条目。
已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消

Warning:
已将 "keystore.jks" 迁移到 Non JKS/JCEKS。将 JKS 密钥库作为 "keystore.jks.old" 进行了备份。

D:\data\certs\jks\www.yonyong.top>

2. 使用Openssl生成证书

详细生成命令链接:https://www.chinassl.net/faq/n505.html

2.1 生成顶级CA证书/根证书

// 生成顶级CA的公钥证书和私钥文件,有效期10年(RSA 1024bits,默认) 
openssl req -new -x509 -days 3650 -keyout CARoot1024.key -out CARoot1024.crt
// 为顶级CA的私钥文件去除保护口令 
openssl rsa -in CARoot1024.key -out CARoot1024.key

// 生成顶级CA的公钥证书和私钥文件,有效期15年(RSA 2048bits,指定) 
openssl req -newkey rsa:2048 -x509 -days 5480 -keyout CARoot2048.key -out CARoot2048.crt 
// 为顶级CA的私钥文件去除保护口令 
openssl rsa -in CARoot2048.key -out CARoot2048.key
[root@VM-0-10-centos www.yonyong.top]# openssl req -new -x509 -days 3650 -keyout CARoot1024.key -out CARoot1024.crt
Generating a 2048 bit RSA private key
...........................+++
..+++
writing new private key to 'CARoot1024.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:yonyong
string is too long, it needs to be less than  2 bytes long
Country Name (2 letter code) [XX]:yoyong
string is too long, it needs to be less than  2 bytes long
Country Name (2 letter code) [XX]:x^HCN
string is too long, it needs to be less than  2 bytes long
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:jiangsu
Locality Name (eg, city) [Default City]:nj
Organization Name (eg, company) [Default Company Ltd]:yonyong
Organizational Unit Name (eg, section) []:yonyong
Common Name (eg, your name or your server's hostname) []:yonyong
Email Address []:2365788736@qq.com
[root@VM-0-10-centos www.yonyong.top]# 
[root@VM-0-10-centos www.yonyong.top]# 
[root@VM-0-10-centos www.yonyong.top]# ll
total 8
-rw-r--r-- 1 root root 1399 Apr 24 18:12 CARoot1024.crt
-rw-r--r-- 1 root root 1834 Apr 24 18:12 CARoot1024.key
[root@VM-0-10-centos www.yonyong.top]# 
[root@VM-0-10-centos www.yonyong.top]# openssl rsa -in CARoot1024.key -out CARoot1024.key
Enter pass phrase for CARoot1024.key:
writing RSA key
[root@VM-0-10-centos www.yonyong.top]# 

2.2 生成应用证书/用户证书

// 为应用证书/中级证书生成私钥文件 
openssl genrsa -out app.key 2048 
// 根据私钥文件,为应用证书/中级证书生成 csr 文件(证书请求文件) 
openssl req -new -key app.key -out app.csr 
// 使用CA的公私钥文件给 csr 文件签名,生成应用证书,有效期5年 
openssl ca -in app.csr -out app.crt -cert CARoot1024.crt -keyfile CARoot1024.key -days 1826 -policy policy_anything

2.2.1 生成应用证书请求

注意生成证书是 common name不能重复
[root@VM-0-10-centos www.yonyong.top]# openssl genrsa -out app.key 2048 
Generating RSA private key, 2048 bit long modulus
................................................................................................................+++
...............+++
e is 65537 (0x10001)
[root@VM-0-10-centos www.yonyong.top]# openssl req -new -key app.key -out app.csr 
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:jiangsu
Locality Name (eg, city) [Default City]:NJ
Organization Name (eg, company) [Default Company Ltd]:alibaba
Organizational Unit Name (eg, section) []:alibaba
Common Name (eg, your name or your server's hostname) []:ali
Email Address []:alibaba@126.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:alibaba
[root@VM-0-10-centos www.yonyong.top]# ll
total 16
-rw-r--r-- 1 root root 1098 Apr 26 18:26 app.csr
-rw-r--r-- 1 root root 1679 Apr 26 18:24 app.key
-rw-r--r-- 1 root root 1399 Apr 24 18:12 CARoot1024.crt
-rw-r--r-- 1 root root 1679 Apr 24 18:20 CARoot1024.key

2.2.2 创建文件(踩坑,初次签证书会有报错,走这一步解决)

# 根据报错创建文件
[root@VM-0-10-centos www.yonyong.top]# touch /etc/pki/CA/index.txt
# 根据报错创建文件
[root@VM-0-10-centos www.yonyong.top]# touch /etc/pki/CA/serial
# 根据报错创建文件
[root@VM-0-10-centos www.yonyong.top]# echo '01' >/etc/pki/CA/serial

2.2.3 生成应用证书

[root@VM-0-10-centos www.yonyong.top]# openssl ca -in app.csr -out app.crt -cert CARoot1024.crt -keyfile CARoot1024.key -days 1826 -policy policy_anything
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Apr 24 10:37:05 2022 GMT
            Not After : Apr 24 10:37:05 2027 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = js
            localityName              = nj
            organizationName          = yd
            organizationalUnitName    = yd
            commonName                = yd
            emailAddress              = yd@qq.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                EA:82:46:3F:C6:D4:CD:E6:62:00:72:DE:89:55:6D:D7:68:00:14:F4
            X509v3 Authority Key Identifier: 
                keyid:B1:0A:8A:8B:C5:11:4E:47:22:C3:12:C8:47:23:26:C2:1F:24:09:E3

Certificate is to be certified until Apr 24 10:37:05 2027 GMT (1826 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[root@VM-0-10-centos www.yonyong.top]# ll
total 24
-rw-r--r-- 1 root root 4551 Apr 24 18:37 app.crt
-rw-r--r-- 1 root root 1062 Apr 24 18:21 app.csr
-rw-r--r-- 1 root root 1679 Apr 24 18:20 app.key
-rw-r--r-- 1 root root 1399 Apr 24 18:12 CARoot1024.crt
-rw-r--r-- 1 root root 1679 Apr 24 18:20 CARoot1024.key
[root@VM-0-10-centos www.yonyong.top]# 

2.3 生成中级证书(可选)

// 使用CA的公私钥文件给 csr 文件签名,生成中级证书,有效期5年 
openssl ca -extensions v3_ca -in app.csr -out app.crt -cert CARoot1024.crt -keyfile CARoot1024.key -days 1826 -policy policy_anything
[root@VM-0-10-centos www.yonyong.top]# openssl ca -extensions v3_ca -in app.csr -out app.crt -cert CARoot1024.crt -keyfile CARoot1024.key -days 1826 -policy policy_anything
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 2 (0x2)
        Validity
            Not Before: Apr 24 10:41:20 2022 GMT
            Not After : Apr 24 10:41:20 2027 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = js
            localityName              = nj
            organizationName          = yd
            organizationalUnitName    = yd
            commonName                = yd
            emailAddress              = yd@qq.com
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                EA:82:46:3F:C6:D4:CD:E6:62:00:72:DE:89:55:6D:D7:68:00:14:F4
            X509v3 Authority Key Identifier: 
                keyid:B1:0A:8A:8B:C5:11:4E:47:22:C3:12:C8:47:23:26:C2:1F:24:09:E3

            X509v3 Basic Constraints: 
                CA:TRUE
Certificate is to be certified until Apr 24 10:41:20 2027 GMT (1826 days)
Sign the certificate? [y/n]:y
failed to update database
TXT_DB error number 2
[root@VM-0-10-centos www.yonyong.top]# ll
total 16
-rw-r--r-- 1 root root    0 Apr 24 18:41 app.crt
-rw-r--r-- 1 root root 1062 Apr 24 18:21 app.csr
-rw-r--r-- 1 root root 1679 Apr 24 18:20 app.key
-rw-r--r-- 1 root root 1399 Apr 24 18:12 CARoot1024.crt
-rw-r--r-- 1 root root 1679 Apr 24 18:20 CARoot1024.key
[root@VM-0-10-centos www.yonyong.top]# 

 

四、证书与Java

1. Java解析证书文件获取证书对象

1.1 PKCS12格式的证书

/**
 * 通过PKCS12格式的证书库文件获取证书对象(包含公钥和私钥证书)
 * 自签证书:
 * https://csr.chinassl.net/keytool-commands.html
 * keytool -genkey -alias mydomain -keyalg RSA -keystore keystore.jks -keysize 2048
 */
private static void test() throws Exception {
    InputStream inStream = new FileInputStream(CERTIFICATE_SELF_SIGN);

    KeyStore ks = KeyStore.getInstance("PKCS12");
    ks.load(inStream, "123456".toCharArray());

    String alias = ks.aliases().nextElement();

    //获取私钥
    PrivateKey privateKey = (PrivateKey) ks.getKey(alias, "123456".toCharArray());

    //获取公钥证书
    X509Certificate certificate = (X509Certificate) ks.getCertificate(alias);
    System.out.println(certificate.getNotAfter());
}

1.2 pem、crt文件

/**
 * 通过pem文件获取证书对象
 */
private static void test2() throws Exception {
    CertificateFactory fact = CertificateFactory.getInstance("X.509");
    X509Certificate certificate = (X509Certificate) fact.generateCertificate(new FileInputStream (CERTIFICATE_IT610));
    PublicKey publicKey = certificate.getPublicKey();
}

 

2. Java依据证书文件字符串获取证书对象

2.1 依据公钥证书pem 获取公钥对象

/**
 * 从字符串中加载公钥
 *
 * @param publicKeyStr 公钥数据字符串
 * @throws Exception 异常信息
 */
public static PublicKey loadPublicKey(String publicKeyStr) throws Exception {
    try {
        byte[] buffer = Base64.decode(publicKeyStr);
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
        return keyFactory.generatePublic(keySpec);
    } catch (NoSuchAlgorithmException e) {
        throw new Exception("无此算法");
    } catch (InvalidKeySpecException e) {
        throw new Exception("公钥非法");
    } catch (NullPointerException e) {
        throw new Exception("公钥数据为空");
    }
}

2.2 依据私钥证书pem获取私钥对象

/**
 * 从字符串中加载私钥<br>
 * 加载时使用的是PKCS8EncodedKeySpec(PKCS#8编码的Key指令)。
 *
 * @param privateKeyStr 私钥
 * @return {@link PrivateKey}
 * @throws Exception 异常信息
 */
public static PrivateKey loadPrivateKey(String privateKeyStr) throws Exception {
    try {
        byte[] buffer = Base64.decode(privateKeyStr);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        return keyFactory.generatePrivate(keySpec);
    } catch (NoSuchAlgorithmException e) {
        throw new Exception("无此算法");
    } catch (InvalidKeySpecException e) {
        throw new Exception("私钥非法");
    } catch (NullPointerException e) {
        throw new Exception("私钥数据为空");
    }
}

 

posted on 2022-05-19 21:59  yonyong  阅读(1738)  评论(0编辑  收藏  举报