开发者社区> iamhej> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【翻译】Java Keystore Tutorial

简介: (技术小白,如有错误请指出。) 原文地址:http://www.javacodegeeks.com/2014/07/java-keystore-tutorial.html 目录 Introduction --简介 SSL and how it works --SSL的原理 Private Keys...
+关注继续查看

(技术小白,如有错误请指出。)

原文地址:http://www.javacodegeeks.com/2014/07/java-keystore-tutorial.html

目录

  1. Introduction
    --简介
  2. SSL and how it works
    --SSL的原理
  3. Private Keys
    --私钥
  4. Public Certificates
    --公证书
  5. Root Certificates
    --根证书
  6. Certificate Authorities
    --证书授权机构
  7. Certificate Chain
    --证书链
  8. Keystore using Java keytool
    --使用Java keytool
  9. Keystore Commands
    --Keystore常用命令
  10. Configure SSL using Keystores and Self Signed Certificates on Apache Tomcat
    --keystore实践·在tomcat上配置使用keystores和自认证证书的SSL

  11. 简介

我们都会在ebay、亚马逊上买东西,或者登录网银。你认为这些网站足够安全吗?敢把自己的个人信息(比如信用卡账号、银行账号)放在这些网站上吗?

大部分这类网站都使用SSL协议去保障互联网应用的安全。浏览器之类的客户端发送出的数据,SSL会先加密再传输,这样网络上的监听者无法破译这些数据。

很多java应用服务器和网站服务器都支持使用keystore来配置SSL。如果你正要写安全的java程序,学会使用keystore是第一步。

  1. SSL的原理

基于HTTP协议的SSL连接,通常是通过访问https://开头(而不是http://开头)的网址来建立的。SSL连接的开始会执行一次SSL握手,这次握手生成了这次连接的加密变量。下图是SSL握手的简要过程:

