【翻译】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 API
Java NIO Tutorial
Java Nio  1 Java NIO Tutorial 2 Java NIO Overview 3 Java NIO Channel 4 Java NIO Buffer 5 Java NIO Scatter / Gather 6 Java NIO Channel t...
1184 0
|
Java API
Java IO Tutorial
Java Io  1 Java IO Tutorial 2 Java IO Overview 3 Java IO: Files 4 Java IO: Pipes 5 Java IO: Networking 6 Java IO: Byte & Char Arrays 7 Java IO: System.
1135 0
|
10天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
10天前
|
安全 Java 开发者
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第9天】本文将深入探讨Java并发编程的核心概念,包括线程安全和性能优化。我们将详细解析Java中的同步机制,包括synchronized关键字、Lock接口以及并发集合等,并探讨它们如何影响程序的性能。此外,我们还将讨论Java内存模型,以及它如何影响并发程序的行为。最后,我们将提供一些实用的并发编程技巧和最佳实践,帮助开发者编写出既线程安全又高效的Java程序。
22 3
|
9天前
|
算法 Java 开发者
Java中的多线程编程:概念、实现与性能优化
【4月更文挑战第9天】在Java编程中,多线程是一种强大的工具,它允许开发者创建并发执行的程序,提高系统的响应性和吞吐量。本文将深入探讨Java多线程的核心概念,包括线程的生命周期、线程同步机制以及线程池的使用。接着,我们将展示如何通过继承Thread类和实现Runnable接口来创建线程,并讨论各自的优缺点。此外,文章还将介绍高级主题,如死锁的预防、避免和检测,以及如何使用并发集合和原子变量来提高多线程程序的性能和安全性。最后,我们将提供一些实用的性能优化技巧,帮助开发者编写出更高效、更稳定的多线程应用程序。
|
7天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第11天】 在Java中,高效的并发编程是提升应用性能和响应能力的关键。本文将探讨Java并发的核心概念,包括线程安全、锁机制、线程池以及并发集合等,同时提供实用的编程技巧和最佳实践,帮助开发者在保证线程安全的前提下,优化程序性能。我们将通过分析常见的并发问题,如竞态条件、死锁,以及如何利用现代Java并发工具来避免这些问题,从而构建更加健壮和高效的多线程应用程序。
|
1天前
|
安全 Java
java多线程(一)(火车售票)
java多线程(一)(火车售票)