Loading...
My Blog 我的工作和学习笔记

Windows下使用jdk工具keytool生成证书

程序员笔记 2016/01/30 JAVA基础

打开控制台进入JDK安装目录下的bin目录:这里是“D:\Program Files\Java\jdk1.7.0_51\bin”

基本操作

1、创建一个证书
指定证书库为 D:/keystore,创建别名为 tomcat70 的一条证书,它指定用 RSA 算法生成,且指定密钥长度为 1024,证书有效期为 1 年:

keytool -genkey -alias tomcat70 -keyalg RSA -keysize 1024 -keystore D:/keystore -validity 365


2、显示证书库中的证书使用如下命令:  将显示 D:/keystore 证书库的的所有证书列表

keytool -list -keystore D:/keystore


3、导出到证书文件
使用命令:keytool -export -alias tomcat70 -file D:/tomcat70.cer -keystore D:/keystore 将把证书库D:/keystore 中的别名为 tomcat70 的证书导出到 tomcat70.cer 证书文件中,它包含证书主体的信息及证书的公钥,不包括私钥,可以公开。
导出的证书文件是以二进制编码文件,无法用文本编辑器正确显示,可以加上 -rfc参数以一种可打印的编者编码输出。 如:

keytool -export -alias tomcat70 -file D:/tomcat70.cer -keystore D:/keystore –rfc


4、查看证书的信息
通过命令: keytool -printcert -file D:/tomcat70.cer 可以查看证书文件的信息。 也可以在 Windows 资源管理器中双击产生的证书文件直接查看。

keytool -printcert -file D:/tomcat70.cer


5、删除密钥库中的条目
keytool -delete -alias tomcat70 -keystore D:/keystore
这条命令将 D:/keystore 库中的 tomcat70 这一条证书删除了。

keytool -delete -alias tomcat70 -keystore D:/keystore


6、修改证书条目口令
keytool -keypasswd -alias tomcat70 -keystore D:/keystore,可以以交互的方式修改 D:/keystore 证书库中的条目为 tomcat70 的证书。
Keytool -keypasswd -alias tomcat70 -keypass oldpasswd -new newpasswd -storepass storepasswd -keystore D:/keystore 这一行命令以非交互式的方式修改库中别名为 tomcat70 的证书的密码为新密码 newpasswd,行中的 oldpasswd 是指该条证书的原密码, storepasswd 是指证书库的密码。

Keytool -keypasswd -alias tomcat70 -keypass oldpasswd -new newpasswd -storepass storepasswd -keystore D:/keystore


基础知识

