0 序
- 文由。这两天项目上遇到了一个问题:在大数据Yarn集群上运行的Flink 实时作业,基于
java.net.HttpURLConnection
调用HTTPS协议的API时,调用失败,报”java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
“(invalidalgorithmparameterexception: trustAnchors参数必须是非空的)。
为此,有必要对 PKI公钥体系、CA证书、HTTPS、SSL/TLS进行一个彻底的研究和总结了。
一遇到问题,不搞通原理,未来你始终会在同样性质的问题上翻车、并且反复踩坑。这是我不乐意经历的。
- 本文的重要性————高。读懂本文,你就基本搞懂了 以HTTPS / SSL / CA证书为核心的PKI公钥基础设施体系,也就基本搞懂了互联网通信安全的基本原理了。
这绝非大话。
-
知识产权与创作内容。本文属于笔记型、实验型博文,除了自己的创作内容外,还有相当部分内容是摘自几篇优秀的大佬的博文。具体可在文末的【参考文献】中见到。在此,向他们表示感谢。
-
好了,步入正题。先从HTTPS中
S
(SSL/TLS)所依赖的CA证书
讲起吧。
1 CA证书概述
说起 HTTP 的那些事,则不得不提 HTTPS ,而说起 HTTPS ,则不得不提数字证书。
本文将从 Java 的角度,学习 HTTPS 和数字证书技术。
1.1 访问 HTTPS 站点资源
- 一种方式是通过 java.net 自带的 HttpURLConnection;
- 另一种方式是通过 Apache 的 HttpClient,这两种方式各有各的优势。这里也使用这两种方式来访问 HTTPS 站点,从下面的代码可以看到,和前面访问 HTTP 站点几乎完全一样。
1.1.1 使用 HttpURLConnection
@Test
public void basicHttpsGet() throws Exception {
String url = "https://www.baidu.com";
URL obj = new URL(url);
HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) ...");
con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
con.setRequestMethod("GET");
String responseBody = readResponseBody(con.getInputStream());
System.out.println(responseBody);
}
1.1.2 使用 HttpClient
@Test
public void basicHttpsGet() throws Exception {
String url = "https://www.baidu.com";
HttpGet request = new HttpGet(url);
request.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) ...");
CloseableHttpClient httpclient = HttpClients.createDefault();
CloseableHttpResponse response = httpclient.execute(request);
String responseBody = readResponseBody(response);
System.out.println(responseBody);
}
一般情况下,访问 HTTPS 站点就和访问 HTTP 站点一样简单,无论是 HttpURLConnection 还是 HttpClient ,都将底层的实现细节封装了起来,给我们提供了一致的对外接口,所以我们不用关心 HTTPS 的实现原理。
对底层细节的封装,本来是一件好事,也是一种好的设计方式,可以让开发人员使用起来更方便,提高开发效率,但是对于那些不求甚解的人来说,可能带来的困惑比之带来的方便要更多。
1.2 遭遇 PKIX path building failed ?
- 如果使用上面的代码作为爬虫程序爬取成千上万的网页,在大多数情况下,无论是 HTTP 也好,HTTPS 也罢,都可以很好的工作。
- 不过有时候,你可能没那么好的运气,有些站点在墙外,被强大的防火长城拒之门外,这时你可以找一些境外代理,通过《使用代理》这篇博客中介绍的方法来解决;有些站点需要使用身份认证输入用户名密码才能访问,这可以使用博客《代理认证》中介绍的方法来解决;另外,在访问有些 HTTPS 站点时,你还可能会遇到下面的异常:
javax.net.ssl.SSLHandshakeException:
sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
要解决这个异常,这就是我们这篇将要介绍的内容。
【扩展】:
- HttpURLConnection 使用代理
HttpURLConnection 的 openConnection() 方法可以传入一个 Proxy 参数,如下:
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 9876));
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection(proxy);
不仅如此,我们注意到 Proxy 构造函数的第一个参数为枚举类型
Proxy.Type.HTTP
,那么很显然,如果将其修改为Proxy.Type.SOCKS
即可以使用 SOCKS 代理。
- HttpClient 使用代理
HttpHost proxy = new HttpHost("127.0.0.1", 9876, "HTTP");
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet request = new HttpGet(url);
CloseableHttpResponse response = httpclient.execute(proxy, request);
这里要注意一点的是,虽然这里的 new HttpHost() 和上面的 new Proxy() 一样,也是可以指定协议类型的,但是遗憾的是 HttpClient 默认是不支持 SOCKS 协议的,如果我们使用下面的代码:
HttpHost proxy = new HttpHost("127.0.0.1", 1080, "SOCKS");
将会直接报协议不支持异常:
org.apache.http.conn.UnsupportedSchemeException: socks protocol is not supported
1.3 证书认证的原理
- 大多数人第一次遇到上面的异常时的反应,估计都是一脸茫然,因为这个异常信息提示比较模糊,对于不懂 HTTPS 的人来说,什么 SSLHandshake ,什么 PKIX path ,完全不知所云。
- 所以我们要先弄懂 HTTPS 的工作原理,才好去解决这个问题。我们知道 HTTPS 其实就是 HTTP + SSL/TLS 的合体,它其实还是 HTTP 协议,只是在外面加了一层,SSL 是一种加密安全协议,引入 SSL 的目的是为了解决 HTTP 协议在不可信网络中使用明文传输数据导致的安全性问题。
可以说,整个互联网的通信安全,都是建立在 SSL/TLS 的安全性之上的。
SSL/TLS 协议及其握手过程 (浏览器中HTTPS的交互过程)
- 学过计算机网络的同学肯定都还记得 TCP 在建立连接时的三次握手,之所以需要 TCP 三次握手,是因为网络中存在延迟的重复分组,可能会导致服务器重复建立连接造成不必要的开销。
-
SSL/TLS
协议在建立连接时与此类似,也需要客户端和服务器之间进行握手,但是其目的却大相径庭,在 SSL/TLS 握手的过程中,客户端和服务器彼此交换并验证证书,并协商出一个 “对话密钥”(即 此后进行【对称加密通信】) ,后续的所有通信都使用这个 “对话密钥” 进行加密,保证通信安全。
网上有很多 SSL/TLS 握手的示意图,其中下面这副非常全面,也非常专业,想深入了解 SSL/TLS 的同学可以研究下。
https://www.cheat-sheets.org/saved-copy/Ssl_handshake_with_two_way_authentication_with_certificates-1.pdf
- 使用浏览器访问 HTTPS 站点时,中间发生的握手过程
阮一峰在他的 《SSL/TLS协议运行机制的概述》 和 《图解SSL/TLS协议》 两篇博客中详细介绍了 SSL/TLS 的原理,感兴趣的同学可以去看看。我这里使用 IBM Tivoli Risk Manager 用户手册 里的一张图(因为这张图比较浅显易懂)来大概的说明下我们在平时使用浏览器访问 HTTPS 站点时,中间发生的握手过程。
使用浏览器访问 HTTPS 站点时,中间发生的握手过程:
整个 SSL/TLS 的握手和通信过程,简单来说,其实可以分成下面三个阶段:
- 打招呼
当用户通过浏览器访问 HTTPS 站点时,浏览器会向服务器打个招呼(ClientHello),服务器也会和浏览器打个招呼(ServerHello)。所谓的打招呼,实际上是告诉彼此各自的 SSL/TLS 版本号以及各自支持的加密算法等,让彼此有一个初步了解。
- 表明身份、验证身份
第二步是整个过程中最复杂的一步,也是 HTTPS 通信中的关键。
为了保证通信的安全,首先要保证我正在通信的人确实就是那个我想与之通信的人,服务器会发送一个证书来表明自己的身份,浏览器根据证书里的信息进行核实(为什么通过证书就可以证明身份呢?怎么通过证书来验证对方的身份呢?这个后面再说)。如果是双向认证的话,浏览器也会向服务器发送客户端证书。
双方的身份都验证没问题之后,浏览器会和服务器协商出一个 “对话密钥” ,要注意这个 “对话密钥” 不能直接发给对方,而是要用一种只有对方才能懂的方式发给他,这样才能保证密钥不被别人截获(或者就算被截获了也看不懂)。
- 通信
至此,握手就结束了。双方开始聊天,并通过 “对话密钥” 加密通信的数据。
HTTPS 中的密码学
- HTTPS 协议之所以复杂,是为了保证通信过程中数据的安全性,而要保证通信安全,它在协议中运用了大量的密码学原理,可以说
HTTPS
是集密码学之大成。
无论是在
SSL/TLS
握手的过程中,还是在加密通信的过程中,HTTPS 都涉及了大量的密码学概念,譬如,在证书的数字签名中使用了哈希算法和非对称加密算法,在加密通信的过程中使用了对称加密算法,为了防止传输的数据被篡改和重放还使用了 MAC(消息认证码
)等。
-
要想深入了解 HTTPS 的工作原理,下面这些概念还是得好好研究下,网上已经有很多文章介绍这些概念了,有网友做了如下总结:
-
哈希
- 哈希算法又称散列,它是一种将任意长度的数据转化为固定长度的算法
- 哈希算法是不可逆的
- 常见的哈希算法有 MD5 和 SHA1
- 对称加密
- 对称加密指的是加密和解密使用相同一个密钥
- 对称加密的优点是速度快,缺点是密钥管理不方便,必须共享密钥
- 常见的对称加密算法有 DES、AES、Blowfish 等
- 非对称加密
- 非对称加密指的是加密和解密使用不同的密钥,其中一个是公钥,另一个是私钥,公钥是公开的,私钥只有自己知道
- 使用公钥加密的数据必须使用私钥解密,使用私钥加密的数据必须使用公钥解密
- 公钥和私钥之间存在着某种联系,但是从公钥不能(或很难)推导出私钥
- 非对称加密的缺点是速度慢,优点是密钥管理很方便
- 常见的非对称加密算法有 RSA、ECC 等
- 数字证书
关于数字证书(公钥&私钥) 与 CA机构 => CA数字证书
-
简单来说,数字证书就好比介绍信上的公章,有了它,就可以证明这份介绍信确实是由某个公司发出的,而证书可以用来证明任何一个东西的身份,只要这个东西能出示一份证明自己身份的证书即可,譬如可以用来验证某个网站的身份,可以验证某个文件是否可信等等。《数字证书及 CA 的扫盲介绍》 和 《数字证书原理》 这篇博客对数字证书进行了很通俗的介绍。
-
知道了数字证书是什么之后,我们往往更关心它的原理,在上面介绍
SSL/TLS
握手的时候留了两个问题:为什么通过证书就可以证明身份呢?怎么通过证书来验证对方的身份呢? -
这就要用到上面所说的非对称加密了,非对称加密的一个重要特点是:使用公钥加密的数据必须使用私钥才能解密;同样的,使用私钥加密的数据必须使用公钥解密。
正是因为这个特点,网站就可以在自己的证书中公开自己的公钥,并使用自己的私钥将自己的身份信息进行加密一起公开出来,这段被私钥加密的信息就是证书的数字签名,浏览器在获取到证书之后,通过证书里的公钥对签名进行解密,如果能成功解密,则说明证书确实是由这个网站发布的,因为只有这个网站知道他自己的私钥(如果他的私钥没有泄露的话)。
- 在非对称加密算法中,最出众的莫过于
RSA
算法
关于
RSA
算法的数学细节,可以参考:阮一峰的《RSA算法原理(一)》和《RSA算法原理(二)》这两篇博客,强烈推荐。
- 当然,如果只是简单的对数字签名进行校验的话,还不能完全保证这个证书确实就是网站所有,黑客完全可以在中间进行劫持,使用自己的私钥对网站身份信息进行加密,并将证书中的公钥替换成自己的公钥,这样浏览器同样可以解密数字签名,签名中身份信息也是完全合法的。这就好比那些地摊上伪造公章的小贩,他们可以伪造出和真正的公章完全一样的出来以假乱真。
为了解决这个问题,信息安全的专家们引入了
CA
这个东西,所谓CA
,全称为Certificate Authority
,翻译成中文就是证书授权中心,它是专门负责管理和签发证书的第三方机构。
因为证书颁发机构关系到所有互联网通信的身份安全。因此一定要是一个【非常权威的机构】,像GeoTrust
、GlobalSign
等等,这里有一份常见的CA
清单。
如果一个网站需要支持HTTPS
,它就要一份证书来证明自己的身份,而这个证书必须从CA
机构申请,大多数情况下申请数字证书的价格都不菲,不过也有一些免费的证书供个人使用,像最近比较火的Let's Encrypt
。
从安全性的角度来说,免费的和收费的证书没有任何区别,都可以为你的网站提供足够高的安全性,唯一区别在于如果你从权威机构
购买了付费的证书,一旦由于证书安全问题
导致经济损失,可以获得一笔巨额的赔偿
。
- 如果用户想得到一份属于自己的证书,他应先向
CA
提出申请。在CA
判明申请者的身份后,便为他分配一个公钥
,并且CA
将该公钥
与申请者的身份信息绑在一起,并为之签字
后,便形成证书
发给申请者。
如果一个用户想鉴别另一个证书的真伪,他就用
CA
的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。
通过这种方式,黑客就不能简单的修改证书中的公钥了,因为现在公钥
有了CA
的数字签名,由CA
来证明公钥的有效性,不能轻易被篡改,而黑客自己的公钥
是很难被CA
认可的,所以我们无需担心证书被篡改的问题了。
下图显示了证书的申请流程(图片来自刘坤的技术博客):
CA
证书可以具有层级结构,它建立了自上而下的信任链,下级 CA 信任上级 CA ,下级 CA 由上级 CA 颁发证书并认证。 譬如 Google 的证书链如下图所示:
可以看出:http://google.com.hk 的 SSL 证书由 Google Internet Authority G2 这个 CA 来验证,而 Google Internet Authority G2 由 GeoTrust Global CA 来验证,GeoTrust Global CA 由 Equifax Secure Certificate Authority 来验证。这个最顶部的证书,我们称之为根证书(
root certificate
)。
那么谁来验证根证书呢?答案是它自己,根证书自己证明自己,换句话来说也就是:根证书是不需要证明的。浏览器在验证证书时,从【根证书】开始,沿着证书链的路径依次向下验证,根证书是整个证书链的安全之本,如果根证书被篡改,整个证书体系的安全将受到威胁。所以:不要轻易的相信根证书。
当下次你访问某个网站遇到提示说,请安装我们的根证书,它可以让你访问我们网站的体验更流畅通信更安全时,最好留个心眼。在安装之前,不妨看看这几篇博客:《12306的证书问题》、《在线买火车票为什么要安装根证书?》。
小结:PKI
(Public Key Infrastructure
/ 公钥基础设施)
- 最后总结一下:
其实上面说的这些,什么非对称加密,数字签名,CA 机构,根证书等等,其实都是
PKI
的核心概念
。
PKI
(Public Key Infrastructure
)中文称作公钥基础设施,它提供公钥加密和数字签名服务的系统或平台,方便管理密钥和证书,从而建立起一个安全的网络环境。
而数字证书
最常见的格式是X.509
。所以这种公钥基础设施又称之为PKIX
。
至此,我们大致弄懂了上面的异常信息,
sun.security.validator.ValidatorException: PKIX path building failed
,也就是在沿着证书链的路径验证证书时出现异常,验证失败了。
讲了这么多,全都是些理论的东西,下面开始实践吧,看看怎么解决这个异常。
1.4 Java 的证书
浏览器、操作系统中默认存放的可信CA证书列表
-
上面所介绍的是浏览器对CA证书进行验证的过程————浏览器保存了一个常用的 CA 证书列表,在验证证书链的有效性时,直接使用保存的证书里的公钥进行校验,如果在证书列表中没有找到或者找到了但是校验不通过,那么浏览器会警告用户,由用户决定是否继续。
-
与此类似的,操作系统也一样保存有一份可信的证书列表。
譬如在 Windows 系统下,你可以运行
certmgr.msc
打开证书管理器查看,这些证书实际上是存储在 Windows 的注册表中。一般情况下位于:SOFTWAREMicrosoftSystemCertificates
路径下。
Java JRE中默认存放的可信证书列表: cacerts => 证书管理工具 : keytool / KeyStore Explorer
-
那么,在 Java 程序中是如何验证证书的呢?
-
和浏览器和操作系统类似,Java 在
JRE
的安装目录下也保存了一份默认可信的证书列表,这个列表一般是保存在$JRE/lib/security/cacerts
文件中。
cacerts
文件的默认密码为changeit
(但是能保证的是,绝大多数人、绝大多数Java程序都不会 change it)。
要查看这个文件,可以使用类似KeyStore Explorer
这样的软件。
当然,也可以使用 JRE 自带的keytool
工具(后面再介绍)
数字证书有不同的存储格式、且可相互转换
- 我们知道,证书有很多种不同的存储格式。
譬如
CA
在发布证书时,常常使用 PEM 格式————这种格式的好处是纯文本,内容是BASE64
编码的,证书中使用 “—–BEGIN CERTIFICATE—–” 和 “—–END CERTIFICATE—–” 来标识。
另外还有比较常用的二进制 DER 格式;在Windows
平台上较常使用的PKCS#12
格式等等。
当然,不同格式的证书之间是可以相互转换的。
- 常用的数字证书转换工具: openssl
我们可以使用
openssl
这个命令行工具来转换。参考: SSL Converter
另外,想了解更多证书格式的,可以参考这里:Various SSL/TLS Certificate File Types/Extensions
在 Java 平台下,数字证书(非对称加密的【公钥(Certificate/PublicKey)】、对称加密的【密钥(SecretKey)】)、非对称加密的【私钥(PrivateKey)】常常被存储在 KeyStore(cacerts等) 文件中
- 在 Java 平台下,证书常常被存储在
KeyStore
文件中。
上面说的
cacerts
文件就是一个KeyStore
文件。
-
KeyStore
不仅可以存储数字证书
,还可以存储密钥
。
- 存储在 KeyStore 文件中的对象有3种类型:
Certificate/PublicKey
(证书)、PrivateKey
和SecretKey
。
Certificate/PublicKey
就是证书、CA公钥证书PrivateKey
是非对称加密中的私钥SecretKey
用于对称加密,是对称加密中的密钥。
-
KeyStore
文件根据用途,也有很多种不同的格式:JKS、JCEKS、PKCS12、DKS 等等。
PixelsTech 上有一系列文章对 KeyStore 有深入的介绍,可以学习下:Different types of keystore in Java
在 Java 平台下,狭义地划分————密钥存储文件(KeyStore)可细分为2种:KeyStore / TrustStore(cacerts等)
-
到目前为止,我们所说的
KeyStore
其实只是一种文件格式而已;实际上在 Java 的世界里KeyStore
文件分成两种:KeyStore
和TrustStore
。 -
这是两个比较容易混淆的概念,不过这两个东西从文件格式来看其实是一样的。
-
KeyStore
保存私钥,用来加解密或者为别人做签名; -
TrustStore
保存一些可信任的证书
,访问HTTPS
时对被访问者进行认证,以确保它是可信任的。
所以,准确来说,上面的
cacerts
文件应该叫做TrustStore
而不是KeyStore
,只是它的文件格式是KeyStore
文件格式罢了。
在 Java 平台下,密切相关的: KeyManager / TrustManager
- 除了
KeyStore
和TrustStore
,Java
里还有两个类KeyManager
和TrustManager
与此息息相关。
JSSE
的参考手册中有一张示意图,说明了各个类之间的关系:
可以看出如果要进行
SSL
会话,则:
- 必须得新建一个
SSLSocket
对象;- 而
SSLSocket
对象是通过SSLSocketFactory
来管理的;SSLSocketFactory
对象则依赖于SSLContext
SSLContext
对象又依赖于KeyManager
、TrustManager
和SecureRandom
。
我们这里最关心的是
TrustManager
对象,另外两个暂且忽略。
因为正是TrustManager
负责证书的校验,对网站进行认证。要想在访问 HTTPS 时通过认证,不报sun.security.validator.ValidatorException
异常,必须从这里开刀。
方法1:自定义 TrustManager 绕过证书检查
- 我们知道了
TrustManager
是专门负责校验证书的,那么:最容易想到的方法应该就是改写 TrustManager 类
————让它不要对证书做校验
这种方法虽然粗暴,但是却相当有效,而且 Java 中的
TrustManager
也确实可以被重写,下面是示例代码:
@Test
public void basicHttpsGetIgnoreCertificateValidation() throws Exception {
String url = "https://kyfw.12306.cn/otn/";
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
// don't check
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
// don't check
}
}
};
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, trustAllCerts, null);
LayeredConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(ctx);
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslSocketFactory)
.build();
HttpGet request = new HttpGet(url);
request.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) ...");
CloseableHttpResponse response = httpclient.execute(request);
String responseBody = readResponseBody(response);
System.out.println(responseBody);
}
- 我们新建了一个匿名类,继承自
X509TrustManager
接口,这个接口提供了3个方法用于验证证书的有效性:getAcceptedIssuers
、checkClientTrusted
、checkServerTrusted
。
我们在验证的函数中直接返回,不做任何校验。
这样在访问 HTTPS 站点时,就算是证书不可信,也不会抛出异常,可以继续执行下去。
- 负面影响:
这种方法虽然简单,但是却有一个最严重的问题,就是不安全。
因为不对证书做任何合法性校验,而且这种处理是全局性的,不管青红皂白,所有的证书都不会做验证。
所以,就算遇到不信任的证书,代码依然会继续与之通信,至于通信的数据安全不安全就不能保证了。
所以,如果你只是想在测试环境做个实验,那没问题,但是如果你要将代码发布到生产环境,请慎重。
方法2:导入、使用证书
- 对于有些证书,我们基本上确定是可以信任的,但是这些证书又不在 Java 的
cacerts
文件中。对于这些网站,我们可以将其添加到信任证书列表中,而不是使用上面的方法统统都相信,这样程序的安全性仍然可以得到保障。
譬如 12306 网站,或者使用了 Let’s Encrypt 证书的一些网站。
- 使用 keytool 导入证书
简单的做法是:将这些网站的证书导入到
cacerts
文件中。
这样 Java 程序在校验证书的时候就可以从cacerts
文件中找到并成功校验这个证书了。
上面我们介绍过 JRE 自带的keytool
这个工具,这个工具小巧而强悍,拥有很多功能。
- 首先,我们可以使用它查看 KeyStore 文件,使用下面的命令可以列出 KeyStore 文件中的所有内容(包括证书、私钥等):
keytool -list -keystore cacerts
- 然后,通过下面的命令,将证书导入到 cacerts 文件中:
keytool -import -v -trustcacerts -alias ca -file d:certca.cer -storepass changeit -keystore "C:Program Files (x86)Javajdk1.8.0_261jrelibsecuritycacerts"
-alias
证书别名-file
证书名称和路径-keystore
cacerts 路径-storepass
证书密码-keystore
可指定导入到密钥库中的文件命名 – 一般可以不写
要想将网站的证书导入
cacerts
文件中,首先要获取网站的证书。譬如上面命令中的 12306.cer 文件,它是使用浏览器的证书导出向导保存的。如下图所示:
关于
keytool
的更多用法,可以参考 keytool 官网手册。
此外,SSLShopper
上也有一篇文章列出了常用的 keytool 命令。
其三,可查看本文档的keytool
章节,进行系统地了解、学习。
方法3:使用 KeyStore 动态加载证书
- 使用
keytool
导入证书,这种方法不仅简单,而且保证了代码的安全性,最关键的是代码不用做任何修改。
所以,我比较推荐这种方法。但是这种方法有一个致命的缺陷,那就是你需要修改
JRE
目录下的文件,如果你的程序只是在自己的电脑上运行,那倒没什么,可如果你的程序要部署在其他人的电脑上或者公司的服务器上,而你没有权限修改 JRE 目录下的文件,这该怎么办?
如果你的程序是一个分布式的程序要部署在成百上千台机器上,难道还得修改每台机器的 JRE 文件吗?
好在我们还有另一种通过编程的手段来实现的思路,在代码中动态的加载 KeyStore 文件来完成证书的校验。抱着知其然知其所以然的态度,我们在最后也实践下这种方法。通过编写代码可以更深刻的了解KeyStore
、TrustManagerFactory
、SSLContext
以及SSLSocketFactory
这几个类之间的关系。
@Test
public void basicHttpsGetUsingSslSocketFactory() throws Exception {
String keyStoreFile = "D:\code\ttt.ks";
String password = "poiuyt";
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
FileInputStream in = new FileInputStream(keyStoreFile);
ks.load(in, password.toCharArray());
System.out.println(KeyStore.getDefaultType().toString());
System.out.println(TrustManagerFactory.getDefaultAlgorithm().toString());
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, tmf.getTrustManagers(), null);
LayeredConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(ctx);
String url = "https://ttt.aneasystone.com";
/**
* Return the page with content:
* 401 Authorization Required
*/
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslSocketFactory)
.build();
HttpGet request = new HttpGet(url);
request.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) ...");
CloseableHttpResponse response = httpclient.execute(request);
String responseBody = readResponseBody(response);
System.out.println(responseBody);
}
上面的代码使用了
HttpClient
,如果是使用HttpsURLConnection
只需要改动下面两行即可:
HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
con.setSSLSocketFactory(ctx.getSocketFactory());
方法4:通过Java系统属性配置 trustStore
: javax.net.ssl.trustStore
/ javax.net.ssl.trustStorePassword
- 最后的最后,我们还可以通过下面的属性来指定
trustStore
,这样也不需要编写像上面那样大量繁琐的代码。
另外,参考我前面的博客,这些属性还可以通过 JVM 的参数来设置。
System.setProperty("javax.net.ssl.trustStore", "D:\code\ttt.ks");
System.setProperty("javax.net.ssl.trustStorePassword", "poiuyt");
或者:添加【VM Options(JVM参数)】
-Djavax.net.debug=all -Djava.net.ssl.trustStore=C:/Programme/Java/jre1.8.0_102/lib/security/cacerts-Djavax.net.ssl.trustStorePassword=changeit
1.5 CA证书与PKI的核心概念
主要参考自: https://www.cnblogs.com/librarookie/p/16330406.html
PKCS
公钥加密标准
-
PKCS
公钥加密标准(Public Key Cryptography Standards
, PKCS),此一标准的设计与发布皆由RSA资讯安全公司(英语:RSA Security)所制定,PKCS 目前共发布过 15 个标准。
更多公钥加密标准
-
X.509
是密码学里公钥证书的格式标准。
- X.509是常见通用的证书格式。是ITU-T标准化部门基于他们之前的ASN.1定义的一套证书标准。
- X.509附带了证书吊销列表和用于从最终对证书进行签名的证书签发机构直到最终可信点为止的证书合法性验证算法。
- X.509证书已应用在包括TLS/SSL在内的众多网络协议里,同时它也用在很多非在线应用场景里。
应用场景
- 应用场景。如:电子签名服务。X.509证书里含有公钥、身份信息(比如网络主机名,组织的名称或个体名称等)和签名信息(可以是证书签发机构CA的签名,也可以是自签名)。
常用加密标准
-
PKCS #7
: 密码讯息语法标准(Cryptographic Message Syntax Standard),规范了以公开金钥基础设施(PKI)所产生之签章/密文之格式。其目的一样是为了拓展数位证书的应用。 -
PKCS #10
: 证书申请标准(Certification Request Standard),英语:PKCS_10,规范了向证书中心申请证书之CSR(certificate signing request)的格式。 -
PKCS #12
: 个人讯息交换标准(Personal Information Exchange Syntax Standard),定义了包含私钥与公钥证书(public key certificate)的文件格式。私钥采密码(password)保护。常见的PFX就履行了PKCS#12。
常用扩展名
-
JKS格式
:.jks
/.keystore
/.truststore
-
PKCS#7格式
:.p7b
/.p7c
/.spc
-
PKCS#12格式
:.p12
/.pfx
-
jks
或.keystore
文件是Java是存储密钥(公钥、私钥)的容器; -
.truststore
文件是存储【自己信任对象公钥】的容器; -
.pem
: 隐私增强型电子邮件(Privacy-enhanced Electronic Mail, pem),通常是Base64格式的文本格式;
.pem
文件可以存放证书或私钥,或者两者都包含。如果只包含私钥,一般用.key
文件代替。
-
.cer
/.crt
/.der
: 通常是DER
(X.690#DER_encoding)二进制格式的。
.der
或.cer
文件是二进制格式,只含有证书信息,不包含私钥。.crt
文件是二进制格式或文本格式,一般为文本格式,功能与.der
及.cer
证书文件相同。
-
.pfx
或.p12
文件是二进制格式,同时包含证书和私钥,且一般有密码保护。
.pfx
– PFX,PKCS#12
之前的格式(通常用PKCS#12
格式,比如由互联网资讯服务产生的PFX文件);.p12
–PKCS#12
格式,包含证书的同时、可能还包含私钥;
-
.csr
: 数字证书签名请求文件(Cerificate Signing Request) -
.p7r
: 是CA对证书请求的回复,只用于导入。 -
.p7b
: 以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。
Tips: 区别证书的不是后缀名,而是证书文件本身的格式与内容。
术语介绍
-
密钥对: 在非对称加密技术中,有两种密钥,分为私钥和公钥。
-
公钥: 公钥用来给数据加密,用公钥加密的数据只能使用私钥解密,公钥是密钥对持有者公布给他人的。
-
私钥: 用来解密公钥加密的数据,私钥是密钥对所有者持有,不可公布。
-
摘要: 对需要传输的文本,做一个HASH计算,一般采用SHA1,SHA2来获得。
-
签名: 使用私钥对需要传输的文本的摘要进行加密,得到的密文即被称为该次传输过程的签名。
-
签名验证: 数据接收端,拿到传输文本,但是需要确认该文本是否就是发送发出的内容,中途是否曾经被篡改。因此拿自己持有的公钥对签名进行解密(密钥对中的一种密钥加密的数据必定能使用另一种密钥解密。),得到了文本的摘要,然后使用与发送方同样的HASH算法计算摘要值,再与解密得到的摘要做对比,发现二者完全一致,则说明文本没有被篡改过。
-
密钥分为两种:
对称密钥
与非对称密钥
- 对称密钥加密: 又称私钥加密或会话密钥加密算法,指的就是加、解密使用的同是一串密钥,所以被称做对称加密。它的最大优势是加/解密速度快,适合于对大数据量进行加密,但密钥管理困难。
- 非对称密钥加密: 又称公钥密钥加密。指的是加、解密使用不同的密钥,一把作为公开的公钥,另一把作为私钥保存。公钥机制灵活,但加密和解密速度却比对称密钥加密慢得多。
【Tips】
- 密钥:指的是私钥或者公钥 —> 密钥 = 私钥/公钥;
- 密钥对:指的是公钥加上私钥 —> 密钥对 = 私钥+公钥;
- 非对称加密:
- 公钥和私钥是成对的,公钥和私钥唯一对应,它们互相解密。
- 公钥一般用来加密和验证签名,私钥用来签名和解密。
- 加密(加解密): 公钥加密,私钥解密;加密的目的是保证信息的保密传输,使只有具备资格的一方才能解密。
- 认证(加验签): 私钥数字签名,公钥验证签名;加签的目的是让收到消息的一方确认该消息是由特定方发送的。
- 在实际的应用中,通常将两者结合在一起使用,例如,对称密钥加密系统用于存储大量数据信息,而公开密钥加密系统则用于加密密钥。
原文链接:https://blog.csdn.net/qq_41586280/article/details/82669840
PEM 格式
-
PEM格式是证书颁发机构颁发证书的最常见格式
.PEM
证书通常具有扩展名。例如.pem
,.crt
,.cer
和.key
。 -
它们是以二进制文件的Base64编码的保存,包含“—– BEGIN CERTIFICATE —–”和“—– END CERTIFICATE —–”语句。
-
服务器证书,中间证书和私钥都可以放入PEM格式。
-
相较于PEM的Base64编码格式以文本文件的形式存在,
CERT
格式的文件为PEM的二进制格式,文件扩展名.cert
/.cer
/.crt
。 -
KEY格式
通常用来存放公钥或者私钥,并非X.509证书,编码可能是PEM也有可能是DER,扩展名为.key
。
Apache和其他类似服务器使用PEM格式证书。几个
PEM
证书,甚至私钥,可以包含在一个文件中,一个在另一个文件之下,但是大多数平台(例如Apache)希望证书和私钥位于单独的文件中。
DER 格式
- DER格式只是证书的二进制形式,不含私钥。
- 文件扩展名通常是.cer,有时会有.der的文件扩展名。
- 判断DER .cer文件和PEM .cer文件方法是在文本编辑器中打开它,并查找BEGIN / END语句。
- 所有类型的证书和私钥都可以用DER格式编码。
- DER通常与
Java
平台一起使用。 - SSL转换器只能将证书转换为DER格式。
PKCS#7 / P7B 格式
- PKCS#7是签名或加密数据的格式标准,官方称之为容器。由于证书是可验真的签名数据,所以可以用
SignedData
结构表述。 - PKCS#7或P7B格式通常以Base64 ASCII格式存储,文件扩展名为
.p7b
或.p7c
。 - P7B证书包含“—– BEGIN PKCS7 —–”和“—– END PKCS7 —–”语句。
- P7B文件仅包含证书和链证书,而不包含私钥。
- 多个平台支持P7B文件,包括Microsoft Windows和
Java Tomcat
。
PKCS#12 / PFX 格式
- PKCS#12 是公钥加密标准,通用格式(rsa公司标准)。规定了可包含所有私钥、公钥和证书。文件格式是加密过的。
- PKCS#12 或 PFX 格式是其以二进制格式存储,也称为 PFX 文件,在windows中可以直接导入到密钥区。也可用于导入和导出证书和私钥。
- PKCS#12 由 PFX 进化而来的,用于
交换公共的和私有的对象
的标准格式。 - 文件通常具有扩展名,例如.pkcs12 .pfx .p12。
- 密钥库和私钥用相同密码进行保护
JKS 格式
- JKS是java用来存储密钥的容器。可以同时容纳n个公钥或私钥,后缀一般是
.jks
或者.keystore
或.truststore
等。 - 在Java 8之前,这些文件的默认格式为JKS(android
.keystore
也是jsk格式的证书)。 - 从Java 9开始,默认的密钥库格式为
PKCS12
。 - Android签名
keystore
文件也是jks格式,且1.8之后要求转换到p12格式。 - JKS是二进制格式,同时包含证书和私钥,一般有密码保护,只能存储
非对称密钥对
(私钥
+x509公钥证书
)。 - 当应用程序需要通过
SSL
/TLS
进行通信时,在大多数情况下将使用java keystore
和java truststore
。 - 密钥库和私钥用不同的密码进行保护
JKS和PKCS12之间的最大区别是JKS是Java专用的格式,而PKCS12是存储加密的私钥和证书的标准化且与语言无关的方式。
2 数字证书的管理与格式转换
- 转换工具
- 工具1 : openssl : OpenSSL是一个非常有用的开源命令行工具包,可用于 X.509 证书,证书签名请求(CSRs)和加密密钥。
详情参见:[网络/SSH]OpenSSH: sshd / sftp-server / ssh-agent | ssh / scp / sftp | OpenSSL – 博客园/千千寰宇
- 工具2 : keytool : java jdk自带的证书处理工具
2.1 证书处理工具 : openssl
openssl 常用选项
-inform PEM|DER 输入格式 - DER或PEM(x509默认为PEM)
-in infile 输入文件(x509默认为stdin)
-outform PEM|DER 输出格式 - DER或PEM(x509默认为PEM)
-out outfile 输出文件(x509默认为stdout)
-keyform PEM|DER|ENGINE 私钥格式 - 默认PEM
-passin val 私钥密码/口令来源
-modulus 打印RSA密钥模数
-pubkey 输出公钥
-fingerprint 打印证书的指纹
-alias 输出证书别名
-noout 服务器托管 没有输出,只有状态
-nocert 无证书输出
-trustout 输出一个受信任的证书
-setalias val 设置证书别名
-days int 签署的证书到期前的时间 - 默认 30 天
-signkey val 用参数自行签署证书
-x509toreq 输出一个认证请求对象
-req 输入是一个证书请求,签署并输出
-CA infile 设置CA证书,必须是PEM格式
-CAkey val 设置 CA 密钥,必须是 PEM 格式;如果不在 CAfile 中
-text 打印文本形式的证书
-ext val 打印各种X509V3扩展文件
-extfile infile 要添加X509V3扩展的文件
-writerand outfile 将随机数据写到指定文件中
-extensions val 要使用的配置文件中的部分
-nameopt val 各种证书名称选项
-certopt val 各种证书文本选项
-checkhost val 检查证书是否与主机匹配
-checkemail val 检查证书是否与电子邮件匹配
-checkip val 检查证书是否与ipaddr匹配
-CAform PEM|DER CA格式--默认PEM
-CAkeyform PEM|DER|ENGINE CA密钥格式--默认为PEM
-export 输出PKCS12文件
-nodes 不要加密私钥
-nokeys 不输出私钥
-keysig 设置 MS 密钥签名类型
-nocerts 不输出证书
-clcerts 只输出客户证书
-cacerts 只输出CA证书
-info 打印有关PKCS#12结构的信息
-chain 添加证书链
-certpbe val 证书PBE算法(默认为RC2-40)
-inkey val 如果不是infile,则为私钥
-certfile infile 从文件中加载证书
-CApath dir PEM格式的CA的目录
-CAfile infile PEM格式的CA的文件
-no-CAfile 不加载默认的证书文件
-no-CApath 不从默认的证书目录中加载证书
2.2 证书处理工具 : jre keytool
2.2.1 keytool 简述
- Keytool 是一个 Java JRE 内置的 数字证书的管理工具 ; Keytool 将
密钥
(key)和证书
(certificates)存在一个称为keystore
的文件中 - 在keystore里,包含两种数据:
- 密钥实体(Key entity)——密钥(secret key)又或者是私钥和配对公钥(采用非对称加密)
- 可信任的证书实体(trusted certificate entries)——只包含公钥
- ailas(别名) : 每个 keystore 都关联这一个独一无二的alias。这个alias通常不区分大小写
2.2.2 jre cacerts 证书库 # 简介
- cacerts 证书库
全称:
certified authority certificates
= 认证机构证书
- cacerts 证书库的文件存储路径
$JAVA_HOME/jre/lib/security/cacerts
ls -la $JAVA_HOME/jre/lib/security
Windows
Linux
2.2.3 jre cacerts 证书库 # 解析cacerts证书库 / 查看所有cacerts证书
cacerts 证书库是一个不易于直接阅读的二进制文件,需通过
keytool
工具进行解读、查阅。
- 解析cacerts证书库文件
keytool -list -v -keystore cacerts -storepass "changeit" > ./cacerts.$(date +'%Y%m%d%H%M%S').log
注:JDK 密钥库文件
cacerts
的默认密码为changeit
查看
cacerts.log
的全文内容:(以 oracle jdk1.8.0_261
版本为例)
密钥库类型: jks
密钥库提供方: SUN
您的密钥库包含 93 个条目
别名: verisignclass2g2ca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: OU=VeriSign Trust Network, OU="(c) 1998 VeriSign, Inc. - For authorized use only", OU=Class 2 Public Primary Certification Authority - G2, O="VeriSign, Inc.", C=US
发布者: OU=VeriSign Trust Network, OU="(c) 1998 VeriSign, Inc. - For authorized use only", OU=Class 2 Public Primary Certification Authority - G2, O="VeriSign, Inc.", C=US
序列号: b92f60cc889fa17a4609b85b706c8aaf
有效期为 Mon May 18 08:00:00 CST 1998 至 Wed Aug 02 07:59:59 CST 2028
证书指纹:
MD5: 2D:BB:E5:25:D3:D1:65:82:3A:B7:0E:FA:E6:EB:E2:E1
SHA1: B3:EA:C4:47:76:C9:C8:1C:EA:F2:9D:95:B6:CC:A0:08:1B:67:EC:9D
SHA256: 3A:43:E2:20:FE:7F:3E:A9:65:3D:1E:21:74:2E:AC:2B:75:C2:0F:D8:98:03:05:BC:50:2C:AF:8C:2D:9B:41:A1
签名算法名称: SHA1withRSA
主体公共密钥算法: 1024 位 RSA 密钥
版本: 1
*******************************************
*******************************************
别名: digicertassuredidg3 [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=DigiCert Assured ID Root G3, OU=www.digicert.com, O=DigiCert Inc, C=US
发布者: CN=DigiCert Assured ID Root G3, OU=www.digicert.com, O=DigiCert Inc, C=US
序列号: ba15afa1ddfa0b54944afcd24a06cec
有效期为 Thu Aug 01 20:00:00 CST 2013 至 Fri Jan 15 20:00:00 CST 2038
证书指纹:
MD5: 7C:7F:65:31:0C:81:DF:8D:BA:3E:99:E2:5C:AD:6E:FB
SHA1: F5:17:A2:4F:9A:48:C6:C9:F8:A2:00:26:9F:DC:0F:48:2C:AB:30:89
SHA256: 7E:37:CB:8B:4C:47:09:0C:AB:36:55:1B:A6:F4:5D:B8:40:68:0F:BA:16:6A:95:2D:B1:00:71:7F:43:05:3F:C2
签名算法名称: SHA384withECDSA
主体公共密钥算法: 384 位 EC 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
DigitalSignature
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: CB D0 BD A9 E1 98 05 51 A1 4D 37 A2 83 79 CE 8D .......Q.M7..y..
0010: 1D 2A E4 84 .*..
]
]
*******************************************
*******************************************
别名: verisignuniversalrootca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=VeriSign Universal Root Certification Authority, OU="(c) 2008 VeriSign, Inc. - For authorized use only", OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
发布者: CN=VeriSign Universal Root Certification Authority, OU="(c) 2008 VeriSign, Inc. - For authorized use only", OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
序列号: 401ac46421b31321030ebbe4121ac51d
有效期为 Wed Apr 02 08:00:00 CST 2008 至 Wed Dec 02 07:59:59 CST 2037
证书指纹:
MD5: 8E:AD:B5:01:AA:4D:81:E4:8C:1D:D1:E1:14:00:95:19
SHA1: 36:79:CA:35:66:87:72:30:4D:30:A5:FB:87:3B:0F:A7:7B:B7:0D:54
SHA256: 23:99:56:11:27:A5:71:25:DE:8C:EF:EA:61:0D:DF:2F:A0:78:B5:C8:06:7F:4E:82:82:90:BF:B8:60:E8:4B:3C
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 1.3.6.1.5.5.7.1.12 Criticality=false
0000: 30 5F A1 5D A0 5B 30 59 30 57 30 55 16 09 69 6D 0_.].[0Y0W0U..im
0010: 61 67 65 2F 67 69 66 30 21 30 1F 30 07 06 05 2B age/gif0!0.0...+
0020: 0E 03 02 1A 04 14 8F E5 D3 1A 86 AC 8D 8E 6B C3 ..............k.
0030: CF 80 6A D4 48 18 2C 7B 19 2E 30 25 16 23 68 74 ..j.H.,...0%.#ht
0040: 74 70 3A 2F 2F 6C 6F 67 6F 2E 76 65 72 69 73 69 tp://logo.verisi
0050: 67 6E 2E 63 6F 6D 2F 76 73 6C 6F 67 6F 2E 67 69 gn.com/vslogo.gi
0060: 66 f
#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#3: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#4: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: B6 77 FA 69 48 47 9F 53 12 D5 C2 EA 07 32 76 07 .w.iHG.S.....2v.
0010: D1 97 07 19 ....
]
]
*******************************************
*******************************************
别名: digicerttrustedrootg4 [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=DigiCert Trusted Root G4, OU=www.digicert.com, O=DigiCert Inc, C=US
发布者: CN=DigiCert Trusted Root G4, OU=www.digicert.com, O=DigiCert Inc, C=US
序列号: 59b1b579e8e2132e23907bda777755c
有效期为 Thu Aug 01 20:00:00 CST 2013 至 Fri Jan 15 20:00:00 CST 2038
证书指纹:
MD5: 78:F2:FC:AA:60:1F:2F:B4:EB:C9:37:BA:53:2E:75:49
SHA1: DD:FB:16:CD:49:31:C9:73:A2:03:7D:3F:C8:3A:4D:7D:77:5D:05:E4
SHA256: 55:2F:7B:DC:F1:A7:AF:9E:6C:E6:72:01:7F:4F:12:AB:F7:72:40:C7:8E:76:1A:C2:03:D1:D9:D2:0A:C8:99:88
签名算法名称: SHA384withRSA
主体公共密钥算法: 4096 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
DigitalSignature
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: EC D7 E3 82 D2 71 5D 64 4C DF 2E 67 3F E7 BA 98 .....q]dL..g?...
0010: AE 1C 0F 4F ...O
]
]
*******************************************
*******************************************
别名: luxtrustglobalroot2ca [jdk]
创建日期: 2019-11-19
条目类型: trustedCertEntry
所有者: CN=LuxTrust Global Root 2, O=LuxTrust S.A., C=LU
发布者: CN=LuxTrust Global Root 2, O=LuxTrust S.A., C=LU
序列号: a7ea6df4b449eda6a24859ee6b815d3167fbbb1
有效期为 Thu Mar 05 21:21:57 CST 2015 至 Mon Mar 05 21:21:57 CST 2035
证书指纹:
MD5: B2:E1:09:00:61:AF:F7:F1:91:6F:C4:AD:8D:5E:3B:7C
SHA1: 1E:0E:56:19:0A:D1:8B:25:98:B2:04:44:FF:66:8A:04:17:99:5F:3F
SHA256: 54:45:5F:71:29:C2:0B:14:47:C4:18:F9:97:16:8F:24:C5:8F:C5:02:3B:F5:DA:5B:E2:EB:6E:1D:D8:90:2E:D5
签名算法名称: SHA256withRSA
主体公共密钥算法: 4096 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: FF 18 28 76 F9 48 05 2C A1 AE F1 2B 1B 2B B2 53 ..(v.H.,...+.+.S
0010: F8 4B 7C B3 .K..
]
]
#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#3: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
[CertificatePolicyId: [1.3.171.1.1.1.10]
[PolicyQualifierInfo: [
qualifierID: 1.3.6.1.5.5.7.2.1
qualifier: 0000: 16 1E 68 74 74 70 73 3A 2F 2F 72 65 70 6F 73 69 ..https://reposi
0010: 74 6F 72 79 2E 6C 75 78 74 72 75 73 74 2E 6C 75 tory.luxtrust.lu
]] ]
]
#4: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#5: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: FF 18 28 76 F9 48 05 2C A1 AE F1 2B 1B 2B B2 53 ..(v.H.,...+.+.S
0010: F8 4B 7C B3 .K..
]
]
*******************************************
*******************************************
别名: identrustpublicca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=IdenTrust Public Sector Root CA 1, O=IdenTrust, C=US
发布者: CN=IdenTrust Public Sector Root CA 1, O=IdenTrust, C=US
序列号: a0142800000014523cf467c00000002
有效期为 Fri Jan 17 01:53:32 CST 2014 至 Tue Jan 17 01:53:32 CST 2034
证书指纹:
MD5: 37:06:A5:B0:FC:89:9D:BA:F4:6B:8C:1A:64:CD:D5:BA
SHA1: BA:29:41:60:77:98:3F:F4:F3:EF:F2:31:05:3B:2E:EA:6D:4D:45:FD
SHA256: 30:D0:89:5A:9A:44:8A:26:20:91:63:55:22:D1:F5:20:10:B5:86:7A:CA:E1:2C:78:EF:95:8F:D4:F4:38:9F:2F
签名算法名称: SHA256withRSA
主体公共密钥算法: 4096 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: E3 71 E0 9E D8 A7 42 D9 DB 71 91 6B 94 93 EB C3 .q....B..q.k....
0010: A3 D1 14 A3 ....
]
]
*******************************************
*******************************************
别名: utnuserfirstobjectca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=UTN-USERFirst-Object, OU=http://www.usertrust.com, O=The USERTRUST Network, L=Salt Lake City, ST=UT, C=US
发布者: CN=UTN-USERFirst-Object, OU=http://www.usertrust.com, O=The USERTRUST Network, L=Salt Lake City, ST=UT, C=US
序列号: 44be0c8b500024b411d3362de0b35f1b
有效期为 Sat Jul 10 02:31:20 CST 1999 至 Wed Jul 10 02:40:36 CST 2019
证书指纹:
MD5: A7:F2:E4:16:06:41:11:50:30:6B:9C:E3:B4:9C:B0:C9
SHA1: E1:2D:FB:4B:41:D7:D9:C3:2B:30:51:4B:AC:1D:81:D8:38:5E:2D:46
SHA256: 6F:FF:78:E4:00:A7:0C:11:01:1C:D8:59:77:C4:59:FB:5A:F9:6A:3D:F0:54:08:20:D0:F4:B8:60:78:75:E5:8F
签名算法名称: SHA1withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
[DistributionPoint:
[URIName: http://crl.usertrust.com/UTN-USERFirst-Object.crl]
]]
#3: ObjectId: 2.5.29.37 Criticality=false
ExtendedKeyUsages [
codeSigning
timeStamping
1.3.6.1.4.1.311.10.3.4
]
#4: ObjectId: 2.5.29.15 Criticality=false
KeyUsage [
DigitalSignature
Non_repudiation
Key_CertSign
Crl_Sign
]
#5: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: DA ED 64 74 14 9C 14 3C AB DD 99 A9 BD 5B 28 4D ..dt....t+c.
0010: F7 B6 59 BF ..Y.
]
]
*******************************************
*******************************************
别名: buypassclass3ca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=Buypass Class 3 Root CA, O=Buypass AS-983163327, C=NO
发布者: CN=Buypass Class 3 Root CA, O=Buypass AS-983163327, C=NO
序列号: 2
有效期为 Tue Oct 26 16:28:58 CST 2010 至 Fri Oct 26 16:28:58 CST 2040
证书指纹:
MD5: 3D:3B:18:9E:2C:64:5A:E8:D5:88:CE:0E:F9:37:C2:EC
SHA1: DA:FA:F7:FA:66:84:EC:06:8F:14:50:BD:C7:C2:81:A5:BC:A9:64:57
SHA256: ED:F7:EB:BC:A2:7A:2A:38:4D:38:7B:7D:40:10:C6:66:E2:ED:B4:84:3E:4C:29:B4:AE:1D:5B:93:32:E6:B2:4D
签名算法名称: SHA256withRSA
主体公共密钥算法: 4096 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 47 B8 CD FF E5 6F EE F8 B2 EC 2F 4E 0E F9 25 B0 G....o..../N..%.
0010: 8E 3C 6B C3 .
0010: 3F 30 7F 2D ?0.-
]
]
*******************************************
*******************************************
别名: camerfirmachambersignca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=Global Chambersign Root - 2008, O=AC Camerfirma S.A., SERIALNUMBER=A82743287, L=Madrid (see current address at www.camerfirma.com/address), C=EU
发布者: CN=Global Chambersign Root - 2008, O=AC Camerfirma S.A., SERIALNUMBER=A82743287, L=Madrid (see current address at www.camerfirma.com/address), C=EU
序列号: c9cdd3e9d57d23ce
有效期为 Fri Aug 01 20:31:40 CST 2008 至 Sat Jul 31 20:31:40 CST 2038
证书指纹:
MD5: 9E:80:FF:78:01:0C:2E:C1:36:BD:FE:96:90:6E:08:F3
SHA1: 4A:BD:EE:EC:95:0D:35:9C:89:AE:C7:52:A1:2C:5B:29:F6:D6:AA:0C
SHA256: 13:63:35:43:93:34:A7:69:80:16:A0:D3:24:DE:72:28:4E:07:9D:7B:52:20:BB:8F:BD:74:78:16:EE:BE:BA:CA
签名算法名称: SHA1withRSA
主体公共密钥算法: 4096 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: B9 09 CA 9C 1E DB D3 6C 3A 6B AE ED 54 F1 5B 93 .......l:k..T.[.
0010: 06 35 2E 5E .5.^
]
[CN=Global Chambersign Root - 2008, O=AC Camerfirma S.A., SERIALNUMBER=A82743287, L=Madrid (see current address at www.camerfirma.com/address), C=EU]
SerialNumber: [ c9cdd3e9 d57d23ce]
]
#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:12
]
#3: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
[CertificatePolicyId: [2.5.29.32.0]
[PolicyQualifierInfo: [
qualifierID: 1.3.6.1.5.5.7.2.1
qualifier: 0000: 16 1C 68 74 74 70 3A 2F 2F 70 6F 6C 69 63 79 2E ..http://policy.
0010: 63 61 6D 65 72 66 69 72 6D 61 2E 63 6F 6D camerfirma.com
]] ]
]
#4: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#5: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: B9 09 CA 9C 1E DB D3 6C 3A 6B AE ED 54 F1 5B 93 .......l:k..T.[.
0010: 06 35 2E 5E .5.^
]
]
*******************************************
*******************************************
别名: thawteprimaryrootcag2 [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=thawte Primary Root CA - G2, OU="(c) 2007 thawte, Inc. - For authorized use only", O="thawte, Inc.", C=US
发布者: CN=thawte Primary Root CA - G2, OU="(c) 2007 thawte, Inc. - For authorized use only", O="thawte, Inc.", C=US
序列号: 35fc265cd9844fc93d263d579baed756
有效期为 Mon Nov 05 08:00:00 CST 2007 至 Tue Jan 19 07:59:59 CST 2038
证书指纹:
MD5: 74:9D:EA:60:24:C4:FD:22:53:3E:CC:3A:72:D9:29:4F
SHA1: AA:DB:BC:22:23:8F:C4:01:A1:27:BB:38:DD:F4:1D:DB:08:9E:F0:12
SHA256: A4:31:0D:50:AF:18:A6:44:71:90:37:2A:86:AF:AF:8B:95:1F:FB:43:1D:83:7F:1E:56:88:B4:59:71:ED:15:57
签名算法名称: SHA384withECDSA
主体公共密钥算法: 384 位 EC 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 9A D8 00 30 00 E7 6B 7F 85 18 EE 8B B6 CE 8A 0C ...0..k.........
0010: F8 11 E1 BB ....
]
]
*******************************************
*******************************************
别名: amazonrootca3 [jdk]
创建日期: 2019-12-6
条目类型: trustedCertEntry
所有者: CN=Amazon Root CA 3, O=Amazon, C=US
发布者: CN=Amazon Root CA 3, O=Amazon, C=US
序列号: 66c9fd5749736663f3b0b9ad9e89e7603f24a
有效期为 Tue May 26 08:00:00 CST 2015 至 Sat May 26 08:00:00 CST 2040
证书指纹:
MD5: A0:D4:EF:0B:F7:B5:D8:49:95:2A:EC:F5:C4:FC:81:87
SHA1: 0D:44:DD:8C:3C:8C:1A:1A:58:75:64:81:E9:0F:2E:2A:FF:B3:D2:6E
SHA256: 18:CE:6C:FE:7B:F1:4E:60:B2:E3:47:B8:DF:E8:68:CB:31:D0:2E:BB:3A:DA:27:15:69:F5:03:43:B4:6D:B3:A4
签名算法名称: SHA256withECDSA
主体公共密钥算法: 256 位 EC 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
DigitalSignature
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: AB B6 DB D7 06 9E 37 AC 30 86 07 91 70 C7 9C C4 ......7.0...p...
0010: 19 B1 78 C0 ..x.
]
]
*******************************************
*******************************************
别名: usertrusteccca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=USERTrust ECC Certification Authority, O=The USERTRUST Network, L=Jersey City, ST=New Jersey, C=US
发布者: CN=USERTrust ECC Certification Authority, O=The USERTRUST Network, L=Jersey City, ST=New Jersey, C=US
序列号: 5c8b99c55a94c5d27156decd8980cc26
有效期为 Mon Feb 01 08:00:00 CST 2010 至 Tue Jan 19 07:59:59 CST 2038
证书指纹:
MD5: FA:68:BC:D9:B5:7F:AD:FD:C9:1D:06:83:28:CC:24:C1
SHA1: D1:CB:CA:5D:B2:D5:2A:7F:69:3B:67:4D:E5:F0:5A:1D:0C:95:7D:F0
SHA256: 4F:F4:60:D5:4B:9C:86:DA:BF:BC:FC:57:12:E0:40:0D:2B:ED:3F:BC:4D:4F:BD:AA:86:E0:6A:DC:D2:A9:AD:7A
签名算法名称: SHA384withECDSA
主体公共密钥算法: 384 位 EC 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 3A E1 09 86 D4 CF 19 C2 96 76 74 49 76 DC E0 35 :........vtIv..5
0010: C6 63 63 9A .cc.
]
]
*******************************************
*******************************************
别名: swisssignsilverg2ca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=SwissSign Silver CA - G2, O=SwissSign AG, C=CH
发布者: CN=SwissSign Silver CA - G2, O=SwissSign AG, C=CH
序列号: 4f1bd42f54bb2f4b
有效期为 Wed Oct 25 16:32:46 CST 2006 至 Sat Oct 25 16:32:46 CST 2036
证书指纹:
MD5: E0:06:A1:C9:7D:CF:C9:FC:0D:C0:56:75:96:D8:62:13
SHA1: 9B:AA:E5:9F:56:EE:21:CB:43:5A:BE:25:93:DF:A7:F0:40:D1:1D:CB
SHA256: BE:6C:4D:A2:BB:B9:BA:59:B6:F3:93:97:68:37:42:46:C3:C0:05:99:3F:A9:8F:02:0D:1D:ED:BE:D4:8A:81:D5
签名算法名称: SHA1withRSA
主体公共密钥算法: 4096 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 17 A0 CD C1 E4 41 B6 3A 5B 3B CB 45 9D BD 1C C2 .....A.:[;.E....
0010: 98 FA 86 58 ...X
]
]
#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#3: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
[CertificatePolicyId: [2.16.756.1.89.1.3.1.1]
[PolicyQualifierInfo: [
qualifierID: 1.3.6.1.5.5.7.2.1
qualifier: 0000: 16 20 68 74 74 70 3A 2F 2F 72 65 70 6F 73 69 74 . http://reposit
0010: 6F 72 79 2E 73 77 69 73 73 73 69 67 6E 2E 63 6F ory.swisssign.co
0020: 6D 2F m/
]] ]
]
#4: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#5: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 17 A0 CD C1 E4 41 B6 3A 5B 3B CB 45 9D BD 1C C2 .....A.:[;.E....
0010: 98 FA 86 58 ...X
]
]
*******************************************
*******************************************
别名: affirmtrustpremiumca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=AffirmTrust Premium, O=AffirmTrust, C=US
发布者: CN=AffirmTrust Premium, O=AffirmTrust, C=US
序列号: 6d8c1446b1a60aee
有效期为 Fri Jan 29 22:10:36 CST 2010 至 Mon Dec 31 22:10:36 CST 2040
证书指纹:
MD5: C4:5D:0E:48:B6:AC:28:30:4E:0A:BC:F9:38:16:87:57
SHA1: D8:A6:33:2C:E0:03:6F:B1:85:F6:63:4F:7D:6A:06:65:26:32:28:27
SHA256: 70:A7:3F:7F:37:6B:60:07:42:48:90:45:34:B1:14:82:D5:BF:0E:69:8E:CC:49:8D:F5:25:77:EB:F2:E9:3B:9A
签名算法名称: SHA384withRSA
主体公共密钥算法: 4096 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 9D C0 67 A6 0C 22 D9 26 F5 45 AB A6 65 52 11 27 ..g..".&.E..eR.'
0010: D8 45 AC 63 .E.c
]
]
*******************************************
*******************************************
别名: globalsignca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=GlobalSign Root CA, OU=Root CA, O=GlobalSign nv-sa, C=BE
发布者: CN=GlobalSign Root CA, OU=Root CA, O=GlobalSign nv-sa, C=BE
序列号: 40000000001154b5ac394
有效期为 Tue Sep 01 20:00:00 CST 1998 至 Fri Jan 28 20:00:00 CST 2028
证书指纹:
MD5: 3E:45:52:15:09:51:92:E1:B7:5D:37:9F:B1:87:29:8A
SHA1: B1:BC:96:8B:D4:F4:9D:62:2A:A8:9A:81:F2:15:01:52:A4:1D:82:9C
SHA256: EB:D4:10:40:E4:BB:3E:C7:42:C9:E3:81:D3:1E:F2:A4:1A:48:B6:68:5C:96:E7:CE:F3:C1:DF:6C:D4:33:1C:99
签名算法名称: SHA1withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 60 7B 66 1A 45 0D 97 CA 89 50 2F 7D 04 CD 34 A8 `.f.E....P/...4.
0010: FF FC FD 4B ...K
]
]
*******************************************
*******************************************
别名: dtrustclass3ca2 [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=D-TRUST Root Class 3 CA 2 2009, O=D-Trust GmbH, C=DE
发布者: CN=D-TRUST Root Class 3 CA 2 2009, O=D-Trust GmbH, C=DE
序列号: 983f3
有效期为 Thu Nov 05 16:35:58 CST 2009 至 Mon Nov 05 16:35:58 CST 2029
证书指纹:
MD5: CD:E0:25:69:8D:47:AC:9C:89:35:90:F7:FD:51:3D:2F
SHA1: 58:E8:AB:B0:36:15:33:FB:80:F7:9B:1B:6D:29:D3:FF:8D:5F:00:F0
SHA256: 49:E7:A4:42:AC:F0:EA:62:87:05:00:54:B5:25:64:B6:50:E4:F4:9E:42:E3:48:D6:AA:38:E0:39:E9:57:B1:C1
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
[DistributionPoint:
[URIName: ldap://directory.d-trust.net/CN=D-TRUST%20Root%20Class%203%20CA%202%202009,O=D-Trust%20GmbH,C=DE?certificaterevocationlist]
, DistributionPoint:
[URIName: http://www.d-trust.net/crl/d-trust_root_class_3_ca_2_2009.crl]
]]
#3: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#4: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: FD DA 14 C4 9F 30 DE 21 BD 1E 42 39 FC AB 63 23 .....0.!..B9..c#
0010: 49 E0 F1 84 I...
]
]
*******************************************
*******************************************
别名: affirmtrustcommercialca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=AffirmTrust Commercial, O=AffirmTrust, C=US
发布者: CN=AffirmTrust Commercial, O=AffirmTrust, C=US
序列号: 7777062726a9b17c
有效期为 Fri Jan 29 22:06:06 CST 2010 至 Tue Dec 31 22:06:06 CST 2030
证书指纹:
MD5: 82:92:BA:5B:EF:CD:8A:6F:A6:3D:55:F9:84:F6:D6:B7
SHA1: F9:B5:B6:32:45:5F:9C:BE:EC:57:5F:80:DC:E9:6E:2C:C7:B2:78:B7
SHA256: 03:76:AB:1D:54:C5:F9:80:3C:E4:B2:E2:01:A0:EE:7E:EF:7B:57:B6:36:E8:A9:3C:9B:8D:48:60:C9:6F:5F:A7
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 9D 93 C6 53 8B 5E CA AF 3F 9F 1E 0F E5 99 95 BC ...S.^..?.......
0010: 24 F6 94 8F $...
]
]
*******************************************
*******************************************
别名: letsencryptisrgx1 [jdk]
创建日期: 2017-5-19
条目类型: trustedCertEntry
所有者: CN=ISRG Root X1, O=Internet Security Research Group, C=US
发布者: CN=ISRG Root X1, O=Internet Security Research Group, C=US
序列号: 8210cfb0d240e3594463e0bb63828b00
有效期为 Thu Jun 04 19:04:38 CST 2015 至 Mon Jun 04 19:04:38 CST 2035
证书指纹:
MD5: 0C:D2:F9:E0:DA:17:73:E9:ED:86:4D:A5:E3:70:E7:4E
SHA1: CA:BD:2A:79:A1:07:6A:31:F2:1D:25:36:35:CB:03:9D:43:29:A5:E8
SHA256: 96:BC:EC:06:26:49:76:F3:74:60:77:9A:CF:28:C5:A7:CF:E8:A3:C0:AA:E1:1A:8F:FC:EE:05:C0:BD:DF:08:C6
签名算法名称: SHA256withRSA
主体公共密钥算法: 4096 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 79 B4 59 E6 7B B6 E5 E4 01 73 80 08 88 C8 1A 58 y.Y......s.....X
0010: F6 E9 9B 6E ...n
]
]
*******************************************
*******************************************
别名: thawtepremiumserverca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: EMAILADDRESS=premium-server@thawte.com, CN=Thawte Premium Server CA, OU=Certification Services Division, O=Thawte Consulting cc, L=Cape Town, ST=Western Cape, C=ZA
发布者: EMAILADDRESS=premium-server@thawte.com, CN=Thawte Premium Server CA, OU=Certification Services Division, O=Thawte Consulting cc, L=Cape Town, ST=Western Cape, C=ZA
序列号: 36122296c5e338a520a1d25f4cd70954
有效期为 Thu Aug 01 08:00:00 CST 1996 至 Sat Jan 02 07:59:59 CST 2021
证书指纹:
MD5: A6:6B:60:90:23:9B:3F:2D:BB:98:6F:D6:A7:19:0D:46
SHA1: E0:AB:05:94:20:72:54:93:05:60:62:02:36:70:F7:CD:2E:FC:66:66
SHA256: 3F:9F:27:D5:83:20:4B:9E:09:C8:A3:D2:06:6C:4B:57:D3:A2:47:9C:36:93:65:08:80:50:56:98:10:5D:BC:E9
签名算法名称: SHA1withRSA
主体公共密钥算法: 1024 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
*******************************************
*******************************************
别名: comodoaaaca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=AAA Certificate Services, O=Comodo CA Limited, L=Salford, ST=Greater Manchester, C=GB
发布者: CN=AAA Certificate Services, O=Comodo CA Limited, L=Salford, ST=Greater Manchester, C=GB
序列号: 1
有效期为 Thu Jan 01 08:00:00 CST 2004 至 Mon Jan 01 07:59:59 CST 2029
证书指纹:
MD5: 49:79:04:B0:EB:87:19:AC:47:B0:BC:11:51:9B:74:D0
SHA1: D1:EB:23:A4:6D:17:D6:8F:D9:25:64:C2:F1:F1:60:17:64:D8:E3:49
SHA256: D7:A7:A0:FB:5D:7E:27:31:D7:71:E9:48:4E:BC:DE:F7:1D:5F:0C:3E:0A:29:48:78:2B:C8:3E:E0:EA:69:9E:F4
签名算法名称: SHA1withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
[DistributionPoint:
[URIName: http://crl.comodoca.com/AAACertificateServices.crl]
, DistributionPoint:
[URIName: http://crl.comodo.net/AAACertificateServices.crl]
]]
#3: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#4: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: A0 11 0A 23 3E 96 F1 07 EC E2 AF 29 EF 82 A5 7F ...#>......)....
0010: D0 30 A4 B4 .0..
]
]
*******************************************
*******************************************
别名: geotrustprimarycag2 [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=GeoTrust Primary Certification Authority - G2, OU=(c) 2007 GeoTrust Inc. - For authorized use only, O=GeoTrust Inc., C=US
发布者: CN=GeoTrust Primary Certification Authority - G2, OU=(c) 2007 GeoTrust Inc. - For authorized use only, O=GeoTrust Inc., C=US
序列号: 3cb2f4480a00e2feeb243b5e603ec36b
有效期为 Mon Nov 05 08:00:00 CST 2007 至 Tue Jan 19 07:59:59 CST 2038
证书指纹:
MD5: 01:5E:D8:6B:BD:6F:3D:8E:A1:31:F8:12:E0:98:73:6A
SHA1: 8D:17:84:D5:37:F3:03:7D:EC:70:FE:57:8B:51:9A:99:E6:10:D7:B0
SHA256: 5E:DB:7A:C4:3B:82:A0:6A:87:61:E8:D7:BE:49:79:EB:F2:61:1F:7D:D7:9B:F9:1C:1C:6B:56:6A:21:9E:D7:66
签名算法名称: SHA384withECDSA
主体公共密钥算法: 384 位 EC 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 15 5F 35 57 51 55 FB 25 B2 AD 03 69 FC 01 A3 FA ._5WQU.%...i....
0010: BE 11 55 D5 ..U.
]
]
*******************************************
*******************************************
别名: globalsignr3ca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=GlobalSign, O=GlobalSign, OU=GlobalSign Root CA - R3
发布者: CN=GlobalSign, O=GlobalSign, OU=GlobalSign Root CA - R3
序列号: 4000000000121585308a2
有效期为 Wed Mar 18 18:00:00 CST 2009 至 Sun Mar 18 18:00:00 CST 2029
证书指纹:
MD5: C5:DF:B8:49:CA:05:13:55:EE:2D:BA:1A:C3:3E:B0:28
SHA1: D6:9B:56:11:48:F0:1C:77:C5:45:78:C1:09:26:DF:5B:85:69:76:AD
SHA256: CB:B5:22:D7:B7:F1:27:AD:6A:01:13:86:5B:DF:1C:D4:10:2E:7D:07:59:AF:63:5A:7C:F4:72:0D:C9:63:C5:3B
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 8F F0 4B 7F A8 2E 45 24 AE 4D 50 FA 63 9A 8B DE ..K...E$.MP.c...
0010: E2 DD 1B BC ....
]
]
*******************************************
*******************************************
别名: thawteprimaryrootca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=thawte Primary Root CA, OU="(c) 2006 thawte, Inc. - For authorized use only", OU=Certification Services Division, O="thawte, Inc.", C=US
发布者: CN=thawte Primary Root CA, OU="(c) 2006 thawte, Inc. - For authorized use only", OU=Certification Services Division, O="thawte, Inc.", C=US
序列号: 344ed55720d5edec49f42fce37db2b6d
有效期为 Fri Nov 17 08:00:00 CST 2006 至 Thu Jul 17 07:59:59 CST 2036
证书指纹:
MD5: 8C:CA:DC:0B:22:CE:F5:BE:72:AC:41:1A:11:A8:D8:12
SHA1: 91:C6:D6:EE:3E:8A:C8:63:84:E5:48:C2:99:29:5C:75:6C:81:7B:81
SHA256: 8D:72:2F:81:A9:C1:13:C0:79:1D:F1:36:A2:96:6D:B2:6C:95:0A:97:1D:B4:6B:41:99:F4:EA:54:B7:8B:FB:9F
签名算法名称: SHA1withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 7B 5B 45 CF AF CE CB 7A FD 31 92 1A 6A B6 F3 46 .[E....z.1..j..F
0010: EB 57 48 50 .WHP
]
]
*******************************************
*******************************************
别名: quovadisrootca3 [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=QuoVadis Root CA 3, O=QuoVadis Limited, C=BM
发布者: CN=QuoVadis Root CA 3, O=QuoVadis Limited, C=BM
序列号: 5c6
有效期为 Sat Nov 25 03:11:23 CST 2006 至 Tue Nov 25 03:06:44 CST 2031
证书指纹:
MD5: 31:85:3C:62:94:97:63:B9:AA:FD:89:4E:AF:6F:E0:CF
SHA1: 1F:49:14:F7:D8:74:95:1D:DD:AE:02:C0:BE:FD:3A:2D:82:75:51:85
SHA256: 18:F1:FC:7F:20:5D:F8:AD:DD:EB:7F:E0:07:DD:57:E3:AF:37:5A:9C:4D:8D:73:54:6B:F4:F1:FE:D1:E1:8D:35
签名算法名称: SHA1withRSA
主体公共密钥算法: 4096 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: F2 C0 13 E0 82 43 3E FB EE 2F 67 32 96 35 5C DB .....C>../g2.5.
0010: B8 CB 02 D0 ....
]
[CN=QuoVadis Root CA 3, O=QuoVadis Limited, C=BM]
SerialNumber: [ 05c6]
]
#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#3: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
[CertificatePolicyId: [1.3.6.1.4.1.8024.0.3]
[PolicyQualifierInfo: [
qualifierID: 1.3.6.1.5.5.7.2.2
qualifier: 0000: 30 81 86 1A 81 83 41 6E 79 20 75 73 65 20 6F 66 0.....Any use of
0010: 20 74 68 69 73 20 43 65 72 74 69 66 69 63 61 74 this Certificat
0020: 65 20 63 6F 6E 73 74 69 74 75 74 65 73 20 61 63 e constitutes ac
0030: 63 65 70 74 61 6E 63 65 20 6F 66 20 74 68 65 20 ceptance of the
0040: 51 75 6F 56 61 64 69 73 20 52 6F 6F 74 20 43 41 QuoVadis Root CA
0050: 20 33 20 43 65 72 74 69 66 69 63 61 74 65 20 50 3 Certificate P
0060: 6F 6C 69 63 79 20 2F 20 43 65 72 74 69 66 69 63 olicy / Certific
0070: 61 74 69 6F 6E 20 50 72 61 63 74 69 63 65 20 53 ation Practice S
0080: 74 61 74 65 6D 65 6E 74 2E tatement.
], PolicyQualifierInfo: [
qualifierID: 1.3.6.1.5.5.7.2.1
qualifier: 0000: 16 21 68 74 74 70 3A 2F 2F 77 77 77 2E 71 75 6F .!http://www.quo
0010: 76 61 64 69 73 67 6C 6F 62 61 6C 2E 63 6F 6D 2F vadisglobal.com/
0020: 63 70 73 cps
]] ]
]
#4: ObjectId: 2.5.29.15 Criticality=false
KeyUsage [
Key_CertSign
Crl_Sign
]
#5: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: F2 C0 13 E0 82 43 3E FB EE 2F 67 32 96 35 5C DB .....C>../g2.5.
0010: B8 CB 02 D0 ....
]
]
*******************************************
*******************************************
别名: amazonrootca2 [jdk]
创建日期: 2019-12-6
条目类型: trustedCertEntry
所有者: CN=Amazon Root CA 2, O=Amazon, C=US
发布者: CN=Amazon Root CA 2, O=Amazon, C=US
序列号: 66c9fd29635869f0a0fe58678f85b26bb8a37
有效期为 Tue May 26 08:00:00 CST 2015 至 Sat May 26 08:00:00 CST 2040
证书指纹:
MD5: C8:E5:8D:CE:A8:42:E2:7A:C0:2A:5C:7C:9E:26:BF:66
SHA1: 5A:8C:EF:45:D7:A6:98:59:76:7A:8C:8B:44:96:B5:78:CF:47:4B:1A
SHA256: 1B:A5:B2:AA:8C:65:40:1A:82:96:01:18:F8:0B:EC:4F:62:30:4D:83:CE:C4:71:3A:19:C3:9C:01:1E:A4:6D:B4
签名算法名称: SHA384withRSA
主体公共密钥算法: 4096 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
DigitalSignature
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: B0 0C F0 4C 30 F4 05 58 02 48 FD 33 E5 52 AF 4B ...L0..X.H.3.R.K
0010: 84 E3 66 52 ..fR
]
]
*******************************************
*******************************************
别名: starfieldclass2ca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: OU=Starfield Class 2 Certification Authority, O="Starfield Technologies, Inc.", C=US
发布者: OU=Starfield Class 2 Certification Authority, O="Starfield Technologies, Inc.", C=US
序列号: 0
有效期为 Wed Jun 30 01:39:16 CST 2004 至 Fri Jun 30 01:39:16 CST 2034
证书指纹:
MD5: 32:4A:4B:BB:C8:63:69:9B:BE:74:9A:C6:DD:1D:46:24
SHA1: AD:7E:1C:28:B0:64:EF:8F:60:03:40:20:14:C3:D0:E3:37:0E:B5:8A
SHA256: 14:65:FA:20:53:97:B8:76:FA:A6:F0:A9:95:8E:55:90:E4:0F:CC:7F:AA:4F:B7:C2:C8:67:75:21:FB:5F:B6:58
签名算法名称: SHA1withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: BF 5F B7 D1 CE DD 1F 86 F4 5B 55 AC DC D7 10 C2 ._.......[U.....
0010: 0E A9 88 E7 ....
]
[OU=Starfield Class 2 Certification Authority, O="Starfield Technologies, Inc.", C=US]
SerialNumber: [ 00]
]
#2: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
CA:true
PathLen:2147483647
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: BF 5F B7 D1 CE DD 1F 86 F4 5B 55 AC DC D7 10 C2 ._.......[U.....
0010: 0E A9 88 E7 ....
]
]
*******************************************
*******************************************
别名: starfieldrootg2ca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=Starfield Root Certificate Authority - G2, O="Starfield Technologies, Inc.", L=Scottsdale, ST=Arizona, C=US
发布者: CN=Starfield Root Certificate Authority - G2, O="Starfield Technologies, Inc.", L=Scottsdale, ST=Arizona, C=US
序列号: 0
有效期为 Tue Sep 01 08:00:00 CST 2009 至 Fri Jan 01 07:59:59 CST 2038
证书指纹:
MD5: D6:39:81:C6:52:7E:96:69:FC:FC:CA:66:ED:05:F2:96
SHA1: B5:1C:06:7C:EE:2B:0C:3D:F8:55:AB:2D:92:F4:FE:39:D4:E7:0F:0E
SHA256: 2C:E1:CB:0B:F9:D2:F9:E1:02:99:3F:BE:21:51:52:C3:B2:DD:0C:AB:DE:1C:68:E5:31:9B:83:91:54:DB:B7:F5
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 7C 0C 32 1F A7 D9 30 7F C4 7D 68 A3 62 A8 A1 CE ..2...0...h.b...
0010: AB 07 5B 27 ..['
]
]
*******************************************
*******************************************
别名: verisignclass3ca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: OU=Class 3 Public Primary Certification Authority, O="VeriSign, Inc.", C=US
发布者: OU=Class 3 Public Primary Certification Authority, O="VeriSign, Inc.", C=US
序列号: 3c9131cb1ff6d01b0e9ab8d044bf12be
有效期为 Mon Jan 29 08:00:00 CST 1996 至 Thu Aug 03 07:59:59 CST 2028
证书指纹:
MD5: EF:5A:F1:33:EF:F1:CD:BB:51:02:EE:12:14:4B:96:C4
SHA1: A1:DB:63:93:91:6F:17:E4:18:55:09:40:04:15:C7:02:40:B0:AE:6B
SHA256: A4:B6:B3:99:6F:C2:F3:06:B3:FD:86:81:BD:63:41:3D:8C:50:09:CC:4F:A3:29:C2:CC:F0:E2:FA:1B:14:03:05
签名算法名称: SHA1withRSA
主体公共密钥算法: 1024 位 RSA 密钥
版本: 1
*******************************************
*******************************************
别名: affirmtrustpremiumeccca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=AffirmTrust Premium ECC, O=AffirmTrust, C=US
发布者: CN=AffirmTrust Premium ECC, O=AffirmTrust, C=US
序列号: 7497258ac73f7a54
有效期为 Fri Jan 29 22:20:24 CST 2010 至 Mon Dec 31 22:20:24 CST 2040
证书指纹:
MD5: 64:B0:09:55:CF:B1:D5:99:E2:BE:13:AB:A6:5D:EA:4D
SHA1: B8:23:6B:00:2F:1D:16:86:53:01:55:6C:11:A4:37:CA:EB:FF:C3:BB
SHA256: BD:71:FD:F6:DA:97:E4:CF:62:D1:64:7A:DD:25:81:B0:7D:79:AD:F8:39:7E:B4:EC:BA:9C:5E:84:88:82:14:23
签名算法名称: SHA384withECDSA
主体公共密钥算法: 384 位 EC 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 9A AF 29 7A C0 11 35 35 26 51 30 00 C3 6A FE 40 ..)z..55&Q0..j.@
0010: D5 AE D6 3C ....i...G...&....
0010: 63 64 2B C3 cd+.
]
]
#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#3: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
DigitalSignature
Key_CertSign
Crl_Sign
]
#4: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: B1 3E C3 69 03 F8 BF 47 01 D4 98 26 1A 08 02 EF .>.i...G...&....
0010: 63 64 2B C3 cd+.
]
]
*******************************************
*******************************************
别名: quovadisrootca1g3 [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=QuoVadis Root CA 1 G3, O=QuoVadis Limited, C=BM
发布者: CN=QuoVadis Root CA 1 G3, O=QuoVadis Limited, C=BM
序列号: 78585f2ead2c194be3370735341328b596d46593
有效期为 Fri Jan 13 01:27:44 CST 2012 至 Mon Jan 13 01:27:44 CST 2042
证书指纹:
MD5: A4:BC:5B:3F:FE:37:9A:FA:64:F0:E2:FA:05:3D:0B:AB
SHA1: 1B:8E:EA:57:96:29:1A:C9:39:EA:B8:0A:81:1A:73:73:C0:93:79:67
SHA256: 8A:86:6F:D1:B2:76:B5:7E:57:8E:92:1C:65:82:8A:2B:ED:58:E9:F2:F2:88:05:41:34:B7:F1:F4:BF:C9:CC:74
签名算法名称: SHA256withRSA
主体公共密钥算法: 4096 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: A3 97 D6 F3 5E A2 10 E1 AB 45 9F 3C 17 64 3C EE ....^....E.
2.2.4 jre cacerts 证书库 # 安装指定的SSL证书到cacerts证书库
以实际案例讲解安装过程。
- 案例引入:
微服务调用第三方API报如下错误:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
在项目开发中,有时会遇到与SSL安全证书导入打交道,如何把证书导入java的cacerts证书库?简单的用NEXT做个演示:
-
Step1 IE或其他浏览器,打开https://next.xxxcorp.cn,把要导入java证书库的证书下载 ,在该网页安全警报弹出窗口上查看证书–详细信息–复制到文件,会弹出一个证书导出向导对话框,按提示一直下一步直到完成。把证书保存在C盘,名字为NEXT_CertKey.cer。
-
Step2 将上面导出的证书导入java中的cacerts证书库,cmd进入
$JAVA_HOMEjrelibsecurity
目录,敲入如下命令回车执行
keytool -import -alias lxk
-keystore C:jdk1.8jrelibsecuritycacerts
-file C:NEXT_CertKey.cer
-storepass changeit
-trustcacerts
java中
cacerts
证书库默认密码为changeit
,Y
确认即可,OK,认证已添加至keystore。
或:
keytool -import -alias lxk -keystore C:jdk1.8jrelibsecuritycacerts -file C:NEXT_CertKey.cer -trustcacerts
此时命令行会提示你输入cacerts证书库的密码,你敲入changeit就行了,这是java中cacerts证书库的默认密码,亦可修改。
以后更新时,先删除原来的证书,然后导入新的证书 :
- 卸载指定证书(lxk):
keytool -delete -alias lxk -keystore C:jdk1.8jrelibsecurity.cacerts -storepass "changeit"
- 查看指定的SSL证书的安装信息:
keytool -list -keystore "%JAVA_HOME%jrelibsecuritycacerts" -alias lxk
- 验证指定的SSL证书是否安装成功:
keytool -v -list -alias lxk -keystore C:jdk1.8jrelibsecurity.cacerts
2.2.5 jre cacerts 证书库 # 从cacerts证书库导出指定的SSL证书
keytool -export -alias ca -keystore cacerts -file d:tempca.crt -storepass changeit
- -alias 证书别名
- -file 证书名称和路径
- -storepass 证书密码
2.2.6 jre cacerts 证书库 # 从cacerts库查看指定的证书
keytool -list -v -keystore ./cacerts -storepass 123456
或 : keytool -list -v -keystore e:/keytool/yushan.keystore -storepass 123456
output:
Keystore 类型: JKS
Keystore 提供者: SUN
您的 keystore 包含 1 输入
别名名称: yushan
创建日期: 2009-7-29
项类型: PrivateKeyEntry
认证链长度: 1
认证 [1]:
所有者:CN=yushan, OU=xx公司, O=xx协会, L=湘潭, ST=湖南, C=中国
签发人:CN=yushan, OU=xx公司, O=xx协会, L=湘潭, ST=湖南, C=中国
序列号:4a6f29ed
有效期: Wed Jul 29 00:40:13 CST 2009 至Thu Jul 29 00:40:13 CST 2010
证书指纹:
MD5:A3:D7:D9:74:C3:50:7D:10:C9:C2:47:B0:33:90:45:C3
SHA1:2B:FC:9E:3A:DF:C6:C4:FB:87:B8:A0:C6:99:43:E9:4C:4A:E1:18:E8
签名算法名称:SHA1withRSA
版本: 3
缺省情况下,
-list
命令打印证书的MD5
指纹。
而如果指定了-v
选项,将以可读格式打印证书
而如果指定了-rfc
选项,将以可打印的编码格式输出证书。
- 例如:
keytool -list -rfc -keystore e:/yushan.keystore -storepass 123456
output:
Keystore 类型: JKS
Keystore 提供者: SUN
您的 keystore 包含 1 输入
别名名称: yushan
创建日期: 2009-7-29
项类型: PrivateKeyEntry
认证链长度: 1
认证 [1]:
-----BEGIN CERTIFICATE-----
MIICSzCCAbSgAwIBAgIESm8p7TANBgkqhkiG9w0BAQUFADBqMQ8wDQYDVQQGDAbkuK3lm70xDzAN
BgNVBAgMBua5luWNlzEPMA0GA1UEBwwG5rmY5r2tMREwDwYDVQQKDAh4eOWNj+S8mjERMA8GA1UE
CwwIeHjlhazlj7gxDzANBgNVBAMTBnl1c2hhbjAeFw0wOTA3MjgxNjQwMTNaFw0xMDA3MjgxNjQw
MTNaMGoxDzANBgNVBAYMBuS4reWbvTEPMA0GA1UECAwG5rmW5Y2XMQ8wDQYDVQQHDAbmuZjmva0x
ETAPBgNVBAoMCHh45Y2P5LyaMREwDwYDVQQLDAh4eOWFrOWPuDEPMA0GA1UEAxMGeXVzaGFuMIGf
MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJoru1RQczRzTnBWxefVNspQBykS220rS8Y/oX3mZa
hjL4wLfOURzUuxxuVQR2jx7QI+XKME+DHQj9r6aAcLBCi/T1jwF8mVYxtpRuTzE/6KEZdhowEe70
liWLVE+hytLBHZ03Zhwcd6q5HUMu27du3MPQvqiwzTY7MrwIvQQ8iQIDAQABMA0GCSqGSIb3DQEB
BQUAA4GBAGoQQ1/FnTfkpQh+Ni6h3fZdn3sR8ZzDMbOAIYVLAhBb85XDJ8QZTarHbZMJcIdHxAl1
i08ct3E8U87V9t8GZFWVC4BFg/+zeFEv76SFpVE56iX7P1jpsu78z0m69hHlds77VJTdyfMSvtXv
sYHP3fxfzx9WyhipBwd8VPK/NgEP
-----END CERTIFICATE-----
2.2.7 修改keystore的口令
keytool -storepasswd -keystore e:/johnny.keystore(需修改口令的keystore) -storepass 123456(原始密码) -new johnny(新密码)
2.2.8 修改证书条目的口令
keytool -keypasswd -alias johnny(需要修改密码的别名) -keypass johnny(原始密码) -new 123456(别名的新密码) -keystore e:/johnny.keystore -storepass 123456
2.2.9 修改keystore中别名为johnny的信息
keytool -selfcert -alias johnny -keypass johnny -keystore e:/johnny.keystore -storepass 123456 -dname "cn=johnny,ou=johnny,o=johnny,c=us"
2.2.10 生成秘钥库、并创建一个条目
keytool -genkey -keystore "D:keystorehellocj.keystore" -alias testcj -keyalg RSA -validity 365
命令敲完回车之后,需要我们依次输入一串信息,分别是秘钥库的密码、名字和姓氏等:
上图中红框中的都是手动敲入的内容。名字和姓氏这里一般是填写一个域名,我这里填写的是 localhost,我的秘钥库口令使用的是hellocj
在上图中敲入y回车之后 :
如果你想让名为testcj的这个条目的秘钥口令和秘钥库的口令一样,直接回车即可,我这里让此条目的秘钥口令为testcj,所以我输入testcj
好了我们的秘钥库创建好了,秘钥库中也添加了一个名为testcj的条目,秘钥库的密码是hellocj,testcj这个条目对应的秘钥口令是testcj
说明:如果觉得一步一步的输入很不科学的话,可以使用下面的命令完成上述全部操作:
keytool -genkey -keystore "D:keystorehellocj.keystore" -alias testcj -keyalg RSA -validity 365 -dname "CN=localhost, OU=org, O=org.cj, L=昆明, ST=云南, C=中国" -keypass testcj -storepass hellocj
2.2.11 往已存在的秘钥库中添加条目
- 前面讲的是创建一个秘钥库文件,并添加一个初始化条目,那么如果秘钥库文件已经存在,我们想往里面添加条目怎么办。例如我想往里面添加名为cjTomcat的条目,给该条目设置的口令是helloworld 那么我的命令是:
keytool -genkey -keystore "D:keystorehellocj.keystore" -alias "cjTomcat" -keyalg "RSA" -validity 365 -dname "CN=127.0.0.1,OU=org, O=org.cj, L=昆明, ST=云南, C=中国" -keypass "helloworld" -storepass "hellocj"
2.2.X keytool 常用选项
-genkey 在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书
(在没有指定生成位置的情况下,keystore会存在用户系统默认目录,如:对于window xp系统,会生成在系统的C:/Documents and Settings/UserName/文件名为“.keystore”)
-alias 产生别名
-keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中)
-keyalg 指定密钥的算法 (如 RSA DSA(如果不指定默认采用DSA))
-validity 指定创建的证书有效期多少天
-keysize 指定密钥长度
-storepass 指定密钥库的密码(获取keystore信息所需的密码)
-keypass 指定别名条目的密码(私钥的密码)
-dname 指定证书拥有者信息 例如: "CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=州或省份名称,C=单位的两字母国家代码"
-list 显示密钥库中的证书信息 keytool -list -v -keystore 指定keystore -storepass 密码
-v 显示密钥库中的证书详细信息
-export 将别名指定的证书导出到文件 keytool -export -alias 需要导出的别名 -keystore 指定keystore -file 指定导出的证书位置及证书名称 -storepass 密码
-file 参数指定导出到文件的文件名
-delete 删除密钥库中某条目 keytool -delete -alias 指定需删除的别 -keystore 指定keystore -storepass 密码
-printcert 查看导出的证书信息 keytool -printcert -file yushan.crt
-keypasswd 修改密钥库中指定条目口令 keytool -keypasswd -alias 需修改的别名 -keypass 旧密码 -new 新密码 -storepass keystore密码 -keystore sage
-storepasswd 修改keystore口令 keytool -storepasswd -keystore e:/yushan.keystore(需修改口令的keystore) -storepass 123456(原始密码) -new yushan(新密码)
-import 将已签名数字证书导入密钥库 keytool -import -alias 指定导入条目的别名 -keystore 指定keystore -file 需导入的证书
下面是各选项的缺省值:
-alias "mykey"
-keyalg "DSA"
-keysize 1024
-validity 90
-keystore 用户宿主目录中名为 .keystore 的文件
-file 读时为标准输入,写时为标准输出
2.3 查看证书
- 查看 PEM证书
openssl x509 -text -noout -in CERTIFICATE.pem
- 查看 DER证书
openssl x509 -inder der -text -noout -in CERTIFICATE.der
- 查看 CSR证书
openssl req -text -noout -in mysite.csr
- 查看 P7B证书
openssl pkcs7 -inform der -in CERTIFICATE.p7b -print_certs -text
- 查看 JKS证书
keytool -list -rfc -keystore server.jks -storepass XXXXXX
# 查看 jre cacerts 证书库内的所有JKS证书
keytool -list -v -keystore "%JAVA_HOME%jrelibsecuritycacerts" -storepass "changeit" > ./cacerts.$(date +'%Y%m%d%H%M%S').log
# 查看 jre cacerts 证书库内的指定JKS证书
keytool -list -keystore "%JAVA_HOME%jrelibsecuritycacerts" -alias lxk
# 验证指定的SSL证书是否安装成功
keytool -v -list -alias lxk -keystore C:jdk1.8jrelibsecurity.cacerts
- 验证服务端/指定主机是否支持指定的cipher
openssl s_client -connect www.baidu.com:443 -tls1_2 -cipher ECDHE-ECDSA-AES128-GCM-SHA256
-tls1_2
用于指定tls版本,也可换为指定其他TLS版本
2.4 转换证书
转换 PEM证书(.pem /.crt /.cer)
- PEM to DER
openssl x509 -outform der -in CERTIFICATE.pem -out CERTIFICATE.der
- PEM to P7B
openssl crl2pkcs7 -nocrl -certfile CERTIFICATE.cer -certfile CACert.cer -out CERTIFICATE.p7b
- PEM to PFX
openssl pkcs12 -export -out CERTIFICATE.pfx -inkey PRIVATEKEY.key -in CERTIFICATE.cer [-certfile CACert.cer]
openssl pkcs12 -export -out server.p12 -inkey server.key -in server.pem
转换 DER证书(.der /.crt /.cer)
- DER to PEM
openssl x509 -inform der -in CERTIFICATE.cer -out CERTIFICATE.pem
转换 P7B证书(.p7b /.p7c)
- P7B to PEM
openssl pkcs7 -print_certs -in CERTIFICATE.p7b -out CERTIFICATE.cer
- P7B to PFX
openssl pkcs7 -print_certs -in CERTIFICATE.p7b -out CERTIFICATE.cer
转换 PFX证书(.pfx /.p12)
- PFX to PEM
openssl pkcs12 -in CERTIFICATE.pfx -out CERTIFICATE.cer -nodes konwersja poprze OpenSSL
openssl pkcs12 -nocerts -nodes -in cert.p12 -out private.pem
openssl pkcs12 -clcerts -nokeys -in cert.p12 -out cert.pem
PFX to PEM后CERTIFICATE.cer文件包含认证证书和私钥,需要把它们分开存储才能使用。
JKS 和 PKCS#12 格式互转
- JKS to P12
keytool -importkeystore -srcstore服务器托管type JKS -deststoretype PKCS12 -srckeystore server.jks -destkeystore server.p12
- P12 to JKS
keytool -importkeystore -srcstoretype PKCS12 -deststoretype JKS -srckeystore server.p12 -destkeystore server.jks
X 参考文献
- keytool
- https://docs.oracle.com/javase/6/docs/technotes/tools/solaris/keytool.html
- HTTPS和证书那些事 – Zhihu 【参考/推荐】
- 微服务安全之cacerts证书安装(Https协议不忽略SSL) – CSDN
- cacerts证书管理 – CSDN 【参考】
- CA证书介绍与格式转换 – 博客园 【参考/推荐】
- keytool 错误: java.io.FileNotFoundException: cacerts (拒绝访问。) – 腾讯云
- Calling https URL throws Caused by: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty – github/oracle#graal 【推荐】
./server -Djavax.net.ssl.trustStore=cacerts -Djavax.net.ssl.trustStorePassword=changeit
- Keytool命令详解(好文章!详细设置一些参数比如过期时间等) – CSDN
- 用keytool创建秘钥库以及导入导出数字证书等操作 – CSDN
- MVN 安装报错 java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty – 博客园 【推荐】
封装了一个自动化安装证书的工具类
InstallCert.java
- Camel javax.net.ssl.SSLException java.security.InvalidAlgorithmParameterException:trustAnchors参数必须为非空 – 大数据
当您看到错误
the trustAnchors parameter must be non-empty
时,通常意味着无法找到KeyStore
文件。
-
[操作系统/网络]Windows安装Openssh(scp / ssh等) – 博客园/千千寰宇
-
[网络]HTTPS下服务器与浏览器的通信:HTTPS背后的加密算法 | TLS := SSL – 博客园/千千寰宇
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net