简单地说是这么工作的:

  1. 浏览器访问安全页面(通常通过https://)
  2. 网页服务器发送带证书的公钥。
  3. 浏览器检查证书是否为可信任组织发布(通常是可信的根认证机构),证书是否过期,证书是否和当前网站绑定。
  4. 然后浏览器使用公钥加密一个随机对称私钥,然后和其他加密的http数据一起通过加密的URL网址发送给服务器。
  5. 服务器用自己的私钥解密对称密钥,然后使用对称密钥去解密URL网址和http数据。
  6. 服务器使用对称密钥把客户端请求的html文档和http数据都加密之后发送回客户端。
  7. 浏览器使用对称密钥解密http数据和html文档然后展现信息。
    核心来说,SSL使用三种证书:公钥,私钥(也叫公证书或站点证书),和根证书。

  8. 私钥

私钥包含服务器的身份信息和密钥值。私钥用于握手时的散列算法,并通过密码来保证其安全和被保护。它也可以用来解密网络上的数据来获取个人信息。它就要插在钥匙孔里的大门钥匙。

  1. 公证书

公证书(公钥)是发送给客户端的一部分,就像你在机场使用的个人护照。和私钥紧密绑定在一起的公证书是私钥通过证书签名请求(CSR)创建的。先创建私钥,然后创建证书签名请求并发送给认证机构(CA),认证机构然后返回包含服务器身份和验证机构信息的已签名的证书。

  1. 根证书

根CA证书是一种自签名的CA证书。这个证书表明了发布证书的实体,比如类似于VeriSign、Thawte的认证机构(CA)。

  1. 证书授权机构

证书授权机构(CA)就是类似于VeriSign、Thawte、Commodo、GetTrust这类公司。实际上很多公司和组织都是自己的证书授权机构,比如从零开始建立完整的实施方案,或者使用开源的工具,比如OpenSSL。

  1. 证书链

当一个服务器和客户端建立了一次SSL通信,服务器就发送了一个证书给客户端,客户端需要决定是否信任该证书。这个过程被称为证书链。客户端检查该证书的发布方,在可信根证书列表中搜索该证书,然后对比可信证书列表和该证书的发布方是否一致。
如果在可信证书列表里发现了匹配,那么这次通信连接就建立了。如果没有发现,那么浏览器会弹出一个对话框,警告你这是不可信的证书,并询问你是否要继续信任该证书。

  1. 使用Java keytool

Java Keytool是一个密钥和证书的管理工具。用户可以使用它来管理自己的公钥/私钥对和证书。Java Keytool在keystore里储存密钥和证书,并使用密码来保护私钥。
每个Java Keystore里的证书都和一个唯一别名绑定。生成Java Keystore时,你需要先创建只包含私钥的.jks文件,然后通过创建一次证书签名请求(CSR)来创建公钥。你可以把证书(包含任何根证书)导入到keystore里。

  1. Keystore常用命令
    创建密钥库、密钥和证书请求

创建密钥库和一对密钥

keytool -genkey -alias mydomain -keyalg RSA -keystore keystore.jks -storepass password

给已存在的密钥库创建证书签名请求(CSR)

keytool -certreq -alias mydomain -keystore keystore.jks -storepass password -filemydomain.csr

生成密钥库和自认证证书

keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360

导入证书

往密钥库中导入一个跟证书或中间CA证书

keytool -import -trustcacerts -alias root -file Thawte.crt -keystore keystore.jks -storepass password

往密钥库中导入已签名的主证书

keytool -import -trustcacerts -alias mydomain -file mydomain.crt -keystore keystore.jks -storepass password

导出证书
从密钥库中导出证书

keytool -export -alias mydomain -file mydomain.crt -keystore keystore.jks -storepass password

查看证书
查看单独的证书

keytool -printcert -v -file mydomain.crt

查看密钥库中的证书

keytool -list -v -keystore keystore.jks -storepass password

通过别名查看特定的密钥库实例

keytool -list -v -keystore keystore.jks -storepass password -alias mydomain

删除证书
从密钥库中删除证书

keytool -delete -alias mydomain -keystore keystore.jks -storepass password

修改密码
修改密钥库的密码

keytool -storepasswd -new new_storepass -keystore keystore.jks -storepass password

修改私钥密码

keytool -keypasswd -alias client -keypass old_password -new new_password -keystore client.jks -storepass password

  1. keystore实践--在tomcat上配置使用keystores和自认证证书的SSL

  2. 创建新的密钥库和自签名的证书。使用以下命令,你会需要输入具体的信息,比如用户名,机构名,公司和位置等。

keytool -genkey -alias tomcat -keyalg RSA -keystore /home/ashraf/Desktop/JavaCodeGeek/keystore.jks -validity 360

  1. 使用以下命令列出你所创建的证书细节。

keytool -list -keystore /home/ashraf/Desktop/JavaCodeGeek/keystore.jks

  1. 下载tomcat 7

  2. 配置tomcat使其支持SSL或https连接。在Tomcat\conf\server.xml中加入connector element。

  1. 点proceed anyway。5. 启动tomcat并访问https://localhost:8443/,你会发现浏览器会显示如下图所示的错误信息。对于电商而言,这样的错误信息会导致安全的缺乏并造成大量用户的丧失,因为你所使用的证书并非由Thawte或Verisign这样的认证机构所颁布的。

=================================================

部分评论:

问:Very interesting article - would it be possible to share an image which explains / shows a mutual authentication? In other words, steps when a server has to validate clients as well.

答:Just, take a look on this image which explains the mutual authentication.

http://examples.javacodegeeks.com/wp-content/uploads/2014/08/mutualssl.png

问:Nice article! I would like to indicate the tool kse (keyStore explorer) at sourceforge. Not affiliate in any way but it sure makes it easier to understand the concepts since the GUI hides the command line, intimidating at first for some.
Nothing wrong with command line , I use myself everyday and should be the preferred way in a production server, but a GUI helps while one is not familiar with the concepts.

答:Kudos for your addition, It's a good idea to use the GUI tool specially for beginners.

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
在java程序中实现发送邮件的功能
最近比较忙,在做一个人事管理系统的项目,在这项目需求中,需要一个发送邮件的功能。这个时候我们可以使用javamail的jar包来实现完美需要的功能,在这里简单的分享一个最基础的发邮件功能。 首先我们需要去下载两个jar包,smtp.jar和mailapi.jar,导入到自己的项目中应该就不用我说了吧,大家都是有经验的开发人员了。 public class Demo1 {
1341 0
数据结构笔记--栈的总结及java数组实现简单栈结构
杂谈"栈"结构:     栈(Stack)是一种插入删除操作都只能在一个位置上进表,这个位置位于表的末端,叫做栈顶(Top).   对栈的基本操作有push和pop,表示进栈和出栈.也就相当于插入和删除操作.
799 0
Java---注解、类加载器-加强-实现运行任意目录下class中加了@MyTest的空参方法
做自己的类加载器 虚拟机的核心是通过类加载器来加载.class文件,然后进行相应的解析执行。那么我们可以自己做类加载器,手动加载需要的.class以进行解析执行,从而扩展虚拟机的功能。
925 0
Java---实现运行任意目录下class中加了@MyTest的空参方法(实现图形界面)
说明: 因为上个代码,总是要输入完整的绝对路径,比较麻烦,于是,就写了这个小程序,直接进入文件对话框选择需要运行的class文件。 只需要提前输入完整的类名。 注意:加的MyTest必须打个包,加上: import cn.hncu.myJuniitApp.vo.MyTest; 不然不是同一个注解呢。
831 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
阿里巴巴Java开发手册PDF1.2.0版(非最新版)
立即下载
阿里巴巴Java开发手册PDF1.1.0版(非最新版)
立即下载
《Java开发手册》2019最新版发布!
立即下载