-genkey      在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书 
-alias       产生别名
-keystore    指定密钥库的名称(产生的各类信息将不在.keystore文件中
-keyalg      指定密钥的算法    
-validity    指定创建的证书有效期多少天
-keysize     指定密钥长度
-storepass   指定密钥库的密码
-keypass     指定别名条目的密码
-dname       指定证书拥有者信息 例如:  "CN=sagely,OU=atr,O=szu,L=sz,ST=gd,C=cn"
-list        显示密钥库中的证书信息      keytool -list -v -keystore sage -storepass ....
-v           显示密钥库中的证书详细信息
-export      将别名指定的证书导出到文件  keytool -export -alias caroot -file caroot.crt
-file        参数指定导出到文件的文件名
-delete      删除密钥库中某条目          keytool -delete -alias sage -keystore sage
-keypasswd   修改密钥库中指定条目口令    keytool -keypasswd -alias sage -keypass .... -new .... -storepass ... -keystore sage
-import      将已签名数字证书导入密钥库  keytool -import -alias sage -keystore sagely -file sagely.crt 
             导入已签名数字证书用keytool -list -v 以后可以明显发现多了认证链长度,并且把整个CA链全部打印出来。

------------------------------------------------------------------------------------------------

keytool JAVA是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据 完整性以及认证服务。它还允许用户储存他们的通信对等者的公钥(以证书形式)。通过keytool –help查看其用法,详细信息可以参考http: //java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/keytool.html 

Java中的 keytool.exe (位于 JDK/Bin 目录下)可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中的一条证书包含该条证书的私钥,公钥和对应的 数字证书的信息。证书库中的一条证书可以导出数字证书文件,数字证书文件只包括主体信息和对应的公钥。 
每一个证书库是一个文件组成,它有访问密码,在首次创建时,它会自动生成证书库,并要求指定访问证书库的密码。 
在创建证书的的时候,需要填写证书的一些信息和证书对应的私钥密码。这些信息包括 CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx,它们的意思是: 
? CN(Common Name - 名字与姓氏):其实这个“名字与姓氏”应该是域名,比如说localhost或是blog.devep.net之类的。输成了姓名,和真正运行的时候域名 不符,会出问题。浏览器访问时,弹出一个对话框,提示“安全证书上的名称无效,或者与站点名称不匹配”,用户选择继续还是可以浏览网页。但是用http client写程序访问的时候,会抛出类似于“javax.servlet.ServletException: HTTPS hostname wrong: should be ”的异常。 
? OU(Organization Unit - 组织单位名称) 
? O(Organization - 组织名称) 
? L(Locality - 城市或区域名称) 
? ST(State - 州或省份名称) 
? C(Country - 国家名称) 
可以采用交互式让工具提示输入以上信息,也可以采用参数,如:-dname “CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx”来自动创建。


参考文档

http://deanandbai-gmail-com.iteye.com/blog/1538749

JAVA基础知识汇总

程序员笔记 2015/12/25 JAVA基础

JAVA中list,set,数组之间的转换

程序员笔记 2015/12/18 JAVA基础

JAVA的list,set,数组之间的转换,主要是使用Apache Jakarta Commons Collections,具体的方法如下:

import org.apache.commons.collections.CollectionUtils;    


String[] strArray = {"aaa", "bbb", "ccc"};    

List strList = new ArrayList();    

Set strSet = new HashSet();    

CollectionUtils.addAll(strList, strArray);    

CollectionUtils.addAll(strSet, strArray);   

CollectionUtils.addAll()方法的实现很简单,只是循环使用了Collection的add()方法而已。


如果只是想将数组转换成List,可以用JDK中的java.util.Arrays类:


import java.util.Arrays;    


String[] strArray = {"aaa", "bbb", "ccc"};    

List strList = Arrays.asList(strArray);   

不过Arrays.asList()方法返回的List不能add对象,因为该方法的实现是使用参数引用的数组的大小来new的一个ArrayList。


★ Collection转数组

直接使用Collection的toArray()方法,该方法有两个重载版本:


Object[] toArray();    

T[] toArray(T[] a);   


★ Map转Collection

直接使用Map的values()方法。


★ List和Set转换

List list = new ArrayList(new Hashset());// Fixed-size list 

List list = Arrays.asList(array);// Growable 

list list = new LinkedList(Arrays.asList(array));// Duplicate elements are discarded 

Set set = new HashSet(Arrays.asList(array));


常用加密算法的Java实现

程序员笔记 2015/12/18 JAVA基础

java InputStream读取数据问题

程序员笔记 2015/12/18 JAVA基础

转载自:http://www.cnblogs.com/MyFavorite/archive/2010/10/19/1855758.html


1. 关于InputStream.read()

     在从数据流里读取数据时,为图简单,经常用InputStream.read()方法。这个方法是从流里每次只读取读取一个字节,效率会非常低。     更好的方法是用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,一次读取多个字节。


2. 关于InputStream类的available()方法

    要一次读取多个字节时,经常用到InputStream.available()方法,这个方法可以在读写操作前先得知数据流里有多少个字节可以读取。需要注意的是,如果这个方法用在从本

地文件读取数据时,一般不会遇到问题,但如果是用于网络操作,就经常会遇到一些麻烦。比如,Socket通讯时,对方明明发来了1000个字节,但是自己的程序调用available()方法却只得到900,或者100,甚至是0,感觉有点莫名其妙,怎么也找不到原因。其实,这是因为网络通讯往往是间断性的,一串字节往往分几批进行发送。本地程序调用available()方法有时得到0,这可能是对方还没有响应,也可能是对方已经响应了,但是数据还没有送达本地。对方发送了1000个字节给你,也许分成3批到达,这你就要调用3次available()方法才能将数据总数全部得到。

      如果这样写代码:

  int count = in.available();

  byte[] b = new byte[count];

  in.read(b);

      在进行网络操作时往往出错,因为你调用available()方法时,对发发送的数据可能还没有到达,你得到的count是0。

         需要改成这样:

  int count = 0;

  while (count == 0) {

   count = in.available();

  }

  byte[] b = new byte[count];

  in.read(b);

3. 关于InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)这两个方法都是用来从流里读取多个字节的,有经验的程序员就会发现,这两个方法经常 读取不到自己想要读取的个数的字节。比如第一个方法,程序员往往希望程序能读取到b.length个字节,而实际情况是,系统往往读取不了这么多。仔细阅读Java的API说明就发现了,这个方法 并不保证能读取这么多个字节,它只能保证最多读取这么多个字节(最少1个)。因此,如果要让程序读取count个字节,最好用以下代码:

  byte[] b = new byte[count];

  int readCount = 0; // 已经成功读取的字节的个数

  while (readCount < count) {

   readCount += in.read(bytes, readCount, count - readCount);

  }

 用这段代码可以保证读取count个字节,除非中途遇到IO异常或者到了数据流的结尾(EOFException)




#参考文档:

http://www.cnblogs.com/MyFavorite/archive/2010/10/19/1855758.html