ssl证书与java keytool工具
ssl协议
SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密。
https = http + ssl ,https 的安全基础即是ssl协议。
ssl证书
SSL 证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。
申请与安装ssl证书
1.制作CSR文件
CSR就是Certificate Signing Request证书请求文件。这个文件是由申请人制作,在制作的同时,系统会产生2个密钥,一个是公钥就是这个CSR文件,另外一个是私钥,存放在服务器上。
一般来说,主流的Web服务软件,通常都基于OpenSSL和Java两种基础密码库。
所以要制作CSR文件,一般APACHE、Nginx等,使用OPENSSL命令行来生成KEY+CSR2个文件;Tomcat,JBoss,Weblogic等使用Java Development Kit (JDK)工具包中的Keytool工具来生成JKS和CSR文件。
2.CA认证
将CSR提交给CA,CA一般有2种认证方式:
- 域名认证,一般通过对管理员邮箱认证的方式,这种方式认证速度快,但是签发的证书中没有企业的名称;
- 企业文档认证,需要提供企业的营业执照。一般需要3-5个工作日。 也有需要同时认证以上2种方式的证书,叫EV证书,这种证书可以使IE7以上的浏览器地址栏变成绿色,所以认证也最严格。
3.证书的安装
在收到CA的证书后,可以将证书部署上服务器,一般nginx将KEY+CER文件复制到服务器上,然后修改nginx配置文件;TOMCAT等,需要将CA签发的证书CER文件导入JKS文件后,复制上服务器,然后修改SERVER.XML。
ssl身份认证
具体过程如下:
客户端是如何检查服务端证书
先确定一点,所有访问https的资源都是需要ssl证书的;但实际上我们会发现,大多数https网站可以直接访问,而一些网站需要通过在浏览器的设置中导入证书,把该证书加入到信任列表中。
所以,客户端认证ssl证书的方式,就是基于客户端的各种证书信任列表。
1.操作系统:都有自己的证书管理器,操作系统已经自动添加了这些https网站访问时需要的证书到证书管理器中。
在windows机器上,命令行输入certmgr.msc,就打开了证书管理器:

在linux机器上(以centos6为例),/etc/pki/tls/certs下有两个文件,ca-bundle.crt和ca-bundle.trust.crt,即linux的证书库。
2.浏览器:安装在操作系统中的浏览器默认的导入证书是操作系统证书管理器的证书列表+特定浏览器自己添加的少许证书。
以谷歌浏览器为例:

举一个例子,我们访问Atlassian的网站,则可以看到 * .atlassian.com 证书已由中间证书DigiCert High Assurance EV Root CA 和 DigiCert High Assurance CA-3签署,这些中间证书已由根证书Entrust.net签名:

这三个证书组合在一起称为证书链,虽然我们并没有手动导入* .atlassian.com的证书,但是在操作系统和浏览器的证书信任列表中都能找到这三本证书:
windows操作系统的:

浏览器的:

因此客户端将信任由它们签名的任何证书,本例中即 * .atlassian.com
反之,如果某网站的ssl证书,或其根证书与中间证书,均不在客户端的证书信任列表中,那么必须手动添加该证书后,客服端才会信任该站点。
JAVA中信任证书的交互问题
问题背景:
使用 ssl 连接时,遇到不信任的证书,java应用程序一般都会拒绝连接。
浏览网站时,我们可以通过在浏览器的设置中导入证书,把证书加入到信任列表中。
而在 java 直接进行 SSL 连接应用时,默认没有一个界面来导入证书。JAVA 进行不信任的 ssl 连接时,会报如下异常:

