ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:1,002.81KB ,
资源ID:12245813      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12245813.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Java 生成数字证书系列.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Java 生成数字证书系列.docx

1、Java 生成数字证书系列(一) 了解数字证书最近的工作一直围绕着数字证书,对于 CA 证书的了解还是多少有一点的,只不过没有那么深入,现在要用到这方面的东西,显然还是有点欠缺,那么从这篇开始,我就将我自己的学习、工作历程跟大家一同分享,希望对想了解 CA 证书的童鞋有所帮助吧。很显然,这篇文章大部分都是理论介绍,后续会有相关的一些实例。不喜欢看理论的童鞋,可以直接略过此章,直接看后续的文章。1. 概要这篇文章,我主要是想谈一下 CA 证书的工作原理,数字签名,证书格式等几个比较重要的概念。因为在后续的文章中,都会用到这几个概念,而且,想要自己做证书,这几个概念是必须要弄懂的。2. 什么是数字

2、证书数字证书就是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在 Internet 上验证通信实体身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构 CA 机构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份。数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。数字证书还有一个重要的特征就是只在特定的时间段内有效。3. 原理数字证书里存有很多数字和英文,当使用数字证书进行身份认证时,它将随机生成128位的身份

3、码,每份数字证书都能生成相应但每次都不可能相同的数码,从而保证数据传输的保密性,即相当于生成一个复杂的密码。数字证书绑定了公钥及其持有者的真实身份,它类似于现实生活中的居民身份证,所不同的是数字证书不再是纸质的证照,而是一段含有证书持有者身份信息并经过认证中心审核签发的电子数据,可以更加方便灵活地运用在电子商务和电子政务中。4. 颁发数字证书颁发过程一般为:用户首先产生自己的密钥对,并将公共密钥及部分个人身份信息传送给认证中心。认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和他的公钥信息,同时还附有认证

4、中心的签名信息。用户就可以使用自己的数字证书进行相关的各种活动。数字证书由独立的证书发行机构发布。数字证书各不相同,每种证书可提供不同级别的可信度。可以从证书发行机构获得您自己的数字证书。5. 工作原理数字证书采用公钥体制,即利用一对互相匹配的密钥进行加密、解密。每个用户自己设定一把特定的仅为本人所知的私有密钥(私钥),用它进行解密和签名;同时设定一把公共密钥(公钥)并由本人公开,为一组用户所共享,用于加密和验证签名。当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样信息就可以安全无误地到达目的地了。通过数字的手段保证加密过程是一个不可逆过程,即只有用私

5、有密钥才能解密。在公开密钥密码体制中,常用的一种是RSA体制。其数学原理是将一个大数分解成两个质数的乘积,加密和解密用的是两个不同的密钥。即使已知明文、密文和加密密钥(公开密钥),想要推导出解密密钥(私密密钥),在计算上是不可能的。按现在的计算机技术水平,要破解目前采用的1024位RSA密钥,需要上千年的计算时间。公开密钥技术解决了密钥发布的管理问题,商户可以公开其公开密钥,而保留其私有密钥。购物者可以用人人皆知的公开密钥对发送的信息进行加密,安全地传送给商户,然后由商户用自己的私有密钥进行解密。6. 数字签名用户也可以采用自己的私钥对信息加以处理,由于密钥仅为本人所有,这样就产生了别人无法生

6、成的文件,也就形成了数字签名。采用数字签名,能够确认以下两点: 保证信息是由签名者自己签名发送的,签名者不能否认或难以否认。 保证信息自签发后到收到为止未曾作过任何修改,签发的文件是真实文件。将报文按双方约定的HASH算法计算得到一个固定位数的报文摘要。在数学上保证:只要改动报文中任何一位,重新计算出的报文摘要值就会与原先的值不相符。这样就保证了报文的不可更改性。将该报文摘要值用发送者的私人密钥加密(对明文进行解密完全没问题,会得出一个不可读的“明文”),然后连同原报文一起发送给接收者,而“加密”后的报文即称数字签名。接收方收到数字签名后,用同样的HASH算法对原报文计算出报文摘要值,然后与用

