Java 生成数字证书系列
java-keytool生成数字证书
Keytool是一个Java数据证书的管理工具,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:密钥实体(Key entity)——密钥(secret key)又或者是私钥和配对公钥(采用非对称加密)可信任的证书实体(trusted certificate entries)——只包含公钥ailas(别名)每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写JDK中keytool常用命令:-genkey 在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书(在没有指定生成位置的情况下,keystore会存在用户系统默认目录,如:对于window xp系统,会生成在系统的C:\Documents and Settings\UserName\文件名为“.keystore”)-alias 产生别名-keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中)-keyalg 指定密钥的算法(如RSA DSA(如果不指定默认采用DSA))-validity 指定创建的证书有效期多少天-keysize 指定密钥长度-storepass 指定密钥库的密码(获取keystore信息所需的密码)-keypass 指定别名条目的密码(私钥的密码)-dname 指定证书拥有者信息例如:"CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=州或省份名称,C=单位的两字母国家代码"-list 显示密钥库中的证书信息keytool -list -v -keystore 指定keystore-storepass 密码-v 显示密钥库中的证书详细信息-export 将别名指定的证书导出到文件keytool -export -alias 需要导出的别名-keystore 指定keystore -file 指定导出的证书位置及证书名称-storepass 密码-file 参数指定导出到文件的文件名-delete 删除密钥库中某条目keytool -delete -alias 指定需删除的别-keystore 指定keystore -storepass 密码-printcert 查看导出的证书信息keytool -printcert -file yushan.crt-keypasswd 修改密钥库中指定条目口令keytool -keypasswd -alias 需修改的别名-keypass 旧密码-new 新密码-storepass keystore密码-keystore sage-storepasswd 修改keystore口令keytool -storepasswd -keystoree:\yushan.keystore(需修改口令的keystore) -storepass 123456(原始密码) -new yushan(新密码)-import 将已签名数字证书导入密钥库keytool -import -alias 指定导入条目的别名-keystore 指定keystore -file 需导入的证书下面是各选项的缺省值。
rsa java 创建证书
rsa java 创建证书
RSA是一种非对称加密算法,它被广泛应用于数字证书的创建和验证过程中。
在Java中,我们可以使用Java的密钥库(KeyStore)和相关的类来创建和管理RSA证书。
首先,我们需要生成RSA密钥对,包括公钥和私钥。
这可以通过Java的KeyPairGenerator类来实现。
然后,我们可以使用公钥来创建数字证书,私钥用于对证书进行签名。
接下来,我们需要将生成的密钥对存储到KeyStore中。
KeyStore是Java中用于存储密钥和证书的安全存储库。
我们可以使用KeyStore类来创建一个新的KeyStore,并将生成的密钥对存储其中。
然后,我们可以使用生成的密钥对来创建数字证书。
这可以通过Java的Certificate类来实现。
我们可以使用公钥和相关的信息(如持有者的名称、有效期等)来创建证书,并使用私钥对证书进行签名。
最后,我们可以将生成的证书存储到KeyStore中,以便后续使
用。
我们还可以使用KeyStore来管理和检索已创建的证书。
总之,通过使用Java的密钥库和相关类,我们可以很容易地使用RSA算法来创建和管理数字证书。
这些证书可以用于安全通信、身份验证和数字签名等各种安全应用中。
RSA算法的强大加密性能和Java的灵活性使得证书的创建和管理变得更加简单和安全。
如何利用java程序实现加密所需的公钥、密钥、数字证书
如何利⽤java程序实现加密所需的公钥、密钥、数字证书本篇的主要⽬的在于实现pdf的数字签名问题,只是作为我学习知识的总结。
1、数字签名算法的概述数字签名:私钥⽤于签名,公钥⽤于验证。
数字签名的作⽤:验证数据的完整性,认证数据来源,抗否认。
数字签名实现的具体原理:1、将报⽂按双⽅约定的HASH算法计算得到⼀个固定位数的报⽂摘要。
在数学上保证,只要改动报⽂中任何⼀位,重新计算出的报⽂摘要值就会与原先的值不相符。
这样就保证了报⽂的不可更改性。
(详见参考资料的"公钥密码技术原理"章节)2、将该报⽂摘要值⽤发送者的私⼈密钥加密,然后连同原报⽂和数字证书(包含公钥)⼀起发送给接收者⽽产⽣的报⽂即称数字签名。
3、接收⽅收到数字签名后,⽤同样的HASH算法对报⽂计算摘要值,然后与⽤发送者的公开密钥进⾏解密解开的报⽂摘要值相⽐较,如相等则说明报⽂确实来⾃所称的发送者。
4、同时通过证书颁发机构CA确认证书的有效性即可确认发送的真实⾝份。
常⽤的数字签名有:RSA、DSA、ECDSA2、RSA算法概述RSA是⽬前为⽌应⽤最为⼴泛的⾮对称加密算法。
⾮对称加密算法简单的说就是分成公钥和私钥。
加密和解密采⽤不同的算法实现,这样的好处是不需要像传统对称加密算法⼀样将相同算法的密钥分发给对⽅,从⽽减少密钥被获取所带来的严重危害,⽬前基本上都是采⽤⾮对称算法,⽽RSA是最为⼴泛的。
理论上1024位以上的RSA是⽆法破解的(或者未公开)。
基本原理:⾮对称算法将密码将密码分为公钥和私钥,公钥发送给⽤户(可以是多个),⽤户⽤公钥加密想要发送的数据,然后发送给服务器,服务器通过私钥解密加密后的数据。
基本步骤:⽣成公钥和私钥步骤:1. 随机选择两个不相等的质数p和q2. 计算p和q的乘积n (n的长度就是密钥长度。
3233写成⼆进制是110010100001,⼀共有12位,所以这个密钥就是12位。
实际应⽤中,RSA密钥⼀般是1024位,重要场合则为2048位。
java certificate工具类
java certificate工具类Java Certificate工具类是Java编程中常用的一个类库,用于处理与数字证书相关的操作。
数字证书在网络通信和信息安全领域起着重要的作用,通过使用Java Certificate工具类,我们可以方便地生成、解析、验证和管理数字证书。
本文将介绍Java Certificate工具类的基本使用方法及其在实际开发中的应用。
一、Java Certificate工具类概述Java Certificate工具类是Java提供的一个用于处理数字证书的类库,主要包括以下几个方面的功能:1. 数字证书的生成:Java Certificate工具类提供了生成数字证书的方法,可以生成包含公钥、私钥、证书有效期等信息的数字证书。
2. 数字证书的解析:Java Certificate工具类可以解析数字证书的各个字段,包括证书的颁发者、持有者、有效期、证书类型等信息。
3. 数字证书的验证:Java Certificate工具类支持对数字证书的有效性进行验证,包括验证证书的数字签名、证书是否过期等。
4. 数字证书的管理:Java Certificate工具类可以用于管理数字证书,包括导入、导出、删除证书等操作。
二、Java Certificate工具类的基本使用方法1. 生成数字证书使用Java Certificate工具类生成数字证书的基本步骤如下:(1)创建数字证书生成器对象。
(2)设置证书的有效期、持有者等信息。
(3)生成证书的公钥和私钥对。
(4)将公钥和证书信息传入数字证书生成器。
(5)调用生成方法生成数字证书。
2. 解析数字证书使用Java Certificate工具类解析数字证书的基本步骤如下:(1)创建数字证书解析器对象。
(2)通过输入流读取证书文件。
(3)调用解析方法解析数字证书。
(4)获取数字证书的各个字段信息,如颁发者、持有者、有效期等。
3. 验证数字证书使用Java Certificate工具类验证数字证书的基本步骤如下:(1)创建数字证书验证器对象。
java:如何生成以及导入x.509证书
java:如何生成以及导入x.509证书java:如何生成以及导入x.509证书在OpenSSL官网上下栽了OpenSSL工具,在配置环境变量后,执行以下命令://创建根证书,并采用自签名签署它//创建私钥openssl genrsa -out root/root-key.pem 1024//创建证书请求openssl req -new -out root/root-req.csr -key root/root-key.pem//自签署根证书openssl x509 -req -in root/root-req.csr -out root/root-cert.pem -signkey root/root-key.pem -days 3650//将根证书导出成浏览器支持的.p12(PKCS12)格式openssl pkcs12 -export -clcerts -in root/root-cert.pem -inkey root/root-key.pem -out root/root.p12//创建服务器证书,并采用根证书签署它//创建私钥openssl genrsa -out server/server-key.pem 1024//创建证书请求openssl req -new -out server/server-req.csr -key server/server-key.pem//签署服务器证书openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey server/server-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650//将客户证书导出成浏览器支持的.p12(PKCS12)格式openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey server/server-key.pem -out server/server.p12//创建客户证书,并采用根证书签署它//创建私钥openssl genrsa -out client/client-key.pem 1024//创建证书请求openssl req -new -out client/client-req.csr -key client/client-key.pem//签署客户证书openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey client/client-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650 //将客户证书导出成浏览器支持的.p12(PKCS12)格式openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey client/client-key.pem -out client/client.p12//将根证书导入到trustStore中keytool -import -v -trustcacerts -storepass password -alias root -file root-cert.pem -keystore root.jksv。
java生成ssl证书方法
生成 SSL 证书可以使用 Java 的 `keytool` 工具。
以下是一些基本的步骤:### 使用 keytool 生成 SSL 证书#### 步骤 1: 创建密钥库(keystore)```bashkeytool -genkey -alias your_alias -keyalg RSA -keystore your_keystore.jks -keysize 2048```这将提示你输入一些信息,如密码、姓名、组织等。
#### 步骤 2: 生成证书签名请求(CSR)```bashkeytool -certreq -alias your_alias -keystore your_keystore.jks -file your_csr_file.csr```这将生成一个 CSR 文件,它包含了你的公钥信息。
#### 步骤 3: 自签名证书```bashkeytool -export -alias your_alias -fileyour_certificate.cer -keystore your_keystore.jks```这将生成一个自签名的证书文件。
以上命令中的参数:- `your_alias` 是你为证书分配的别名。
- `your_keystore.jks` 是你的密钥库文件名。
- `your_csr_file.csr` 是证书签名请求文件名。
- `your_certificate.cer` 是自签名证书文件名。
这些命令会在命令行中运行,确保替换掉 `your_alias`、`your_keystore.jks` 等为你自己的命名和路径。
请注意,生成的证书可以用于测试或内部使用。
如果要在生产环境中使用 SSL 证书,最好从受信任的证书颁发机构(CA)获取正式证书。
Java中的数字证书的生成及维护方法
Java中的数字证书的生成及维护方法Java中的keytool.exe可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中的一条证书包含该条证书的私钥,公钥和对应的数字证书的信息。
证书库中的一条证书可以导出数字证书文件,数字证书文件只包括主体信息和对应的公钥。
每一个证书库是一个文件组成,它有访问密码,在首次创建时,它会自动生成证书库,并要求指定访问证书库的密码。
在创建证书的的时候,需要填写证书的一些信息和证书对应的私钥密码。
这些信息包括 CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx,它们的意思是:CN(Common Name名字与姓氏)OU(Organization Unit组织单位名称)O(Organization组织名称)L(Locality城市或区域名称)ST(State州或省份名称)C(Country国家名称)可以采用交互式让工具提示输入以上信息,也可以采用参数-dname "CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx"来自动创建。
1、示例如下所示一句采用交互式创建一个证书,指定证书库为 abnerCALib,创建别名为abnerCA的一条证书,它指定用RSA算法生成,且指定密钥长度为 1024,证书有效期为3650天:如下图所示:上图中最后一步,我们输入的是 CN,代表中国的缩写,也可以直接输入“中国”两个字。
2、证书的操作方法●证书的显示如:将显示 abnerCALib证书库的的所有证书列表:如下图示:又如: keytool -list -alias abnerCA -keystore abnerCALib将显示 abnerCALib证书库中别名为abnerCA的证书的信息。
如下图所示:又如: keytool -list -v -alias abnerCA -keystore abnerCALib将显示证书的详细信息( -v参数)如下图所示:●将证书导出到证书文件如: keytool -export -alias abnerCA -file abnerCA.cer -keystore abnerCALib将把证书库 abnerCALib中的别名为abnerCA的证书导出到abnerCA.cer证书文件中,它包含证书主体的信息及证书的公钥,不包括私钥,可以公开,如下图所示 :上面导出的证书文件是以二进制编码文件,无法用文本编辑器正确显示,因此不利用公布证书,可以加上 -rfc参数以一种可打印的编者编码输出。
JavaKeyStore用命令生成keystore文件自己生成证书,简介
JavaKeyStore⽤命令⽣成keystore⽂件⾃⼰⽣成证书,简介1.⽣成keyStore⽂件在命令⾏下执⾏以下命令:Shell代码收藏代码keytool -genkey -validity 36000 -alias -keyalg RSA -keystore d:\zlex.keystore其中-genkey表⽰⽣成密钥-validity指定证书有效期,这⾥是36000天-alias指定别名,这⾥是-keyalg指定算法,这⾥是RSA-keystore指定存储位置,这⾥是d:\zlex.keystore在这⾥我使⽤的密码为 123456控制台输出:Console代码收藏代码输⼊keystore密码:再次输⼊新密码:您的名字与姓⽒是什么?[Unknown]: 您的组织单位名称是什么?[Unknown]: zlex您的组织名称是什么?[Unknown]: zlex您所在的城市或区域名称是什么?[Unknown]: BJ您所在的州或省份名称是什么?[Unknown]: BJ该单位的两字母国家代码是什么[Unknown]: CNCN=, OU=zlex, O=zlex, L=BJ, ST=BJ, C=CN 正确吗?[否]: Y输⼊<tomcat>的主密码(如果和 keystore 密码相同,按回车):再次输⼊新密码:这时,在D盘下会⽣成⼀个zlex.keystore的⽂件。
2.⽣成⾃签名证书光有keyStore⽂件是不够的,还需要证书⽂件,证书才是直接提供给外界使⽤的公钥凭证。
导出证书:Shell代码收藏代码keytool -export -keystore d:\zlex.keystore -alias -file d:\zlex.cer -rfc其中-export指定为导出操作-keystore指定keystore⽂件-alias指定导出keystore⽂件中的别名-file指向导出路径-rfc以⽂本格式输出,也就是以BASE64编码输出这⾥的密码是 123456控制台输出:Console代码收藏代码输⼊keystore密码:保存在⽂件中的认证 <d:\zlex.cer>。
生成证书命令keytool
生成证书命令keytoolNOTE: (xp: %JAVA_HOME%/jre/lib/security/cacerts, linux: $JAVA_HOME/jre/lib/security /cacerts)验证是否已创建过同名的证书keytool -list -v -alias tomcat -keystore "%JAVA_HOME%/jre/lib/security/cacerts " -store pass changeit删除已创建的证书keytool -delete -alias tomcat -keystore "%%JAVA_HOME%/jre/lib/security/cacerts " -sto repass changeitKeytool是一个Java数据证书的管理工具。
keystoreKeytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:密钥实体(Key entity)——密钥(secret key)又或者是私钥和配对公钥(采用非对称加密)可信任的证书实体(trusted certificate entries)——只包含公钥Alias(别名)每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写keystore的存储位置在没有制定生成位置的情况下,keystore会存在与用户的系统默认目录,如:对于window xp系统,会生成在系统的C:\Documents and Settings\UserName\文件名为“.keystore”keystore的生成引用keytool -genkey -alias tomcat -keyalg RSA-keystore d:\mykeystore -dname "CN=local host, OU=localhost, O=localhost, L=SH, ST=SH, C=CN" -keypass changeit -storepass -validity 180参数说明:-genkey表示要创建一个新的密钥-dname表示密钥的Distinguished Names,CN=commonNameOU=organizationUnitO=organizationNameL=localityNameS=stateNameC=countryDistinguished Names表明了密钥的发行者身份-keyalg使用加密的算法,这里是RSA-alias密钥的别名-keypass私有密钥的密码,这里设置为changeit-keystore 密钥保存在D:盘目录下的mykeystore文件中-storepass 存取密码,这里设置为changeit,这个密码提供系统从mykeystore文件中将信息取出-validity该密钥的有效期为180天(默认为90天)cacerts证书文件(The cacerts Certificates File)该证书文件存在于java.home\jre\lib\security目录下,是Java系统的CA证书仓库创建证书1.服务器中生成证书:(注:生成证书时,CN要和服务器的域名相同,如果在本地测试,则使用localhos t)keytool -genkey -alias tomcat -keyalg RSA -keystore d:\mykeystore -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN" -keypass changeit -storepass ch angeit2.导出证书,由客户端安装:keytool -export -alias tomcat -keystore d:\mykeystore -file d:\mycerts.cer -storepass ch angeit3.客户端配置:为客户端的JVM导入密钥(将服务器下发的证书导入到JVM中)keytool -import -trustcacerts -alias tomcat -keystore "%JAVA_HOME%/jre/lib/security/ca certs " -file d:\mycerts.cer -storepass changeit生成的证书可以交付客户端用户使用,用以进行SSL通讯,或者伴随电子签名的jar包进行发布者的身份认证。
java安装数字证书
实验背景:系统环境:Windows XP | SUN JDK1.6U4 | Tomcat6.0.14 | CAS Server 3.1.1 + CASClient 2.1.1主机完整名称:Linly浏览器:FireFox V2.0.0.11实验步骤:STEP 1,搭建Java Web服务器环境安装JDK + Tomcat 6.0.14 ,HTTP端口8080 ,HTTPS端口8443JAVA_HOME = D:\Java\jdk1.6.0_04CATALINA_HOME = D:\Java\apache-tomcat-6.0.14安装完毕,启动Tomcat ,在浏览器上测试http://Linly:8080/出现上述界面,表明系统STEP1成功搭建。
STEP 2,使用Java Keytool工具为系统生成HTTPS证书,并为系统注册(Java Keytool相关资料可参阅:Java keytool 安全证书学习笔记),在DOS窗体运行以下指令(建议编写一个BAT批处理文件执行)clsrem please set the env JAVA_HOME before run this bat filerem delete alia tomcat if it is existedkeytool -delete -alias tomcatsso -keystore %JAVA_HOME%/jre/lib/security/cacerts-storepass changeitkeytool -delete -alias tomcatsso -storepass changeit(注释:清除系统中可能存在的名字为tomcatsso 的同名证书)rem list all alias in the cacertskeytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit(注释:列出系统证书仓库中存在证书名称列表)rem generator a keykeytool -genkey -keyalg RSA -alias tomcatsso -dname "cn=linly" -storepass changeit (注释:指定使用RSA算法,生成别名为tomcatsso的证书,存贮口令为changeit,证书的DN为"cn=linly" ,这个DN必须同当前主机完整名称一致哦,切记!!!)rem export the key keytool -export -alias tomcatsso -file %java_home%/jre/lib/security/tomcatsso.crt-storepass changeit(注释:从keystore中导出别名为tomcatsso的证书,生成文件tomcatsso.crt)rem importinto trust cacertskeytool -import -alias tomcatsso -file %java_home%/jre/lib/security/tomcatsso.crt -keystore %java_home%/jre/lib/security/cacerts -storepass changeit(注释:将tomcatsso.crt导入jre的可信任证书仓库。
使用JDK自带的keytool工具生成证书
使⽤JDK⾃带的keytool⼯具⽣成证书⼀、keytool 简介 keytool 是java⽤于管理密钥和证书的⼯具,它使⽤户能够管理⾃⼰的公钥/私钥对及相关证书,⽤于(通过数字签名)⾃我认证(⽤户向别的⽤户/服务认证⾃⼰)或数据完整性以及认证服务。
在JDK 1.4以后的版本中都包含了这⼀⼯具,它的位置为%JAVA_HOME%\bin\keytool.exe,如下图所⽰:其功能包括:创建并管理密钥创建并管理证书作为CA 为证书授权导⼊导出证书⼆、keytool的⽤法三、⽣成证书⽣成证书主要是使⽤" -genkey",该命令的可⽤参数如下:⽰例:⽣成⼀个名称为tomcat的证书(cas服务https环境证书⽣成⽰例)keytool -genkey -alias tomcat -keyalg RSA -keystore D:/cas.keystore功能说明:⽣成⼀个别名为tomcat的证书,该证书存放在名为cas.keystore的密钥库中,若cas.keystore密钥库不存在则创建。
参数说明:-genkey:⽣成⼀对⾮对称密钥;-alias:指定密钥对的别名,该别名是公开的;-keyalg:指定加密算法,本例中的采⽤通⽤的RAS加密算法;-keystore:密钥库的路径及名称,不指定的话,默认在操作系统的⽤户⽬录下⽣成⼀个".keystore"的⽂件。
注意: 1.密钥库的密码⾄少必须6个字符,可以是纯数字或者字母或者数字和字母的组合等等 2."名字与姓⽒"应该是输⼊域名,⽽不是我们的个⼈姓名,其他的可以不填执⾏完上述命令后,在D盘下⽣成了⼀个"cas.keystore"的⽂件,如下图所⽰:四、导出证书导出证书主要是使⽤" -export",该命令的可⽤参数如下:⽰例:将名为cas.keystore的证书库中别名为tomcat的证书条⽬导出到证书⽂件cas.crt中keytool -export -trustcacerts -alias tomcat -file D:/cas.crt -keystore D:/cas.keystore执⾏完上述命令后,在D盘下⽣成了⼀个"cas.crt"的⽂件,如下图所⽰:五、导⼊证书导⼊证书主要是使⽤" -import",该命令的可⽤参数如下:⽰例1:将证书⽂件cas.crt导⼊到名为test_cacerts的证书库中keytool -import -file D:/cas.crt -keystore D:/test_cacerts⽰例2:将证书⽂件test.crt导⼊到名为cacerts的证书库中(这⾥将会演⽰将证书导⼊到jdk的证书库中)keytool -import -trustcacerts -alias tomcat -file D:/cas.crt -keystore %JAVA_HOME%/jre/lib/security/cacerts注:次例中jdk证书库的默认密码为:changeit六、查看密钥库⾥⾯的证书keytool -list -keystore D:/cas.keystore七、查看证书信息keytool -printcert -file D:/cas.crt⼋、删除密钥库中的条⽬⽰例:删除密钥库cas.keystore中别名为tomcat的证书条⽬keytool -delete -keystore D:/cas.keystore -alias tomcat九、修改证书条⽬的⼝令⽰例:将密钥库cas.keystore中别名为test的证书条⽬的密码修改为666666(别名为test的证书条⽬必须存在)keytool -keypasswd -alias test -keystore D:/cas.keystore。
Java使用keytool创建CA证书的操作
Java使⽤keytool创建CA证书的操作keytool是⼀个密钥和证书管理⼯具1.keytool⼯具位置keytool⼯具在 JDK 的安装⽬录的 bin ⽬录下⾯2.keytool⼯具命令展⽰打开命令⾏进⼊ bin ⽬录,然后输⼊命令 keytool.exe,就能看见keytool⼯具⽀持哪些命令,如下图所⽰:注意下⾯的⽤法提⽰:使⽤ “keytool -command_name -help” 获取 command_name 的⽤法3.查看具体命令⽤法这⾥我们使⽤ -genkeypair 命令来创建密钥库,先来看看 genkeypair 命令的⽤法,如下图所⽰:4.新建密钥库.\keytool.exe -genkeypair -alias CA -keyalg RSA -validity 30 -keystore D:\keytoolCert\.CAkeystore4.1.参数说明-alias CA: alias表⽰别名的意思,这⾥别名为 CA,如果不写的话,它的默认值为 mykey-keyalg RSA:密钥算法名称,这⾥使⽤RSA算法-validity 30:有效天数为30天-keystore D:\keytoolCert.CAkeystore:指定密钥库存放的位置。
命令输⼊过后会让我们输⼊密码、唯⼀判别名(dname)和密钥⼝令注意密钥库的密码⾄少必须6个字符,可以是纯数字或者字母或者数字和字母的组合等等名字与姓⽒"应该是输⼊域名,⽽不是我们的个⼈姓名,其他的可以不填这条命令的完整含义是:使⽤ keytool.exe ,创建⼀个别名为 CA,算法为 RSA,有效天数为30天的密钥,并将它存放在 D:\keytoolCert\ ⽬录下的⼀个名叫 .CAkeystore 的密钥库中,如果密钥库不存在则⾃动创建。
执⾏完上述命令后,在 D:\keytoolCert\ ⽬录下⽣成了⼀个".CAkeystore"的⽂件,如下图所⽰:5.查看密钥库⾥⾯的信息命令如下:.\keytool.exe -list -keystore D:\keytoolCert\.CAkeystore -v结果如下:5.1.查看密钥库信息其他命令查看密钥库中指定密钥的信息:keytool.exe -list -alias CA -keystore“D:\keytoolCert.CAkeystore” -v6.导出密钥到证书⽂件.\keytool -export -alias CA -file D:\keytoolCert\pendIssueCert_1.cer -keystore D:\keytoolCert\.CAkeystore执⾏完上述命令后,在 D:\keytoolCert\ ⽬录下⽣成了⼀个"pendIssueCert_1.cer"的证书⽂件,如下图所⽰:7.查看指定证书⽂件的信息:keytool.exe -printcert -file D:\keytoolCert\.pendIssueCert_1.cer -v8.导⼊证书将证书⽂件 pendIssueCert_1.cer 导⼊到名为 .pendIssuekeystore 的证书库中keytool -import -keystore D:\keytoolCert\.pendIssuekeystore -file D:\keytoolCert\pendIssueCert_1.cer注意:D:\keytoolCert.pendIssuekeystore 密钥库不存在会⾃动创建导⼊时没有输⼊ -alias 那么它的别名就是 mykey ,如果有需要可以⾃⼰指定别名9.删除密钥库中的条⽬删除密钥库 .pendIssuekeystore 中别名为 mykey 的证书条⽬keytool -delete -keystore D:\keytoolCert\.pendIssuekeystore -alias mykey删除前先查看有⼀个密钥,删除后再查看就没有了,表⽰删除成功。
数字化身份的确定——数字证书 java (1)
本章重点:第4章使用数字签名来确定数据的身份,保证了身份的确定性以及不可篡改性和不可否认性。
使用数字签名的前提是接收数据者能够确性验证签名时所使用的公钥确实是某个人的,数字证书可以解决这一问题。
本章主要内容:使用Keytool工具创建数字证书使用Keytool工具和Java程序读取并显示数字证书使用Keytool工具和Java程序维护密钥库使用Java程序签发数字证书对单个数字证书作初步检验数字证书的创建数字证书的主要功能是保存公钥和某个人或机构的对应关系,本节介绍几种数字证书的创建方法。
它们都使用了keytool工具的-genkey参数。
5.1.1 使用默认的密钥库和算法创建数字证书★ 实例说明本实例使用J2SDK提供的keytool工具用默认的密钥库和算法创建几个数字证书。
★运行程序keytool程序运行时加上命令行参数–genkey即可。
在命令行中输入“keytool –genkey”将自动使用默认的算法生成公钥和私钥,并以交互方式获得公钥持有者的信息。
其交互过程如下,其中带下划线的字符为用户键盘输入的内容,其他为系统提示的内容。
C:\>keytool -genkey输入keystore密码: 123456您的名字与姓氏是什么?[Unknown]: Xu Yingxiao1您的组织单位名称是什么?[Unknown]: Network Center您的组织名称是什么?[Unknown]: Shanghai University您所在的城市或区域名称是什么?[Unknown]: ZB您所在的州或省份名称是什么?[Unknown]: Shanghai该单位的两字母国家代码是什么[Unknown]: CNCN=Xu Yingxiao1, OU=Network Center, O=Shanghai University, L=ZB,ST=Shanghai, C=CN 正确吗?[否]:是输入的主密码(如果和 keystore 密码相同,按回车): abcdefgC:\>如果使用中文操作系统,上述操作中输入的“是”不能用英文“yes”代替。
JAVA调用keytool生成keystore和cer证书
JAVA调⽤keytool⽣成keystore和cer证书keytool是⼀个Java数据证书的管理⼯具,keytool将密钥(key)和证书(certificates)存在⼀个称为keystore的⽂件中在keystore⾥,包含两种数据:密钥实体(Key entity)——密钥(secret key)⼜或者是私钥和配对公钥(采⽤⾮对称加密)可信任的证书实体(trusted certificate entries)——只包含公钥ailas(别名)每个keystore都关联这⼀个独⼀⽆⼆的alias,这个alias通常不区分⼤⼩写下⾯给出⼀个java 调⽤ keytool ⽣成keystore 和 cer 证书的例⼦测试:public class ExportCertFormKeystore {public void execCommand(String[] arstringCommand) {for (int i = 0; i < arstringCommand.length; i++) {System.out.print(arstringCommand[i] + " ");}try {Runtime.getRuntime().exec(arstringCommand);} catch (Exception e) {System.out.println(e.getMessage());}}public void execCommand(String arstringCommand) {try {Runtime.getRuntime().exec(arstringCommand);} catch (Exception e) {System.out.println(e.getMessage());}}/*** ⽣成密钥*/public void genkey() {String[] arstringCommand = new String[] {"cmd ", "/k","start", // cmd Shell命令"keytool","-genkey", // -genkey表⽰⽣成密钥"-validity", // -validity指定证书有效期(单位:天),这⾥是36000天"36500","-keysize",// 指定密钥长度"1024","-alias", // -alias指定别名,这⾥是ss"ss","-keyalg", // -keyalg 指定密钥的算法 (如 RSA DSA(如果不指定默认采⽤DSA))"RSA","-keystore", // -keystore指定存储位置,这⾥是d:/demo.keystore"d:/demo.keystore","-dname",// CN=(名字与姓⽒), OU=(组织单位名称), O=(组织名称), L=(城市或区域名称), // ST=(州或省份名称), C=(单位的两字母国家代码)""CN=(SS), OU=(SS), O=(SS), L=(BJ), ST=(BJ), C=(CN)","-storepass", // 指定密钥库的密码(获取keystore信息所需的密码)"123456","-keypass",// 指定别名条⽬的密码(私钥的密码)"123456","-v"// -v 显⽰密钥库中的证书详细信息};execCommand(arstringCommand);}/*** 导出证书⽂件*/public void export() {String[] arstringCommand = new String[] {"cmd ", "/k","start", // cmd Shell命令"keytool","-export", // - export指定为导出操作"-keystore", // -keystore指定keystore⽂件,这⾥是d:/demo.keystore "d:/demo.keystore","-alias", // -alias指定别名,这⾥是ss"ss","-file",//-file指向导出路径"d:/demo.cer","-storepass",// 指定密钥库的密码"123456"};execCommand(arstringCommand);}}View CodeJUnit测试⽤例:import org.junit.Test;public class ExportCertFormKeystoreTest {@Testpublic void genkeyTest() {//⽣成密钥测试new ExportCertFormKeystore().genkey();}@Testpublic void exportTest() {//导出证书⽂件测试new ExportCertFormKeystore().export();}}View Code运⾏测试⽤例之后,在D盘的根⽬录下⾯会⽣成两个⽂件:demo.keystoredemo.cer。
Java数字证书的一些实例
(8)设置新证书签发者
cinfo2.set(X509CertInfo.ISSUER+"."+CertificateIssuerName.DN_NAME,issuer);应用第三步的结果
(9)设置新证书签名算法信息
(4)获取待签发的证书
CertificateFactory cf=CertificateFactory.getInstance("X.509");
FileInputStream in2=new FileInputStream("user.csr");
java.security.cert.Certificate c2=cf.generateCertificate(in);
Java数字证书的一些实例.txt你看得见我打在屏幕上的字,却看不到我掉在键盘上的泪!自己选择45°仰视别人,就休怪他人135°俯视着看你。Java数字证书的一些实例
一:需要包含的包
import java.security.*;
import java.io.*;
import java.util.*;
(5)从待签发的证书中提取证书信息
byte [] encod2=c2.getEncoded();
X509CertImpl cimp2=new X509CertImpl(encod2); 用该编码创建X509CertImpl类型对象
X509CertInfo cinfo2=(X509CertInfo)cimp2.get(+"."+); 获取X509CertInfo对象
java x509certificate用法
java x509certificate用法X509Certificate是Java中用于表示数字证书的类,它提供了一组方法来操作和验证数字证书。
在Java中,X509Certificate通常用于安全通信,如SSL/TLS连接、数字签名和证书验证等场景。
要使用X509Certificate,首先需要获取数字证书的字节数组。
这可以通过从文件中读取证书、从证书存储中获取证书或从证书请求中生成证书等方式获得。
一旦获得了证书字节数组,就可以使用X509Certificate类的构造函数创建一个新的对象。
以下是一个简单的示例,演示如何使用字节数组创建一个X509Certificate对象:```javaimportjava.security.cert.Certificate;importjava.security.cert.X509Certificate;//假设已经获得了证书字节数组byte[]certBytes=...;X509Certificatecertificate=newX509Certificate(certBytes);```二、验证数字证书X509Certificate类提供了一组方法来验证数字证书,如验证证书的有效期、签发者、主题等。
可以使用isValid()方法检查证书是否有效,使用getIssuerDN()方法获取证书的签发者信息,使用getSubjectDN()方法获取证书的主题信息等。
以下是一个示例,演示如何验证数字证书:```java//假设已经有一个X509Certificate对象X509Certificatecertificate=...;//验证证书有效性if(certificate.isValid()){System.out.println("证书有效");}else{System.out.println("证书无效");}//获取签发者信息X509CertInfocertInfo=(X509CertInfo)certificate.get(X509Ce );GeneralNameissuerName=(GeneralName)certInfo.getIssuerDN() .getName();Stringissuer=issuerName.getName(X509Name.RFC2253);System.out.println("签发者:"+issuer);//获取主题信息X509CertInfosubjectInfo=(X509CertInfo)certificate.get(X50 9CertInfo.SUBJECT);Stringsubject=((X509Name)subjectInfo.getSubjectDN().getNa me()).toString();System.out.println("主题:"+subject);```三、使用X509Certificate进行安全通信在安全通信中,可以使用X509Certificate进行SSL/TLS连接、数字签名和证书验证等操作。
java certificate工具类
java certificate工具类【实用版】目录1.Java 证书概述2.Java 证书工具类介绍3.Java 证书工具类的使用示例4.总结正文1.Java 证书概述Java 证书是一种用于证明 Java 应用程序安全性和可靠性的电子证明文件。
通过使用证书,可以确保客户端在运行 Java 应用程序时,应用程序没有被篡改或伪造。
Java 证书由认证机构 (Certificate Authority,CA) 颁发,并使用公钥基础设施 (Public Key Infrastructure,PKI) 进行管理。
2.Java 证书工具类介绍Java 证书工具类是一组用于处理 Java 证书的类和方法。
它们提供了用于生成、解析、验证和存储证书的 API。
Java 证书工具类包括以下内容:- 证书工厂 (CertificateFactory):用于生成和解析证书的工厂类。
- 证书颁发机构 (CertificateAuthority):用于管理证书颁发机构的类。
- 证书存储 (CertPath):用于存储证书的类。
- 证书链 (CertificateChain):用于表示证书链的类。
- 证书路径 (CertificatePathBuilder):用于构建证书链的类。
3.Java 证书工具类的使用示例以下是一个使用 Java 证书工具类的示例,用于从文件中读取证书并验证其签名:```javaimport java.io.FileInputStream;import java.io.IOException;import java.security.Certificate;import java.security.CertificateFactory;import java.security.PublicKey;import java.security.Signature;public class CertificateExample {public static void main(String[] args) throws IOException {// 从文件中读取证书CertificateFactory certificateFactory = CertificateFactory.getInstance("X509");FileInputStream fis = newFileInputStream("certificate.crt");Certificate certificate =certificateFactory.generateCertificate(fis);// 验证证书签名PublicKey publicKey = certificate.getPublicKey();Signature signature =Signature.getInstance("SHA256WithRSA");signature.initVerify(publicKey);signature.verify(certificate.getSignedContent());System.out.println("Certificate signature is valid.");}}```4.总结Java 证书工具类提供了用于处理 Java 证书的类和方法。
Java 生成数字证书系列
8)
指纹及指纹算法(Thumbprint、Thumbprint algorithm)
指纹以及指纹算法, 在证书发布的时候, 发布机构会根据指纹算法先计算出整个证书的 hash 值,并使用证书发布机构的私钥对其进行签名构成一个指纹,并将指纹与该证书放在 一起。
在生成证书的时候,需要自己设定颁发者、有效期、使用者等等。版本、签名算法、以 及证书公钥等都是要设定的,否则生成的证书是无法正常使用的。
5. 工作原理
数字证书采用公钥体制,即利用一对互相匹配的密钥进行加密、解密。每个用户自己设 定一把特定的仅为本人所知的私有密钥(私钥) ,用它进行解密和签名;同时设定一把公共 密钥(公钥)并由本人公开,为一组用户所共享,用于加密和验证签名。 当发送一份保密文件时, 发送方使用接收方的公钥对数据加密, 而接收方则使用自己的 私钥解密, 这样信息就可以安全无误地到达目的地了。 通过数字的手段保证加密过程是一个 不可逆过程,即只有用私有密钥才能解密。 在公开密钥密码体制中,常用的一种是 RSA 体制。其数学原理是将一个大数分解成两 个质数的乘积,加密和解密用的是两个不同的密钥。即使已知明文、密文和加密密钥(公开 密钥) ,想要推导出解密密钥(私密密钥) ,在计算上是不可能的。
证书所有人的名称,命名规则一般采用 X.500 格式; 证书所有人的公开密钥; 证书发行者对证书的签名。
作为文件形式存在的证书一般有这几种格式:
带有私钥的证书由 Public Key Cryptography Standards #12,PKCS#12 标准定义, 包含了公钥和私钥的二进制格式的证书形式,以 pfx 作为证书文件后缀名。 二进制编码的证书中没有私钥,DER 编码二进制格式的证书文件,以 cer 作为证书文 件后缀名。 Base64 编码的证书证书中没有私钥,BASE64 编码格式的证书文件,也是以 cer 作 为证书文件后缀名。 由此可看出,只有 pfx 格式的数字证书是包含有私钥的,cer 格式的数字证书里面只有 公钥没有私钥。当然,我们经常使用的数字证书就是 cer 格式的,比如,12306 颁发的数 字证书,就是这种格式的,购票之前,需要在自己的电脑上安装证书,以确保我们的客户端 可以与正确的服务器进行通信。 当然,正如上面所说,CA 证书还是可以自己生成的,只不过自己生成的证书对于操作 系统来说,是识别不了的,因为操作系统中并没有存在生成证书的发行机构。不过,这并不 妨碍我们正常的使用证书。
java生成Https证书,及证书导入的步骤和过程
java⽣成Https证书,及证书导⼊的步骤和过程以下是相关的Tomcat,JDK和Windows环境:Tomcat版本:tomcat-7.0.55JDK版本: jdk1.6.0⽬录所在的位置:Serve的⽬录:D:\server\tomcat-7.0.55\JDK的⽬录:D:\jdk\jdk1.6.01、⽣成服务器的密匙⽂件casserver.keystore1)打开CMD切换到Serve的⽬录下⾯D:\Server\tomcat\下2)执⾏:keytool -genkey -alias casserver -keypass cas123 -keyalg RSA -keystore casserver.keystore -validity 365说明:-alias指定别名为casserver;-keyalg指定RSA算法;-keypass指定私钥密码;-keystore指定密钥⽂件名称为casserver.keystore;-validity指定有效期为365天。
另外提⽰输⼊密匙库⼝令应与-keypass指定的cas123相同;您的名字与姓⽒是CAS服务器使⽤的域名(不能是IP,也不能是localhost),其它项随意填。
注意:服务器上如果有多个JDK,请确认环境变量中的JDK路径为tomcat所使⽤的JDK,如果不在环境变量中,也可切换到指定JDK的bin⽬录下执⾏命令;提⽰的输⼊keystore密码应与-keypass必须与指定的相同,否则后⾯tomcat启动会报IO异常(Cannot recover key)。
命令执⾏成功后Server⽬录下多出casserver.keystore⽂件。
3)可以看到Tomcat 下⾯⽣成casserver.keystore2.⽣成服务端证书casserver.cer1)根据上⾯导出的casserver.keystore⽂件就可以⽣成casserver.cer⽂件,只需在原来的Serve的⽬录下⾯D:\Server\tomcat\下执⾏:keytool -export -alias casserver -storepass cas123 -file casserver.cer -keystore casserver.keystore说明:-alias指定别名为casserver;-storepass指定私钥为liuqizhi;-file指定导出证书的⽂件名为casserver.cer;-keystore指定之前⽣成的密钥⽂件的⽂件名。
跟我学Java安全技术及应用——如何创建数字证书文件
跟我学Java安全技术及应用——如何创建数字证书文件1.1跟我学Java安全技术及应用——如何创建数字证书文件1.1.1根据证书库文件导出生成安全证书文件1、安全证书文件的格式目前数字证书的格式普遍采用的是X.509V3国际标准【是由国际电联电信委员会(ITU-T)为单点登录(SSO-Single Sign-on)和授权管理基础设施(PMI-Privilege Management Infrastructure)制定的PKI标准。
】,作为文件形式存在的证书一般有如下的这几种格式。
其中只有pfx格式的数字证书是包含有私钥的,而cer格式的数字证书里面只有公钥(可以对外公开的,不用加密)没有私钥。
因此,只有pfx格式的数字证书是包含有私钥的,cer格式的数字证书里面只有公钥没有私钥。
(1)带有私钥的证书由Public Key Cryptography Standards #12(PKCS#12)标准定义,包含了公钥和私钥的二进制格式的证书形式,并以pfx作为证书文件后缀名。
(2)二进制编码的证书证书中没有私钥,DER 编码二进制格式的证书文件,以cer作为证书文件后缀名。
(3)Base64编码的证书文件中没有私钥,BASE64 编码格式的证书文件,也是以cer作为证书文件后缀名。
2、JDK中的keytool命令程序Keytool为Java 系统库JDK中的一个命令程序,Keytool 是用于管理密钥和证书的工具,使用户和管理员能管理自己的公/私钥对以及相关的证书。
3、导出生成安全证书文件的命令和创建过程(1)在操作系统的命令行窗口中输入如下的命令keytool -export -alias yangSB -file F:/server.cer -keystore f:/server.keystore -validity 365将出现如下的示图:上面的命令的主要功能将实现把位于目录文件中的数字证书库f:/server.keystore中的别名为“yangSB”的证书导出到F:/server.cer 的数字证书文件中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8)
指纹及指纹算法(Thumbprint、Thumbprint algorithm)
指纹以及指纹算法, 在证书发布的时候, 发布机构会根据指纹算法先计算出整个证书的 hash 值,并使用证书发布机构的私钥对其进行签名构成一个指纹,并将时候,需要自己设定颁发者、有效期、使用者等等。版本、签名算法、以 及证书公钥等都是要设定的,否则生成的证书是无法正常使用的。
(三) 生成数字证书
前两篇把基本的概念和构成都大致的说了一下,今天这篇文章,主要是讲一下,如何使 用 Java 代码生成 CA 证书,以及在生成证书的时候,需要设置的一些属性。 这里使用的是 Java 的 api,以及第三方的一个组件—— BC, (Bouncy Castle) 。稍 微介绍一下 BC,Bouncy Castle 是一种用于 Java 平台的开放源码的轻量级密码术包。它 支持大量的密码术算法,并提供 JCE 1.2.1 的实现。而我们将要使用的就是非常常用的非 对称算法 RSA 加密算法。 下面我们来看一下具体的代码。 CAConfig(配置接口)
按现在的计算机技术水平,要破解目前采用的 1024 位 RSA 密钥,需要上千年的计算 时间。公开密钥技术解决了密钥发布的管理问题,商户可以公开其公开密钥,而保留其私有 密钥。购物者可以用人人皆知的公开密钥对发送的信息进行加密,安全地传送给商户,然后 由商户用自己的私有密钥进行解密。
6. 数字签名
5. 工作原理
数字证书采用公钥体制,即利用一对互相匹配的密钥进行加密、解密。每个用户自己设 定一把特定的仅为本人所知的私有密钥(私钥) ,用它进行解密和签名;同时设定一把公共 密钥(公钥)并由本人公开,为一组用户所共享,用于加密和验证签名。 当发送一份保密文件时, 发送方使用接收方的公钥对数据加密, 而接收方则使用自己的 私钥解密, 这样信息就可以安全无误地到达目的地了。 通过数字的手段保证加密过程是一个 不可逆过程,即只有用私有密钥才能解密。 在公开密钥密码体制中,常用的一种是 RSA 体制。其数学原理是将一个大数分解成两 个质数的乘积,加密和解密用的是两个不同的密钥。即使已知明文、密文和加密密钥(公开 密钥) ,想要推导出解密密钥(私密密钥) ,在计算上是不可能的。
(一) 了解数字证书
最近的工作一直围绕着数字证书,对于 CA 证书的了解还是多少有一点的,只不过没 有那么深入,现在要用到这方面的东西,显然还是有点欠缺,那么从这篇开始,我就将我自 己的学习、工作历程跟大家一同分享,希望对想了解 CA 证书的童鞋有所帮助吧。 很显然,这篇文章大部分都是理论介绍,后续会有相关的一些实例。不喜欢看理论的童 鞋,可以直接略过此章,直接看后续的文章。
4. 颁发
数字证书颁发过程一般为: 用户首先产生自己的密钥对, 并将公共密钥及部分个人身份 信息传送给认证中心。认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由 用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和 他的公钥信息,同时还附有认证中心的签名信息。 用户就可以使用自己的数字证书进行相关的各种活动。 数字证书由独立的证书发行机构 发布。数字证书各不相同,每种证书可提供不同级别的可信度。可以从证书发行机构获得您 自己的数字证书。
用户也可以采用自己的私钥对信息加以处理, 由于密钥仅为本人所有, 这样就产生了别 人无法生成的文件,也就形成了数字签名。采用数字签名,能够确认以下两点:
保证信息是由签名者自己签名发送的,签名者不能否认或难以否认。 保证信息自签发后到收到为止未曾作过任何修改,签发的文件是真实文件。
将报文按双方约定的 HASH 算法计算得到一个固定位数的报文摘要。在数学上保证: 只要改动报文中任何一位, 重新计算出的报文摘要值就会与原先的值不相符。 这样就保证了 报文的不可更改性。 将该报文摘要值用发送者的私人密钥加密 (对明文进行解密完全没问题, 会得出一个不 可读的“明文” ) ,然后连同原报文一起发送给接收者,而“加密”后的报文即称数字签名。 接收方收到数字签名后,用同样的 HASH 算法对原报文计算出报文摘要值,然后与用 发送者的公开密钥对数字签名进行解密(原先已经把签名加密了,现在再解密就能还原)得 到的报文摘要值相比较。如相等则说明报文确实来自所称的发送者。 由于只有拥有私钥的签名者能通过 “解密” 摘要生成签名, 因此具有安全和不可抵赖性。 那为什么是对报文摘要进行加密,而不是对原报文进行加密呢?这是因为 RSA 加解密 非常耗时,被加密的报文越大,耗得时间越多,因此聪明的人类对其摘要进行加密, (因为 报文摘要是要比原报文小得多) ,仍然能够起到同样的作用。这是为什么多了个报文摘要。
2. 详细信息
1) 版本(Version)
很明显,这个是证书的版本号,不同版本的证书格式是不同的。这里,我用的是 V3 版 本。 2) 序列号(Serial Number)
证书序列号,同一身份验证机构签发的证书序列号是唯一的。 3) 签名算法(Signature algorithm)
签名算法, 指的是这个数字证书中的数字签名所使用的加密算法, 可以通过根证书中的 公钥对这个证书中的指纹进行解密。 4) 颁发者(Issuer)
7. 证书格式
目前数字证书的格式普遍采用的是 X.509V3 国际标准, 一个标准的 X.509 数字证书包 含以下一些内容:
证书的版本信息; 证书的序列号,每个证书都有一个唯一的证书序列号; 证书所使用的签名算法; 证书的发行机构名称,命名规则一般采用 X.500 格式; 证书的有效期,现在通用的证书一般采用 UTC 时间格式,它的计时范围为 1950-2049;
(二) 剖析数字证书
上一篇介绍了一下 CA 证书的几个相关概念,这几个概念还是很重要的,目的在于了 解数字证书,以及其的工作原理。这篇文章主要是对 CA 证书进行剖析,讲一下证书的基 本构成,这对于生成正确的、可以访问的证书是必不可少的。
1. 构成
先看一下证书到底是什么,在 Windows 下查看证书时(这里以 cer 为例) ,界面是这 样的。
3. 原理
数字证书里存有很多数字和英文,当使用数字证书进行身份认证时,它将随机生成 128 位的身份码, 每份数字证书都能生成相应但每次都不可能相同的数码, 从而保证数据传输的
保密性,即相当于生成一个复杂的密码。 数字证书绑定了公钥及其持有者的真实身份, 它类似于现实生活中的居民身份证, 所不 同的是数字证书不再是纸质的证照, 而是一段含有证书持有者身份信息并经过认证中心审核 签发的电子数据,可以更加方便灵活地运用在电子商务和电子政务中。
@SuppressWarnings("all") public class BaseCert { static { Security.addProvider(new BouncyCastleProvider());
} protected static KeyPairGenerator kpg = null; public BaseCert() { try { // 采用 RSA 非对称算法加密 kpg = KeyPairGenerator.getInstance("RSA"); // 初始化为 1023 位 kpg.initialize(1024); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } /** * 生成 X509 证书 * @param user * @return */ public X509Certificate generateCert(String user) { X509Certificate cert = null; try { KeyPair keyPair = this.kpg.generateKeyPair(); // 公钥 PublicKey pubKey = keyPair.getPublic(); // 私钥 PrivateKey priKey = keyPair.getPrivate(); X509V3CertificateGenerator certGen = new X509V3CertificateGenerator( ); // 设置序列号 certGen.setSerialNumber(CertUtil.getNextSerialNumber()); // 设置颁发者 certGen.setIssuerDN(new X500Principal(CAConfig.CA_ROOT_ISSUER)); // 设置有效期 certGen.setNotBefore(DateUtil.getCurrDate()); certGen.setNotAfter(DateUtil.getNextYear()); // 设置使用者 certGen.setSubjectDN(new X500Principal(CAConfig.CA_DEFAULT_SUBJECT + user)); // 公钥 certGen.setPublicKey(pubKey); // 签名算法 certGen.setSignatureAlgorithm(CAConfig.CA_SHA);
证书发布机构,指出这个证书是哪个公司创建的,这是哪个 CA 中心的证书。当然, 如果是你自己公司生成的证书,那么颁发者就是你自己的公司了。 5) 有效期(Valid from to)
证书的生成日期,以及证书使用的截至日期。证书有效期失效之后,在认证服务器中会 进行校验, 校验失败后, 重新生成新证书或者是其他的操作。 这个依据证书的发布机构而定。 6) 使用者(Subject)
public interface CAConfig { String CA_C = "CN"; String CA_ST = "BJ"; String CA_L = "BJ"; String CA_O = "SICCA"; String CA_ROOT_ISSUER="C=CN,ST=BJ,L=BJ,O=SICCA,OU=SC,CN=SICCA"; String CA_DEFAULT_SUBJECT="C=CN,ST=BJ,L=BJ,O=SICCA,OU=SC,CN="; String CA_SHA="SHA256WithRSAEncryption"; }