(技术小白,如有错误请指出。)
原文地址:
http://www.javacodegeeks.com/2014/07/java-keystore-tutorial.html 目录-
Introduction
--简介
-
SSL and how it works
--SSL的原理
-
Private Keys
--私钥
-
Public Certificates
--公证书
-
Root Certificates
--根证书
-
Certificate Authorities
--证书授权机构
-
Certificate Chain
--证书链
-
Keystore using Java keytool
--使用Java keytool
-
Keystore Commands
--Keystore常用命令
-
Configure SSL using Keystores and Self Signed Certificates on Apache Tomcat
--keystore实践·在tomcat上配置使用keystores和自认证证书的SSL
- 简介
我们都会在ebay、亚马逊上买东西,或者登录网银。你认为这些网站足够安全吗?敢把自己的个人信息(比如信用卡账号、银行账号)放在这些网站上吗?
大部分这类网站都使用SSL协议去保障互联网应用的安全。浏览器之类的客户端发送出的数据,SSL会先加密再传输,这样网络上的监听者无法破译这些数据。
很多java应用服务器和网站服务器都支持使用keystore来配置SSL。如果你正要写安全的java程序,学会使用keystore是第一步。
- SSL的原理
基于HTTP协议的SSL连接,通常是通过访问https://开头(而不是http://开头)的网址来建立的。SSL连接的开始会执行一次SSL握手,这次握手生成了这次连接的加密变量。下图是SSL握手的简要过程:
简单地说是这么工作的:
- 浏览器访问安全页面(通常通过https://)
- 网页服务器发送带证书的公钥。
- 浏览器检查证书是否为可信任组织发布(通常是可信的根认证机构),证书是否过期,证书是否和当前网站绑定。
- 然后浏览器使用公钥加密一个随机对称私钥,然后和其他加密的http数据一起通过加密的URL网址发送给服务器。
- 服务器用自己的私钥解密对称密钥,然后使用对称密钥去解密URL网址和http数据。
- 服务器使用对称密钥把客户端请求的html文档和http数据都加密之后发送回客户端。
-
浏览器使用对称密钥解密http数据和html文档然后展现信息。
核心来说,SSL使用三种证书:公钥,私钥(也叫公证书或站点证书),和根证书。
- 私钥
私钥包含服务器的身份信息和密钥值。私钥用于握手时的散列算法,并通过密码来保证其安全和被保护。它也可以用来解密网络上的数据来获取个人信息。它就要插在钥匙孔里的大门钥匙。
- 公证书
公证书(公钥)是发送给客户端的一部分,就像你在机场使用的个人护照。和私钥紧密绑定在一起的公证书是私钥通过证书签名请求(CSR)创建的。先创建私钥,然后创建证书签名请求并发送给认证机构(CA),认证机构然后返回包含服务器身份和验证机构信息的已签名的证书。
- 根证书
根CA证书是一种自签名的CA证书。这个证书表明了发布证书的实体,比如类似于VeriSign、Thawte的认证机构(CA)。
- 证书授权机构
证书授权机构(CA)就是类似于VeriSign、Thawte、Commodo、GetTrust这类公司。实际上很多公司和组织都是自己的证书授权机构,比如从零开始建立完整的实施方案,或者使用开源的工具,比如OpenSSL。
- 证书链
当一个服务器和客户端建立了一次SSL通信,服务器就发送了一个证书给客户端,客户端需要决定是否信任该证书。这个过程被称为证书链。客户端检查该证书的发布方,在可信根证书列表中搜索该证书,然后对比可信证书列表和该证书的发布方是否一致。
如果在可信证书列表里发现了匹配,那么这次通信连接就建立了。如果没有发现,那么浏览器会弹出一个对话框,警告你这是不可信的证书,并询问你是否要继续信任该证书。
- 使用Java keytool
Java Keytool是一个密钥和证书的管理工具。用户可以使用它来管理自己的公钥/私钥对和证书。Java Keytool在keystore里储存密钥和证书,并使用密码来保护私钥。
每个Java Keystore里的证书都和一个唯一别名绑定。生成Java Keystore时,你需要先创建只包含私钥的.jks文件,然后通过创建一次证书签名请求(CSR)来创建公钥。你可以把证书(包含任何根证书)导入到keystore里。
-
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
- keystore实践--在tomcat上配置使用keystores和自认证证书的SSL
- 创建新的密钥库和自签名的证书。使用以下命令,你会需要输入具体的信息,比如用户名,机构名,公司和位置等。
keytool -genkey -alias tomcat -keyalg RSA -keystore /home/ashraf/Desktop/JavaCodeGeek/keystore.jks -validity 360
- 使用以下命令列出你所创建的证书细节。
keytool -list -keystore /home/ashraf/Desktop/JavaCodeGeek/keystore.jks
- 下载tomcat 7
- 配置tomcat使其支持SSL或https连接。在Tomcat\conf\server.xml中加入connector element。
- 点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.