7、发送者的公开密钥对数字签名进行解密(原先已经把签名加密了,现在再解密就能还原)得到的报文摘要值相比较。如相等则说明报文确实来自所称的发送者。由于只有拥有私钥的签名者能通过“解密”摘要生成签名,因此具有安全和不可抵赖性。那为什么是对报文摘要进行加密,而不是对原报文进行加密呢?这是因为RSA加解密非常耗时,被加密的报文越大,耗得时间越多,因此聪明的人类对其摘要进行加密,(因为报文摘要是要比原报文小得多),仍然能够起到同样的作用。这是为什么多了个报文摘要。7. 证书格式目前数字证书的格式普遍采用的是X.509V3国际标准,一个标准的X.509数字证书包含以下一些内容: 证书的版本信息; 证书的序列号

8、,每个证书都有一个唯一的证书序列号; 证书所使用的签名算法; 证书的发行机构名称,命名规则一般采用X.500格式; 证书的有效期,现在通用的证书一般采用UTC时间格式,它的计时范围为1950-2049; 证书所有人的名称,命名规则一般采用X.500格式; 证书所有人的公开密钥; 证书发行者对证书的签名。作为文件形式存在的证书一般有这几种格式:带有私钥的证书由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名。二进制编码的证书中没有私钥,DER 编码二进制格式的证书文件,以cer作

9、为证书文件后缀名。Base64编码的证书证书中没有私钥,BASE64 编码格式的证书文件,也是以cer作为证书文件后缀名。由此可看出,只有pfx格式的数字证书是包含有私钥的,cer格式的数字证书里面只有公钥没有私钥。当然,我们经常使用的数字证书就是cer格式的,比如,12306 颁发的数字证书,就是这种格式的,购票之前,需要在自己的电脑上安装证书,以确保我们的客户端可以与正确的服务器进行通信。当然,正如上面所说,CA 证书还是可以自己生成的,只不过自己生成的证书对于操作系统来说,是识别不了的,因为操作系统中并没有存在生成证书的发行机构。不过,这并不妨碍我们正常的使用证书。(二) 剖析数字证书上

10、一篇介绍了一下 CA 证书的几个相关概念,这几个概念还是很重要的,目的在于了解数字证书,以及其的工作原理。这篇文章主要是对 CA 证书进行剖析,讲一下证书的基本构成,这对于生成正确的、可以访问的证书是必不可少的。8. 构成先看一下证书到底是什么,在 Windows 下查看证书时(这里以cer为例),界面是这样的。常规选项卡里,主要介绍了证书信息,颁发者,和有效日期等。而详细信息选项卡中,包含的信息是比较多的,他们都是以一种 Key Value 的形式存在的,其中字段包括:版本、序列号、签名算法、颁发者、有效期、公钥、指纹等等。在上一篇文章中也有提到。下面我们就详细的来看看这些字段到底是干什么用

11、的。9. 详细信息1) 版本(Version)很明显,这个是证书的版本号,不同版本的证书格式是不同的。这里,我用的是 V3 版本。2) 序列号(SerialNumber)证书序列号,同一身份验证机构签发的证书序列号是唯一的。3) 签名算法(Signaturealgorithm)签名算法,指的是这个数字证书中的数字签名所使用的加密算法,可以通过根证书中的公钥对这个证书中的指纹进行解密。4) 颁发者(Issuer)证书发布机构,指出这个证书是哪个公司创建的,这是哪个 CA 中心的证书。当然,如果是你自己公司生成的证书,那么颁发者就是你自己的公司了。5) 有效期(Valid from to)证书的生