诊断方式:
以上链接中提供了一种方式,用于诊断你的 Java 环境中是否包含了相应的信任证书。
1.下载 https://confluence.atlassian.com/kb/files/779355358/779355357/1/1441897666313/SSLPoke.class
2.将SSLPoke.class文件上传至服务器,运行如下命令诊断连接
[localadmin@11111 nick]$ java SSLPoke www.google.cn 443
Successfully connected
测试成功,说明当前java环境包含了谷歌的ssl信任证书。
解决方式:
若测试不成功,如下support.adyen.com的证书不被信任
[localadmin@111111 nick]$ java SSLPoke support.adyen.com 443
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
at sun.security.validator.Validator.validate(Validator.java:260)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1488)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:914)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:747)
at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)
at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:138)
at SSLPoke.main(SSLPoke.java:31)
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:146)
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:131)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
... 15 more
这时候,就要找到一种方式,在 JAVA 的运行环境中导入信任证书。
同样Java也有一个统一管理信任证书的地方, 是一个叫 keystore 的文件 (默认是位于 $JAVA_HOME/lib/security/cacerts ) 。
该文件使用 keytool 工具去管理 (该工具默认位于 $JAVA_HOME/bin/keytool )。
导入证书:
keytool -import -alias <证书别名> -keystore $JAVA_HOME/jre/lib/security/cacerts -file your.crt -storepass changeit 参数说明:
-keystore 执行后添加证书的位置
-file 要跑的证书的位置
-alias 证书的名字
两个注意事项:
1.keystore文件都受密码保护,访问一个已有的 keystore 文件时,会要求你验证密码,默认密码为 changeit,所以keytool命令要加上-storepass changeit
2.需用root用户执行。
查看证书:
导入证书后可以通过以下命令查看证书是否已导入:
keytool -list -keystore "/usr/java/jdk1.8.0_60/jre/lib/security/cacerts" -storepass changeit |grep "证书的别名"
删除证书:
将证书从keystore移除:
keytool -delete -storepass changeit -keystore $JAVA_HOME/jre/lib/security/cacerts -alias "证书的别名"
参考:https://blog.csdn.net/ljskr/article/details/84570573
https://yq.aliyun.com/articles/427197
ssl证书与java keytool工具的更多相关文章
- SSL 通信及 java keystore 工具介绍
http://www.javacodegeeks.com/2014/07/java-keystore-tutorial.html Table Of Contents 1. Introduction 2 ...
- Java爬虫https网页内容报错SSLHandshakeException信任(忽略)所有SSL证书
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building f ...
- WDCP V3.2面板安装且新增PHP多版本和免费Let's Encrypt SSL证书
文章原文:http://www.itbulu.com/wdcp-v32.html 我们很多网友对于WDCP面板应该算是比较熟悉的,老蒋在博客中也多次分享WDCP面板的相关教程内容,因为在平时帮助网友解 ...
- JDK自带工具keytool生成ssl证书
前言: 因为公司项目客户要求使用HTTPS的方式来保证数据的安全,所以木有办法研究了下怎么生成ssl证书来使用https以保证数据安全. 百度了不少资料,看到JAVA的JDK自带生成SSL证书的工具: ...
- java keytool证书工具使用小结
java keytool证书工具使用小结 在Security编程中,有几种典型的密码交换信息文件格式: DER-encoded certificate: .cer, .crt PEM-encod ...
- java keytool证书工具使用小结【转】
java keytool证书工具使用小结 keytool导入导出多条目对比 在Security编程中,有几种典型的密码交换信息文件格式: DER-encoded certificate: .cer, ...
- java keytool证书工具使用小结(转)
Keytool 是一个Java数据证书的管理工具 ,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:密钥实体(K ...
- java keytool证书工具使用小结(转载)
原文地址:http://www.micmiu.com/lang/java/keytool-start-guide/ Keytool 是一个Java数据证书的管理工具 ,Keytool将密钥(key)和 ...
- Java 实现Https访问工具类 跳过ssl证书验证
不多BB ,代码直接粘贴可用 import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.F ...
随机推荐
- js实现刮刮卡抽奖
刮刮卡抽奖是前端活动页常见的功能: 链接:图像擦除插件(下载及教程讲解) 推荐理由:无缝刮痕,兼容性好,上手简单 插件有些要修改的地方,打开图像擦除插件后可以看下方网友讨论,或者直接下载本博 ...
- Linux下yum下载依赖包
先安装依赖包yum-plugin-downloadonly [root@node1 ~]# yum install yum-plugin-downloadonly 方法一: [root@node1 ~ ...
- Restful规则及JPA导致内存溢出
HTTP动词 对于资源的具体操作类型,由HTTP动词表示. 常用的HTTP动词有下面五个(括号里是对应的SQL命令). GET(SELECT):从服务器取出资源(一项或多项). POST(CREATE ...
- js上 三、数据类型
3.1.什么是数据类型 a. 什么是数据类型? 想从生活中出发: 考验智商的时刻到了: 1(只)+1(只)=1(双) 3(天)+4(天)=1(周) 5(月)+7(月)=1(年) 4(时)+9(时)=1 ...
- 学习tomcat-如何建立连接,处理请求
tomcat如何建立连接,处理请求 学习探讨tomcat如何建立网络连接协议,并处理客户端过来的请求 建立http网络连接,指定通信协议 tomcat在创建时,会创建连接对象,负责处理客户端的请求,基 ...
- SQL注入及如何解决
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗 ...
- 部署docker镜像仓库及高可用
下载地址: https://github.com/goharbor/harbor/releases 安装harbor服务器: 安装harbor root@harbor-vm1:/usr/loc ...
- 用Python批量裁取图,来获取文件夹中所有图片名
批量截图(截取正方形图,哪个边短就用哪个边作为标准来截取) 功能是裁取图片中红色框的部分. 代码为: import sys from tkinter.tix import Tk from PIL im ...
- Mac 下 IDEA 启动慢的问题
转自: http://blog.csdn.net/KingBoyWorld/article/details/73440717 从控制台来看,每次都会连接本地地址(127.0.0.1),问题可能就出在这 ...
- navicat12.0.26如何激活
首先准备好所需工具链接:https://pan.baidu.com/s/1EHATRC0M34n-aNteIyBXbw 密码:r7tf 下载后如图分别为64位和32位. 操作时需要断掉网络 Nav ...