完整word版,Java 生成数字证书系列
java如何生成word文档_使用Java生成word文档(附源码)
java如何生成word文档_使用Java生成word文档(附源码)当我们使用Java生成word文档时,通常首先会想到iText和POI,这是因为我们习惯了使用这两种方法操作Excel,自然而然的也想使用这种生成word文档。
但是当我们需要动态生成word时,通常不仅要能够显示word中的内容,还要能够很好的保持word中的复杂样式。
这时如果再使用IText和POI去操作,就好比程序员去搬砖一样痛苦。
这时候,我们应该考虑使用FreeMarker的模板技术快速实现这个复杂的功能,让程序员在喝咖啡的过程中就把问题解决。
实现思路是这样的:先创建一个word文档,按照需求在word中填好一个模板,然后把对应的数据换成变量${},然后将文档保存为xml文档格式,使用文档编辑器打开这个xml格式的文档,去掉多余的xml符号,使用Freemarker读取这个文档然后替换掉变量,输出word文档即可。
具体过程如下:1.创建带有格式的word文档,将该需要动态展示的数据使用变量符替换。
2.将刚刚创建的word文档另存为xml格式。
3.编辑这个XMl文档去掉多余的xml标记,如图中蓝色部分4.从官网最新的开发包,将freemarker.jar拷贝到自己的开发项目中。
5.新建DocUtil类,实现根据Doc模板生成word文件的方法package com.favccxx.secret.util;import java.io.BufferedWriter;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStreamWriter;import java.io.Writer;import java.util.Map;import freemarker.template.Configuration;import freemarker.template.DefaultObjectWrapper;import freemarker.template.Template;import freemarker.template.TemplateExceptionHandler;public class DocUtil {privateConfiguration configure = null;publicDocUtil(){configure= new Configuration();configure.setDefaultEncoding("utf-8");}/*** 根据Doc模板生成word文件* @param dataMap Map 需要填入模板的数据* @param fileName 文件名称* @param savePath 保存路径*/publicvoid createDoc(Map dataMap, String downloadType, StringsavePath){try{//加载需要装填的模板Templatetemplate = null;//加载模板文件configure.setClassForTemplateLoading(this.getClass(),"/com /favccxx/secret/templates");//设置对象包装器configure.setObjectWrapper(newDefaultObjectWrapper());//设置异常处理器configure.setT emplateExceptionHandler(TemplateException Handler.IGNORE_HANDLER);//定义Template对象,注意模板类型名字与downloadType要一致template= configure.getTemplate(downloadType + ".xml");//输出文档FileoutFile = new File(savePath);Writerout = null;out= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"utf-8"));template.process(dataMap,out);outFile.delete();}catch (Exception e) {e.printStackTrace();}}}6.用户根据自己的需要,调用使用getDataMap获取需要传递的变量,然后调用createDoc方法生成所需要的文档。
Java完美生成word的解决方案
POI读word文档还行,写文档实在不敢恭维,复杂的样式很难控制不提,想象一下一个20多页,嵌套很多表格和图像的word文档靠POI来写代码输出,对程序员来说比去山西挖煤还惨,况且文档格式还经常变化。
iText操作Excel还行。
对于复杂的大量的word也是噩梦。
直接通过JSP输出样式基本不达标,而且要打印出来就更是惨不忍睹。
Word从2003开始支持XML格式,用XML还做就很简单了。
大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。
经测试这样方式生成的word 文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office 中编辑文档完全一样。
看看实际效果:首先用office【版本要2003以上,以下的不支持xml格式】编辑文档的样式,图中红线的部分就是我要输出的部分:将编辑好的文档另存为XML再用Firstobject free XML editor【Firstobject free XML editor的使用见这里】将xml中我们需要填数据的地方打上FreeMarker标记【FreeMarker的语法见这里】最后生成的文档样式主要程序代码:view sourceprint?01 package com.havenliu.document;0203 import java.io.BufferedWriter;04 import java.io.File;05 import java.io.FileNotFoundException;06 import java.io.FileOutputStream;07 import java.io.IOException;08 import java.io.OutputStreamWriter;09 import java.io.Writer;10 import java.util.ArrayList;11 import java.util.HashMap;12 import java.util.List;13 import java.util.Map;1415 import freemarker.template.Configuration;16 import freemarker.template.Template;17 import freemarker.template.TemplateException;1819 public class DocumentHandler {20 private Configuration configuration = null;2122 public DocumentHandler() {23 configuration = new Configuration();24 configuration.setDefaultEncoding("utf-8");25 }2627 public void createDoc() {28 //要填入模本的数据文件29 Map dataMap=new HashMap();30 getData(dataMap);31 //设置模本装置方法和路径,FreeMarker支持多种模板装载方法。
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-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 需导入的证书下面是各选项的缺省值。
跟我学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的数字证书文件中。
如何利用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对于数字证书的常用操作方法
System.out.println("签发者:"+t.getIssuerDN());
System.out.println("有效期:"+t.getNotBefore());
System.out.println("签名算法:"+t.getSigAlgName());
byt/签名值
cinfo2.set(X509CertInfo.SERIAL_NUMBER,csn);
(8)设置新证书签发者
cinfo2.set(X509CertInfo.ISSUER+"."+CertificateIssuerName.DN_NAME,issuer);应用第三步的结果
(9)设置新证书签名算法信息
ks.store(output,storepass.toCharArray())将keystore对象内容写入新文件
八:JAVA程序检验别名和删除条目
FileInputStream in=new FileInputStream(".keystore");
KeyStore ks=KeyStore.getInstance("JKS");
PublicKey pk=t.getPublicKey();
byte [] pkenc=pk.getEncoded();
System.out.println("公钥");
for(int i=0;i
五:JAVA程序列出密钥库所有条目
String pass="123456";
CertificateFactory cf=CertificateFactory.getInstance("X.509");
java生成word的几种方案
java⽣成word的⼏种⽅案1、 Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建⼀座桥梁。
使⽤Jacob⾃带的DLL动态链接库,并通过JNI的⽅式实现了在Java平台上对COM程序的调⽤。
DLL动态链接库的⽣成需要windows平台的⽀持。
2、 Apache POI包括⼀系列的API,它们可以操作基于MicroSoft OLE 2 Compound Document Format的各种格式⽂件,可以通过这些API在Java中读写Excel、Word等⽂件。
他的excel处理很强⼤,对于word还局限于读取,⽬前只能实现⼀些简单⽂件的操作,不能设置样式。
3、 Java2word是⼀个在java程序中调⽤ MS Office Word ⽂档的组件(类库)。
该组件提供了⼀组简单的接⼝,以便java程序调⽤他的服务操作Word ⽂档。
这些服务包括:打开⽂档、新建⽂档、查找⽂字、替换⽂字,插⼊⽂字、插⼊图⽚、插⼊表格,在书签处插⼊⽂字、插⼊图⽚、插⼊表格等。
填充数据到表格中读取表格数据,1.1版增强的功能:指定⽂本样式,指定表格样式。
如此,则可动态排版word⽂档。
4、 iText操作Excel还⾏。
对于复杂的⼤量的word也是噩梦。
⽤法很简单, 但是功能很少, 不能设置打印⽅向等问题。
5、 JSP输出样式基本不达标,⽽且要打印出来就更是惨不忍睹。
6、⽤XML做就很简单了。
Word从2003开始⽀持XML格式,⼤致的思路是先⽤office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后⽤java来解析FreeMarker模板并输出Doc。
经测试这样⽅式⽣成的word⽂档完全符合office标准,样式、内容控制⾮常便利,打印也不会变形,⽣成的⽂档和office中编辑⽂档完全⼀样。
7、补充⼀种⽅案,可以⽤类似ueditor的在线编辑器编辑word⽂档,在将html⽂件转换为xhtml⽂件,再转换为word。
java获取证书类型
Java获取证书类型概述在Java编程中,可以使用不同的方法获取证书类型。
证书是一种用于身份验证和数据加密的安全工具,常用于SSL/TLS通信、代码签名和身份认证等领域。
Java提供了一组API用于处理和管理证书,通过这些API可以获取证书的类型,以便后续的操作和处理。
本文将介绍如何使用Java获取证书类型的方法。
首先,我们将介绍Java中与证书相关的基本概念和术语,然后详细说明如何使用Java的API来获取证书类型。
最后,我们还会给出一些使用示例,帮助读者更好地理解和应用这些方法。
证书的基本概念和术语在开始介绍如何获取证书类型之前,我们先来了解一些与证书相关的基本概念和术语。
1.证书(Certificate):证书是由证书颁发机构(CA)签发的一种数据文件,用于证明某个实体的身份。
证书包含了实体的公钥、所有者信息以及数字签名等内容,可以用于验证实体的身份和确保通信的安全性。
2.证书链(Certificate Chain):证书链是由多个证书构成的链条,用于验证证书的合法性。
通常,证书链中的最后一个证书是根证书(RootCertificate),它的公钥用于验证证书链中的其他证书的签名。
3.证书存储(KeyStore):证书存储是一种用于管理和存储证书的容器。
在Java中,可以使用KeyStore类来加载、保存和管理证书。
4.数字证书(Digital Certificate):数字证书是一种使用公钥密码学方法生成的证书,用于验证实体的身份和确保通信的安全性。
数字证书通常包含了实体的公钥、所有者信息以及数字签名等内容。
5.X.509证书(X.509 Certificate):X.509证书是一种国际标准化的数字证书格式,用于存储和交换公钥和其他相关信息。
在Java中,大部分证书都是基于X.509标准的。
6.证书类型(Certificate Type):证书类型是指证书的具体种类和用途。
常见的证书类型包括X.509证书、SSL证书、代码签名证书等。
javadoc文档生成方式
Javadoc文档生成方式1. 什么是Javadoc文档Javadoc文档是一种用于描述Java代码的文档标记语言。
它能够从代码中提取注释并生成可读性强的HTML格式文档,以帮助开发人员更好地理解和使用代码。
Javadoc文档通常包含类、方法、字段等的详细描述,包括功能、参数、返回值、异常等信息。
2. Javadoc文档的重要性Javadoc文档是Java开发中必不可少的一部分,具有以下几个重要作用:•提供代码的使用说明:Javadoc文档能够清晰地描述代码的功能和使用方法,方便其他开发人员快速了解和使用代码。
•促进团队协作:Javadoc文档可以作为团队协作的重要工具,通过统一的文档格式和规范,促进团队成员之间的沟通和协作。
•提高代码的可读性:Javadoc文档能够将代码的关键信息提取出来,并以易于阅读的方式展示出来,提高代码的可读性和可维护性。
•方便代码维护和重构:Javadoc文档中包含了代码的详细描述和设计意图,能够帮助开发人员更好地理解代码,从而方便代码的维护和重构。
3. Javadoc文档生成方式3.1 使用命令行工具生成Javadoc文档可以通过命令行工具生成,具体步骤如下:1.打开命令行终端,进入代码所在的目录。
2.使用以下命令生成Javadoc文档:javadoc -d <output-directory> <source-files>–-d指定生成的文档输出目录。
–<output-directory>为生成的文档输出目录的路径。
–<source-files>为需要生成文档的源代码文件或目录。
3.等待命令执行完成,生成的Javadoc文档将保存在指定的输出目录中。
3.2 使用集成开发环境(IDE)生成大多数集成开发环境(IDE)都提供了生成Javadoc文档的功能,具体步骤如下(以Eclipse为例):1.打开Eclipse,进入项目。
JAVA生成word文档代码加说明
import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.Iterator;import java.util.Map;import javax.servlet.http.HttpServletResponse;import org.apache.poi.hwpf.HWPFDocument;import org.apache.poi.hwpf.model.FieldsDocumentPart;import ermodel.Field;import ermodel.Fields;import ermodel.Range;import ermodel.Table;import ermodel.TableIterator;import ermodel.TableRow;publicclass WordUtil {publicstaticvoid readwriteWord(String filePath, String downPath, Map<String, String> map, int[] num, String downFileName) { //读取word模板FileInputStream in = null;try {in = new FileInputStream(new File(filePath));} catch (FileNotFoundException e1) {e1.printStackTrace();}HWPFDocument hdt = null;try {hdt = new HWPFDocument(in);} catch (IOException e1) {e1.printStackTrace();}Fields fields = hdt.getFields();Iterator<Field> it = fields.getFields(FieldsDocumentPart.MAIN) .iterator();while (it.hasNext()) {System.out.println(it.next().getType());}//读取word表格内容try {Range range = hdt.getRange();//得到文档的读取范围TableIterator it2 = new TableIterator(range);//迭代文档中的表格int tabCount = 0;while (it2.hasNext()) {//System.out.println(" 第几个表格 "+tabCount);//System.out.println(num[tabCount] +" 行");Table tb2 = (Table) it2.next();//迭代行,默认从0开始for (int i = 0; i < tb2.numRows(); i++) {TableRow tr = tb2.getRow(i);// System.out.println(" fu "+num[tabCount] +" 行");if (num[tabCount] < i && i < 7) {tr.delete();}} //end fortabCount++;} //end while//替换word表格内容for (Map.Entry<String, String> entry : map.entrySet()) { range.replaceText("$"+ entry.getKey().trim() + "$", entry.getValue());}// System.out.println("替换后------------:"+range.text().trim());} catch (Exception e) {e.printStackTrace();}//System.out.println("--------------------------------------------------------------------------------------");ByteArrayOutputStream ostream = new ByteArrayOutputStream();String fileName = downFileName;fileName += ".doc";String pathAndName = downPath + fileName;File file = new File(pathAndName);if (file.canRead()) {file.delete();}FileOutputStream out = null;out = new FileOutputStream(pathAndName, true);} catch (FileNotFoundException e) {e.printStackTrace();}try {hdt.write(ostream);} catch (IOException e) {e.printStackTrace();}//输出字节流try {out.write(ostream.toByteArray());} catch (IOException e) {e.printStackTrace();}try {out.close();} catch (IOException e) {e.printStackTrace();}try {ostream.close();} catch (IOException e) {e.printStackTrace();}}/***实现对word读取和修改操作(输出文件流下载方式)*@param response响应,设置生成的文件类型,文件头编码方式和文件名,以及输出*@param filePathword模板路径和名称*@param map待填充的数据,从数据库读取*/publicstaticvoid readwriteWord(HttpServletResponse response, String filePath, Map<String, String> map) {//读取word模板文件//String fileDir = newFile(base.getFile(),"//.. /doc/").getCanonicalPath();//FileInputStream in = new FileInputStream(newFile(fileDir+"/laokboke.doc"));FileInputStream in;HWPFDocument hdt = null;in = new FileInputStream(new File(filePath));hdt = new HWPFDocument(in);} catch (Exception e1) {e1.printStackTrace();}Fields fields = hdt.getFields();Iterator<Field> it = fields.getFields(FieldsDocumentPart.MAIN) .iterator();while (it.hasNext()) {System.out.println(it.next().getType());}//替换读取到的word模板内容的指定字段Range range = hdt.getRange();for (Map.Entry<String, String> entry : map.entrySet()) { range.replaceText("$" + entry.getKey() + "$",entry.getValue());}//输出word内容文件流,提供下载response.reset();response.setContentType("application/x-msdownload");String fileName = "" + System.currentTimeMillis() + ".doc";response.addHeader("Content-Disposition", "attachment;filename="+ fileName);ByteArrayOutputStream ostream = new ByteArrayOutputStream();OutputStream servletOS = null;try {servletOS = response.getOutputStream();hdt.write(ostream);servletOS.write(ostream.toByteArray());servletOS.flush();servletOS.close();} catch (Exception e) {e.printStackTrace();}}}注:以上代码需要poi包, 可以下载。
Javafreemarker生成word模板文件(如合同文件)及转pdf文件方法
Javafreemarker⽣成word模板⽂件(如合同⽂件)及转pdf⽂件⽅法Java freemarker⽣成word模板⽂件(如合同⽂件)及转pdf⽂件⽅法创建模板⽂件ContractTemplate.docxContractTemplate.xml导⼊的Jar包compile("junit:junit")compile("org.springframework:spring-test")compile("org.springframework.boot:spring-boot-test")testCompile 'org.springframework.boot:spring-boot-starter-test'compile 'org.freemarker:freemarker:2.3.28'compile 'fakepath:aspose-words:19.5jdk'compile 'fakepath:aspose-cells:8.5.2'Java⼯具类 xml⽂档转换 Word XmlToDocx.javapackage com.test.docxml.utils;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.util.Enumeration;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;import java.util.zip.ZipOutputStream;/*** xml⽂档转换 Word*/public class XmlToDocx {/**** @param documentFile 动态⽣成数据的docunment.xml⽂件* @param docxTemplate docx的模板* @param toFilePath 需要导出的⽂件路径* @throws Exception*/public static void outDocx(File documentFile, String docxTemplate, String toFilePath,String key) throws Exception { try {File docxFile = new File(docxTemplate);ZipFile zipFile = new ZipFile(docxFile);Enumeration<? extends ZipEntry> zipEntrys = zipFile.entries();FileOutputStream fileOutputStream = new FileOutputStream(toFilePath);ZipOutputStream zipout = new ZipOutputStream(fileOutputStream);int len = -1;byte[] buffer = new byte[1024];while (zipEntrys.hasMoreElements()) {ZipEntry next = zipEntrys.nextElement();InputStream is = zipFile.getInputStream(next);// 把输⼊流的⽂件传到输出流中如果是word/document.xml由我们输⼊zipout.putNextEntry(new ZipEntry(next.toString()));if ("word/document.xml".equals(next.toString())) {InputStream in = new FileInputStream(documentFile);while ((len = in.read(buffer)) != -1) {zipout.write(buffer, 0, len);}in.close();} else {while ((len = is.read(buffer)) != -1) {zipout.write(buffer, 0, len);}is.close();}}zipout.close();} catch (Exception e) {e.printStackTrace();}}}Java⼯具类 word⽂档转换 PDF WordToPdf.javapackage com.test.docxml.utils;import com.aspose.cells.*;import com.aspose.cells.License;import com.aspose.words.*;import java.io.ByteArrayInputStream;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;/*** word⽂档转换 PDF*/public class WordToPdf {/*** 获取license许可凭证* @return*/private static boolean getLicense() {boolean result = false;try {String licenseStr = "<License>\n"+ " <Data>\n"+ " <Products>\n"+ " <Product>Aspose.Total for Java</Product>\n"+ " <Product>Aspose.Words for Java</Product>\n"+ " </Products>\n"+ " <EditionType>Enterprise</EditionType>\n"+ " <SubscriptionExpiry>20991231</SubscriptionExpiry>\n"+ " <LicenseExpiry>20991231</LicenseExpiry>\n"+ " <SerialNumber>23dcc79f-44ec-4a23-be3a-03c1632404e9</SerialNumber>\n"+ " </Data>\n"+ " <Signature>0nRuwNEddXwLfXB7pw66G71MS93gW8mNzJ7vuh3Sf4VAEOBfpxtHLCotymv1PoeukxYe31K441Ivq0Pkvx1yZZG4O1KCv3Omdbs7uqzUB4xXHlOub4VsTODzDJ5MWHqlRCB1HHcGjlyT2sVGiovLt0Grvqw5+QXBuin + "</License>";InputStream license = new ByteArrayInputStream(licenseStr.getBytes("UTF-8"));License asposeLic = new License();asposeLic.setLicense(license);result = true;} catch (Exception e) {e.printStackTrace();}return result;}/*** word⽂档转换为 PDF* @param inPath 源⽂件* @param outPath ⽬标⽂件*/public static File doc2pdf(String inPath, String outPath) {//验证License,获取许可凭证if (!getLicense()) {return null;}//新建⼀个PDF⽂档File file = new File(outPath);try {//新建⼀个IO输出流FileOutputStream os = new FileOutputStream(file);//获取将要被转化的word⽂档Document doc = new Document(inPath);// 全⾯⽀持DOC, DOCX,OOXML, RTF HTML,OpenDocument,PDF, EPUB, XPS,SWF 相互转换doc.save(os, com.aspose.words.SaveFormat.PDF);os.close();} catch (Exception e) {e.printStackTrace();}return file;}public static void main(String[] args) {doc2pdf("D:/1.doc", "D:/1.pdf");}}Java单元测试类 XmlDocTest.javapackage com.test.docxml;import com.test.docxml.utils.WordToPdf;import com.test.docxml.utils.XmlToDocx;import freemarker.template.Configuration;import freemarker.template.Template;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.core.io.ClassPathResource;import org.springframework.core.io.Resource;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import org.springframework.test.context.web.WebAppConfiguration;import java.io.File;import java.io.PrintWriter;import java.io.Writer;import java.nio.charset.Charset;import java.util.HashMap;import java.util.Locale;import java.util.Map;/*** 本地单元测试*/@RunWith(SpringJUnit4ClassRunner.class)//@RunWith(SpringRunner.class)@SpringBootTest(classes= TemplateApplication.class)@WebAppConfigurationpublic class XmlDocTest {//短租@Testpublic void testContract() throws Exception{String contractNo = "1255445544";String contractCorp = "银河宇宙⽆敌测试soft";String contractDate = "2022-01-27";String contractItem = "房地产交易中⼼";String contractContent = "稳定发展中的⽂案1万字";//doc xml模板⽂件String docXml = "ContractTemplate.xml"; //使⽤替换内容//xml中间临时⽂件String xmlTemp = "tmp-ContractTemplate.xml";//⽣成⽂件的doc⽂件String toFilePath = contractNo + ".docx";//模板⽂档String docx = "ContractTemplate.docx";//⽣成pdf⽂件String toPdfFilePath = contractNo + ".pdf";;String CONTRACT_ROOT_URL = "/template";Resource contractNormalPath = new ClassPathResource(CONTRACT_ROOT_URL + File.separator + docXml);String docTemplate = contractNormalPath.getURI().getPath().replace(docXml, docx);//设置⽂件编码(注意点1)Writer writer = new PrintWriter(new File(xmlTemp),"UTF-8");Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);configuration.setEncoding(Locale.CHINESE, Charset.forName("UTF-8").name());//设置配置(注意点3)configuration.setDefaultEncoding("UTF-8");String filenametest = contractNormalPath.getURI().getPath().replace(docXml, "");System.out.println("filenametest=" + filenametest);configuration.setDirectoryForTemplateLoading(new File(filenametest));// Template template = configuration.getTemplate(ContractConstants.CONTRACT_NORMAL_URL+orderType+type+".xml"); //设置模板编码(注意点2)Template template = configuration.getTemplate(docXml,"UTF-8"); //绝对地址Map paramsMap = new HashMap();paramsMap.put("contractCorp",contractCorp);paramsMap.put("contractDate",contractDate);paramsMap.put("contractNo",contractNo);paramsMap.put("contractItem",contractItem);paramsMap.put("contractContent",contractContent);template.process(paramsMap, writer);XmlToDocx.outDocx(new File(xmlTemp), docTemplate, toFilePath, null);System.out.println("do finish");//转成pdfWordToPdf.doc2pdf(toFilePath,toPdfFilePath);}}创建成功之后的⽂件如下:。
JAVA生成word的解决方案
第1章编码思路关于用OpenOffice的场景更多是将word中的内容另存为(转化)html。
我的应用场景是将在线编辑器的内容保存为word格式,系细览转换为word、pdf的一种需求。
1.下载Openoffice(/index.html ),类似于windows office的一个套件,并额外支持服务的运行方式,可理解为数据库2.下载Jodconverter( /opensource/jodconverter),类似于jdbc3.按照OpenOffice,并启动服务:soffice -headless -accept="socket,port=8100;urp;"4.引入jodconverter的jar包,并编码public class OpenOfficeService {private Logger logger = Logger.getLogger(this.getClass());OpenOfficeConnection con = null;public void convert(File sourceFile, File _targetFile) {try {if (con == null) {con = new SocketOpenOfficeConnection(ip, port);}con.connect();DocumentConverter converter = new OpenOfficeDocumentConverter(con);converter.convert(sourceFile, _targetFile);} catch (ConnectException e) {logger.error("OpenOffice异常", e);try {if (con != null) {con.disconnect();con = null;}} catch (Exception e1) {logger.error(e);}}}第2章开发过程中遇到的问题html中的图片可以转化到pdf,但是在不能转化到word中,经测试可以转化到odt文件中,所以我在开发过程中实际上是由hmt转换为odt,再在下载的过程中将后缀改为doc格式,另外,html中的图片,最好与html 文件放到同一目录下,引用方式为相对目录,也可以修改图片路径为绝对路径。
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的可信任证书仓库。
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 p12证书生成流程
java p12证书生成流程Java P12证书的生成流程包括以下步骤:1. 生成私钥:使用Java的密钥库工具`keytool`生成私钥。
首先,打开命令提示符或终端,并导航到Java的安装目录。
然后,运行以下命令以生成私钥:```keytool -genkeypair -alias [alias_name] -keyalg RSA -keysize 2048 -keystore [keystore_name].jks```其中,`[alias_name]`是证书的别名,`[keystore_name]`是密钥库文件的名称。
2.生成证书签名请求(CSR):使用私钥生成证书签名请求。
运行以下命令:```keytool -certreq -alias [alias_name] -keystore[keystore_name].jks -file [csr_file].csr```其中,`[csr_file]`是用于保存证书签名请求的文件名。
3.获取证书:将CSR文件发送给证书颁发机构(CA)以获取证书。
CA 会验证您的身份,并生成数字证书。
4.导入证书:将获得的证书导入到密钥库中。
运行以下命令:```keytool -import -alias [alias_name] -file[certificate_file].cer -keystore [keystore_name].jks```其中,`[certificate_file]`是获得的证书文件名。
5.导出P12证书:将证书和私钥导出为P12格式。
运行以下命令:```keytool -importkeystore -srckeystore [keystore_name].jks -destkeystore [p12_file].p12 -srcalias [alias_name] -destalias [alias_name] -deststoretype PKCS12。
java生成word文件并下载
java生成word文件并下载importjava.io.BufferedInputStream;importjava.io.BufferedOutp utStream;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream ;importjava.io.IOE某ception;importjava.io.InputStream;importjava.io.OutputStream;importjava.io.OutputStreamWriter;importjava.io.Writer;.URLEncoder;importjava.util.Map;importfreemarker.template.Configuration;importfreemarker.tem plate.Template;/某某publicclaWordUtil{privatetaticLoggerlog=Logger.getLogger(Wor dUtil.cla);/某某//创建配置实例Configurationconfiguration=newConfiguration();//设置编码configuration.etDefaultEncoding(\//ftl模板文件Filefile=newFile(filePath);configuration.etDirectoryForTempl ateLoading(file);//获取模板Templatetemplate=configuration.getTemplate(templateName);//输出文件FileoutFile=newFile(filePath+File.eparator+fileName);//如果输出目标文件夹不存在,则创建if(!outFile.getParentFile().e某it()){outFile.getParentFile().mkdir();}//将模板和数据模型合并生成文件Writerout=newBufferedWriter(newOutputStreamWriter(newFileOutputS tream(outFile),\//生成文件template.proce(dataMap,out);//关闭流out.fluh();out.cloe();}catch(E某ceptione){log.error(\生成word文档(WordUtil)出错:【mg:\】,文件名:\+fileName);}fi.read(buffer);fi.cloe();//清空reponerepone.reet();//设置repone的HeaderStringfileName=URLEncoder.encode(filename,\if(fileName.lengt h()>150){//解决IE6.0bugfileName=newString(filename.getByte(\} repone.addHeader(\repone.addHeader(\OutputStreamtoClient=newBufferedOutputStream(repone.getOutpu tStream());repone.etContentType(\toClient.write(buffer);toClient .fluh();toClient.cloe();file.delete();returnrepone;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
@SuppressWarnings("all") public class BaseCert {
1950-2049; ▪ 证书所有人的名称,命名规则一般采用 X.500 格式; ▪ 证书所有人的公开密钥; ▪ 证书发行者对证书的签名。
作为文件形式存在的证书一般有这几种格式:
带有私钥的证书由 Public Key Cryptography Standards #12,PKCS#12 标准定义, 包含了公钥和私钥的二进制格式的证书形式,以 pfx 作为证书文件后缀名。
8) 指纹及指纹算法(Thumbprint、Thumbprint algorithm) 指纹以及指纹算法,在证书发布的时候,发布机构会根据指纹算法先计算出整个证书的 hash 值,并使用证书发布机构的私钥对其进行签名构成一个指纹,并将指纹与该证书放在 一起。
在生成证书的时候,需要自己设定颁发者、有效期、使用者等等。版本、签名算法、以 及证书公钥等都是要设定的,否则生成的证书是无法正常使用的。
2. 详细信息
1) 版本(Version) 很明显,这个是证书的版本号,不同版本的证书格式是不同的。这里,我用的是 V3 版 本。 2) 序列号(Serial Number)
证书序列号,同一身份验证机构签发的证书序列号是唯一的。 3) 签名算法(Signature algorithm) 签名算法,指的是这个数字证书中的数字签名所使用的加密算法,可以通过根证书中的 公钥对这个证书中的指纹进行解密。 4) 颁发者(Issuer) 证书发布机构,指出这个证书是哪个公司创建的,这是哪个 CA 中心的证书。当然, 如果是你自己公司生成的证书,那么颁发者就是你自己的公司了。 5) 有效期(Valid from to) 证书的生成日期,以及证书使用的截至日期。证书有效期失效之后,在认证服务器中会 进行校验,校验失败后,重新生成新证书或者是其他的操作。这个依据证书的发布机构而定。 6) 使用者(Subject) 这个证书是发布给谁的,或者说是证书的所有者,一般是某个人或者某个公司的名称、 机构的名称、公司网站的网址等。当然,如果是根证书的话,那么,使用者就是自己的公司 了。 7) 公钥(Public key) 证书的公钥,主要是用来对消息进行加密的,这个证书的公钥是 2048 位的,他的值 可以在对话框中看到,是很长的一段十六进制数。
用户就可以使用自己的数字证书进行相关的各种活动。数字证书由独立的证书发行机构 发布。数字证书各不相同,每种证书可提供不同级别的可信度。可以从证书发行机构获得您 自己的数字证书。
5. 工作原理
数字证书采用公钥体制,即利用一对互相匹配的密钥进行加密、解密。每个用户自己设 定一把特定的仅为本人所知的私有密钥(私钥),用它进行解密和签名;同时设定一把公共 密钥(公钥)并由本人公开,为一组用户所共享,用于加密和验证签名。
}
BaseCert (证书类)
import com.cacss.jsceu.context.CAConfig; import com.cacss.jsceu.util.CertUtil; import com.cacss.jsceu.util.DateUtil; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.x509.X509V3CertificateGenerator;
保密性,即相当于生成一个复杂的密码。 数字证书绑定了公钥及其持有者的真实身份,它类似于现实生活中的居民身份证,所不
同的是数字证书不再是纸质的证照,而是一段含有证书持有者身份信息并经过认证中心审核 签发的电子数据,可以更加方便灵活地运用在电子商务和电子政务中。
4. 颁发
数字证书颁发过程一般为:用户首先产生自己的密钥对,并将公共密钥及部分个人身份 信息传送给认证中心。认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由 用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和 他的公钥信息,同时还附有认证中心的签名信息。
(三) 生成数字证书
前两篇把基本的概念和构成都大致的说了一下,今天这篇文章,主要是讲一下,如何使
用 Java 代码生成 CA 证书,以及在生成证书的时候,需要设置的一些属性。
这里使用的是 Java 的 api ,以及第三方的一个组件 —— BC,(Bouncy Castle)。
稍微介绍一下 BC,Bouncy Castle 是一种用于 Java 平台的开放源码的轻量级密码术包。
1. 概要
这篇文章,我主要是想谈一下 CA 证书的工作原理,数字签名,证书格式等几个比较 重要的概念。因为须要弄懂的。
2. 什么是数字证书
数字证书就是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在 Internet 上验证通信实体身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份 证。它是由一个由权威机构 —— CA 机构,又称为证书授权(Certificate Authority) 中心发行的,人们可以在网上用它来识别对方的身份。
(一) 了解数字证书
最近的工作一直围绕着数字证书,对于 CA 证书的了解还是多少有一点的,只不过没 有那么深入,现在要用到这方面的东西,显然还是有点欠缺,那么从这篇开始,我就将我自 己的学习、工作历程跟大家一同分享,希望对想了解 CA 证书的童鞋有所帮助吧。
很显然,这篇文章大部分都是理论介绍,后续会有相关的一些实例。不喜欢看理论的童 鞋,可以直接略过此章,直接看后续的文章。
二进制编码的证书中没有私钥,DER 编码二进制格式的证书文件,以 cer 作为证书文 件后缀名。
Base64 编码的证书证书中没有私钥,BASE64 编码格式的证书文件,也是以 cer 作 为证书文件后缀名。
由此可看出,只有 pfx 格式的数字证书是包含有私钥的,cer 格式的数字证书里面只 有公钥没有私钥。当然,我们经常使用的数字证书就是 cer 格式的,比如,12306 颁发的 数字证书,就是这种格式的,购票之前,需要在自己的电脑上安装证书,以确保我们的客户 端可以与正确的服务器进行通信。
用户也可以采用自己的私钥对信息加以处理,由于密钥仅为本人所有,这样就产生了别 人无法生成的文件,也就形成了数字签名。采用数字签名,能够确认以下两点:
▪ 保证信息是由签名者自己签名发送的,签名者不能否认或难以否认。 ▪ 保证信息自签发后到收到为止未曾作过任何修改,签发的文件是真实文件。 将报文按双方约定的 HASH 算法计算得到一个固定位数的报文摘要。在数学上保证: 只要改动报文中任何一位,重新计算出的报文摘要值就会与原先的值不相符。这样就保证了 报文的不可更改性。 将该报文摘要值用发送者的私人密钥加密(对明文进行解密完全没问题,会得出一个不 可读的“明文”),然后连同原报文一起发送给接收者,而“加密”后的报文即称数字签名。 接收方收到数字签名后,用同样的 HASH 算法对原报文计算出报文摘要值,然后与用 发送者的公开密钥对数字签名进行解密(原先已经把签名加密了,现在再解密就能还原)得 到的报文摘要值相比较。如相等则说明报文确实来自所称的发送者。 由于只有拥有私钥的签名者能通过“解密”摘要生成签名,因此具有安全和不可抵赖性。 那为什么是对报文摘要进行加密,而不是对原报文进行加密呢?这是因为 RSA 加解密 非常耗时,被加密的报文越大,耗得时间越多,因此聪明的人类对其摘要进行加密,(因为 报文摘要是要比原报文小得多),仍然能够起到同样的作用。这是为什么多了个报文摘要。
数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的 文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。数字证书还有 一个重要的特征就是只在特定的时间段内有效。
3. 原理
数字证书里存有很多数字和英文,当使用数字证书进行身份认证时,它将随机生成 128 位的身份码,每份数字证书都能生成相应但每次都不可能相同的数码,从而保证数据传输的
7. 证书格式
目前数字证书的格式普遍采用的是 X.509V3 国际标准,一个标准的 X.509 数字证书包 含以下一些内容:
▪ 证书的版本信息; ▪ 证书的序列号,每个证书都有一个唯一的证书序列号; ▪ 证书所使用的签名算法; ▪ 证书的发行机构名称,命名规则一般采用 X.500 格式; ▪ 证书的有效期,现在通用的证书一般采用 UTC 时间格式,它的计时范围为
它支持大量的密码术算法,并提供 JCE 1.2.1 的实现。而我们将要使用的就是非常常用的
非对称算法 RSA 加密算法。
下面我们来看一下具体的代码。
CAConfig (配置接口)
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";
当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的 私钥解密,这样信息就可以安全无误地到达目的地了。通过数字的手段保证加密过程是一个 不可逆过程,即只有用私有密钥才能解密。