12、成日期,以及证书使用的截至日期。证书有效期失效之后,在认证服务器中会进行校验,校验失败后,重新生成新证书或者是其他的操作。这个依据证书的发布机构而定。6) 使用者(Subject)这个证书是发布给谁的,或者说是证书的所有者,一般是某个人或者某个公司的名称、机构的名称、公司网站的网址等。当然,如果是根证书的话,那么,使用者就是自己的公司了。7) 公钥(Publickey)证书的公钥,主要是用来对消息进行加密的,这个证书的公钥是 2048 位的,他的值可以在对话框中看到,是很长的一段十六进制数。8) 指纹及指纹算法(Thumbprint、Thumbprintalgorithm)指纹以及指纹算法,在

13、证书发布的时候,发布机构会根据指纹算法先计算出整个证书的hash值,并使用证书发布机构的私钥对其进行签名构成一个指纹,并将指纹与该证书放在一起。在生成证书的时候,需要自己设定颁发者、有效期、使用者等等。版本、签名算法、以及证书公钥等都是要设定的,否则生成的证书是无法正常使用的。(三) 生成数字证书前两篇把基本的概念和构成都大致的说了一下,今天这篇文章,主要是讲一下,如何使用 Java 代码生成 CA 证书,以及在生成证书的时候,需要设置的一些属性。这里使用的是 Java 的api,以及第三方的一个组件 BC,(Bouncy Castle)。稍微介绍一下 BC,Bouncy Castle 是一种

14、用于 Java 平台的开放源码的轻量级密码术包。它支持大量的密码术算法,并提供 JCE 1.2.1 的实现。而我们将要使用的就是非常常用的非对称算法 RSA 加密算法。下面我们来看一下具体的代码。CAConfig(配置接口)publicinterfaceCAConfigStringCA_C=CN;StringCA_ST=BJ;StringCA_L=BJ;StringCA_O=SICCA;StringCA_ROOT_ISSUER=C=CN,ST=BJ,L=BJ,O=SICCA,OU=SC,CN=SICCA;StringCA_DEFAULT_SUBJECT=C=CN,ST=BJ,L=BJ,O=SI

15、CCA,OU=SC,CN=;StringCA_SHA=SHA256WithRSAEncryption;BaseCert(证书类)importcom.cacss.jsceu.context.CAConfig;importcom.cacss.jsceu.util.CertUtil;importcom.cacss.jsceu.util.DateUtil;importorg.bouncycastle.jce.provider.BouncyCastleProvider;importorg.bouncycastle.x509.X509V3CertificateGenerator;importjavax.s

16、ecurity.auth.x500.X500Principal;importjava.security.*;importjava.security.cert.X509Certificate;SuppressWarnings(all)publicclassBaseCertstaticSecurity.addProvider(newBouncyCastleProvider();protectedstaticKeyPairGeneratorkpg=null;publicBaseCert()try/采用RSA非对称算法加密kpg=KeyPairGenerator.getInstance(RSA);/初

17、始化为1023位kpg.initialize(1024);catch(NoSuchAlgorithmExceptione)e.printStackTrace();/*生成X509证书*paramuser*return*/publicX509CertificategenerateCert(Stringuser)X509Certificatecert=null;tryKeyPairkeyPair=this.kpg.generateKeyPair();/公钥PublicKeypubKey=keyPair.getPublic();/私钥PrivateKeypriKey=keyPair.getPriva

18、te();X509V3CertificateGeneratorcertGen=newX509V3CertificateGenerator();/设置序列号certGen.setSerialNumber(CertUtil.getNextSerialNumber();/设置颁发者certGen.setIssuerDN(newX500Principal(CAConfig.CA_ROOT_ISSUER);/设置有效期certGen.setNotBefore(DateUtil.getCurrDate();certGen.setNotAfter(DateUtil.getNextYear();/设置使用者c

19、ertGen.setSubjectDN(newX500Principal(CAConfig.CA_DEFAULT_SUBJECT+user);/公钥certGen.setPublicKey(pubKey);/签名算法certGen.setSignatureAlgorithm(CAConfig.CA_SHA);cert=certGen.generateX509Certificate(priKey,BC);catch(Exceptione)System.out.println(e.getClass()+e.getMessage();returncert;GenerateCa(测试类)importj

20、ava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.security.cert.CertificateEncodingException;importjava.security.cert.X509Certificate;publicclassGenerateCaprivatestaticStringcertPath=d:/lee.cer;publicstaticvoidmain(Stringargs)BaseCertbaseCert=newBaseCer

21、t();X509Certificatecert=baseCert.generateCert(Lee);System.out.println(cert.toString();/导出为cer证书tryFileOutputStreamfos=newFileOutputStream(certPath);fos.write(cert.getEncoded();fos.close();catch(FileNotFoundExceptione)e.printStackTrace();catch(CertificateEncodingExceptione)e.printStackTrace();catch(I

22、OExceptione)e.printStackTrace();效果图下面是生成的证书,以及导出为cer格式的证书。控制台打印plainview plaincopyVersion:3SerialNumber:1419920991041IssuerDN:CN=SICCA,OU=SC,O=SICCA,L=BJ,ST=BJ,C=CNStartDate:TueDec3014:29:51CST2014FinalDate:WedDec3014:29:51CST2015SubjectDN:CN=Lee,OU=SC,O=SICCA,L=BJ,ST=BJ,C=CNPublicKey:RSAPublicKeymo

23、dulus:a9d5cc7de42c9afb468d7eb493bc69721443c0734edcb170ff13e062cc1b8d12e92edd347403d702288c5094ef2d0b2e811e0ee779a5e0a0cb7d5c75f30c5063eaa87aae7ba06bb3cf6ce6b0a5b0cd0cc2756255aff91fb09266b5dbbb6af491b5313947529d6a1fc30b9407ba1059bae909226c34e196b53c757a5826ffe147publicexponent:10001SignatureAlgorithm

24、:SHA256WITHRSASignature:8b8b725292147e9dbe8054ed99453386e1e6ba3d8248b31a2dcb477900005207c039898dd2af4675310471d3097f1aa3b6ff7e197f2ccf292dcd8ad1ce6f19204a54a2dc8fe1fe118eaf81004ad06c7ca04631f8a376272ddda5d4ae4980a1e2a3ee444ea6b80a8532358f5e1a1b82c6a54ea2e36a02d3ea8758c799df308d78cer证书结束语我这里使用的是第三方的组

25、件 BC 包进行加密的,采用的是 RSA 的加密算法,证书中的密钥长度为 1024 位,当然,你也可以设置为 2048 位,根据你自己的需要选择即可。不过,需要说明的一点是,在使用公(私)钥加密的时候,需要加密的字符串的长度是有要求的,以 1024 位的密钥长度来说,那么需要加密的字符串的长度不能超过 117 个字符,计算公式:1024 / 8 - 11 = 117。所以,在加密长字符串的时候,就需要采用分片加密的方法了,这一点需要注意,当然,后续讲加密的文章中,我也会说明这一点。(四) 生成数字证书(续)上一篇文章讲到了 Java 生成数字证书,使用的是第三方的组件 BC 。这篇文章也是介绍

26、生成数字证书的,只不过与上一篇不同的是,这篇采用的是KeyStore的存储方式,导出的证书文件格式为pfx,这种格式的证书不仅包含有公钥,还包含有私钥。从证书中就可以读取到私钥。正文废话不多说,直接上内容。与上一篇相同,这里也是使用的 Bouncy Castle 提供的组件,不同的是,这里的证书采用的是公钥加密技术12号标准生成的,简写 PKCS12 。具体内容这里就不再详细的介绍了,有需要的童鞋们直接 Google 就行了。下面直接上代码。PKCS12Test (测试证书类)javaview plaincopypackagecom.cacss.jsceu.core;importorg.bouncycastle.jce.provider.BouncyCastleProvider;importorg.bouncycastle.x509.X509V3CertificateGenerator;importjavax.security.auth.x500.X500Principal;importjava.io.FileOutputStream;importjava.io.IOException;importjava.ma

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1