本人刚写的学习心得 希望能有所帮助
/**
*代码实例 通过反编译查看keytool的java code获得的数字证书的内部生成方法
*推荐使用jdk1.5
**/
1。首先生成selfcert
CertAndKeyGen cak = new CertAndKeyGen("RSA","MD5WithRSA",null);
//参数分别为 公钥算法 签名算法 providername(因为不知道确切的 只好使用null 既使用默认的provider)
cak.generate(1024);
//生成一对key 参数为key的长度 对于rsa不能小于512
X500Name subject = new X500Name("CN=simic,o=shanghai");
//subject name
X509Certificate certificate = cak.getSelfCertificate(subject,10);
// 后一个long型参数代表从现在开始的有效期 单位为秒(如果不想从现在开始算 可以在后面改这个域) BASE64Encoder base64 = new BASE64Encoder();
FileOutputStream fos = new FileOutputStream(new File("d:\\test.crt"));
base64.encodeBuffer(certificate.getEncoded(), fos);
//生成cert文件 base64加密 当然也可以不加密
2。生成非自签的cert
首先按照1走一遍生成一个自签证书
byte certbytes[] = certificate.getEncoded();
X509CertImpl x509certimpl = new X509CertImpl(certbytes);
X509CertInfo x509certinfo = (X509CertInfo)x509certimpl.get("x509.info");
X500Name issuer = new X500Name("CN=fatal,o=shanghai");
x509certinfo.set("issuer.dname",issuer);
//设置issuer域
Date bdate = new Date();
Date edate = new Date();
edate.setTime(bdate.getTime() + validity * 1000L * 24L * 60L * 60L);
//validity为有效时间长度 单位为秒
CertificateValidity certificatevalidity = new CertificateValidity(bdate, edate);
x509certinfo.set("validity", certificatevalidity);
//设置有效期域(包含开始时间和到期时间)域名等同与x509certinfo.VALIDITY
x509certinfo.set("serialNumber", new CertificateSerialNumber((int)(date.getTime() / 1000L)));
//设置序列号域
CertificateVersion cv = new CertificateVersion(CertificateVersion.V3);
x509certinfo.set(X509CertInfo.VERSION,cv);
//设置版本号 只有v1 ,v2,v3这几个合法值
/**
*以上是证书的基本信息 如果要添加用户扩展信息 则比较麻烦 首先要确定version必须是v3否则不行 然后按照以下步骤
**/
ObjectIdentifier oid = new ObjectIdentifier(new int[]{1,22});
//生成扩展域的id 是个int数组 第1位最大2 第2位最大39 最多可以几位不明....
byte l = 0x11;//数据总长17位
byte f = 0x04;
String userData = "hohohohohahahahah";
byte[] bs = new byte[userData.length()+2];
bs[0] = f;
bs[1] = l;
for(int i=2;i<bs.length;i++)
{
bs[i] = (byte)userData.charAt(i-2);
}
Extension ext = new Extension(oid,true,bs);
// 生成一个extension对象 参数分别为 oid,是否关键扩展,byte[]型的内容值
//其中内容的格式比较怪异 第一位是flag 这里取4暂时没出错 估计用来说明数据的用处的 第2位是后面的实际数据的长度,然后就是数据
CertificateExtensions exts = new CertificateExtensions();
exts.set("aa",ext);
//如果有多个extension则都放入CertificateExtensions 类中,
x509certinfo.set(X509CertInfo.EXTENSIONS,exts);
//设置extensions域
X509CertImpl x509certimpl1 = new X509CertImpl(x509certinfo);
x509certimpl1.sign(cak1.getPrivateKey(), "MD5WithRSA");
//使用另一个证书的私钥来签名此证书 这里使用 md5散列 用rsa来加密
BASE64Encoder base64 = new BASE64Encoder();
FileOutputStream fos = new FileOutputStream(new File("d:\\test.crt"));
base64.encodeBuffer(x509certimpl1.getEncoded(), fos);
//生成文件
x509certimpl1.verify(cak.getPublicKey(),null);
//使用某个证书的公钥验证证书 如果验证不通过 则会抛错
很多地方没仔细测过 可能有不正确之处还请多包涵
==========================代码2==================================
http://www.blogjava.net/neumqp/archive/2006/03/02/33211.html
keytool -genkey -dname "CN=demo, OU=softDept, O=company, L=puddong,S=shanghai, C=cn" -alias demo -keyalg RSA -keysize 1024 -keystore demoKeystore -validity 3650 -storepass storePwd -keypass demoPwd
生成保存公钥和私钥的密钥仓库,保存在demoKeystore文件中。这里storepass 和 keypass 不要有java 正则表达式中的特殊字符,否则程序里要转义麻烦。
keytool -export -alias demo -keystore demoKeystore -rfc -file demo.cer //从密钥仓库中导出保存公钥的证书
输入keypass 即demoPwd
try{
//密钥仓库
KeyStore ks = KeyStore.getInstance("JKS");
//读取密钥仓库
FileInputStream ksfis = new FileInputStream("demoKeystore");
BufferedInputStream ksbufin = new BufferedInputStream(ksfis);
char[] storePwd = "storePwd".toCharArray();
ks.load(ksbufin, storePwd);
ksbufin.close();
char[] keyPwd = "demoPwd".toCharArray();
//从密钥仓库得到私钥
PrivateKey priK = (PrivateKey) ks.getKey("demo", keyPwd);
//生成cipher
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding",new org.bouncycastle.jce.provider.BouncyCastleProvider());
//用私钥初始化cipher
cipher.init(Cipher.ENCRYPT_MODE, priK);
byte[] plain = "This is plain text".getBytes("UTF-8");
//因为用的1024位rsa算法,一次只能加密1024/8-11字节数据,分开加密
byte[] code = new byte[(((plain.length-1)/117+1))*128];
int ixplain = 0;
int ixcode = 0;
while((plain.length - ixplain) > 117) {//每117字节做一次加密
ixcode += cipher.doFinal(plain, ixplain, 117, code, ixcode);
ixplain += 117;
}
cipher.doFinal(plain, ixplain, plain.length - ixplain, code, ixcode);
//加密后的code
System.out.println(Arrays.toString(code));
//通常会用base64编码
String base64 = encoder.encode(code);
CertificateFactory certificatefactory = CertificateFactory
.getInstance("X.509");
//读取证书
FileInputStream fin = new FileInputStream("demo.cer");
X509Certificate certificate = (X509Certificate) certificatefactory
.generateCertificate(fin);
fin.close();
//得到公钥
PublicKey pubK = certificate.getPublicKey();
//初始化cipher
cipher.init(Cipher.DECRYPT_MODE, pubK);
//base64解码
code = decoder.decodeBuffer(base64);
System.out.println(Arrays.toString(code));
byte[] plain2 = new byte[code.length];
int ixplain2 = 0;
int ixcode2 = 0;
while((code.length - ixcode2) > 12 8) {//每128字节做一次解密
ixplain2 += cipher.doFinal(code, ixcode2, 128, plain2, ixplain2);
ixcode2 += 128;
}
ixplain2 += cipher.doFinal(code, ixcode2, code.length - ixcode2, plain2, ixplain2);
String s2 = new String(plain2, 0, ixplain2, "UTF-8");
System.out.println(s2);
}catch(Exception ex){
ex.printStackTrace();
}
分享到:
相关推荐
Java代码生成数字证书涉及到几个关键概念和技术,包括Java的密钥和证书管理、RSA加密算法以及非交互式证书创建。在此,我们将深入探讨这些主题,以便理解如何在Java环境中生成和使用数字证书。 1. **数字证书**:...
在Java编程环境中,生成数字证书是一项关键的安全技术,主要用于数据加密、身份验证和签名等应用场景。数字证书通常包含了公钥和私钥对,以及证书持有者的相关信息,这些信息经过认证机构(CA)的签名,确保了证书的...
在实际操作中,你需要编写Java代码来生成和签署证书,这部分可能涉及到`KeyPairGenerator`、`KeyStore`、`Certificate`等类的使用。同时,还需要了解如何配置和操作`keytool`命令行工具,它是Java提供的用于管理...
这份"Java 数字签名、数字证书生成源码"的压缩包提供了实现这些功能的代码示例,对于理解和应用Java安全机制非常有帮助。 数字签名是一种用于验证电子信息完整性和发送者身份的技术。它结合了非对称加密算法(如RSA...
在这个"Java 数字签名、数字证书生成源码"压缩包中,包含了实现这些功能的源代码,对于理解Java安全编程和实际应用具有很高的价值。 1. **数字签名** 数字签名是一种用于验证电子文档完整性和发送者身份的技术。在...
本资源包含的Java代码工具包提供了生成数字签名和数字证书的源码,这有助于开发者快速理解和实现相关功能。 首先,让我们了解一下数字签名。数字签名是一种用于验证电子文档完整性和发送者身份的技术。它利用非对称...
### Java 获取数字证书信息 在本篇文章中,我们将深入探讨如何使用Java来获取数字证书的信息,包括使用TOMCAT和JDK搭建SSL服务的过程、如何用OpenSSL签发证书以及如何支持第三方CA等内容。 #### 一、使用TOMCAT和...
本篇文章将深入探讨Java中如何实现安全通信、生成和使用数字证书。 首先,我们了解两个基础概念:消息摘要和消息验证码。消息摘要是一种算法,通过该算法对原始数据进行处理,生成一个固定长度的摘要值,类似于数据...
3. CA验证申请者身份后,用其私钥签署CSR,生成数字证书。 4. 将证书分发给申请者。 这个源码包可能包含了以下组件: - 用于生成密钥对的`KeyPairGenerator`示例,如RSA或DSA算法。 - 实现`Signature`类的签名生成...
此外,`openssljava.jar`可能是封装了上述调用OpenSSL功能的Java库,这样可以更方便地在Java代码中生成和管理证书,而不需要直接操作系统命令。使用这样的库可以简化代码,降低安全风险,并提供更好的跨平台兼容性。...
这段代码展示了如何在Java中使用BouncyCastle库生成PKCS#12格式的数字证书。请注意,实际应用中需要根据实际情况填充证书的详细信息,如组织名称、有效期等,并确保安全性,例如使用更复杂的密码策略。 总结来说,...
Java生成X509证书是Java开发者在进行安全通信时常用的一种技术,X509是一种数字证书的标准格式,广泛应用于SSL/TLS协议、PKI(公钥基础设施)系统等。在Java中,通常通过使用Bouncy Castle库(BC)来实现X509证书的...
本文将深入探讨Java中的数字证书概念,生成过程,以及相关的文档说明。 一、数字证书概述 数字证书是网络安全的基础,它类似于现实生活中的身份证,通过权威机构(称为证书颁发机构,或CA)进行签名,以证明持有者...
在Java中,证书通常是以X.509标准格式表示的数字证书,用于验证网络实体的身份。这些证书包含公钥和身份信息,并由受信任的证书颁发机构(CA)签名。对于自签名证书,我们可以在本地生成,而无需第三方CA。 生成...
签名过程涉及到了Java的关键组件——Java Key Store(JKS),这是Java提供的一个安全存储密钥和证书的容器。 生成Android签名文件通常使用Java的`keytool`命令行工具,它包含在Java Development Kit (JDK) 中。以下...
5. **证书处理**:`java.security.cert.CertificateFactory`用于解析和生成X.509证书,这是最常用的数字证书格式。 6. **密钥库操作**:`keytool`命令行工具或Java API(如`KeyStore`类)用于管理密钥库,包括导入、...
在Java中,可以使用keytool工具来生成自签名证书,或者生成CSR(证书签名请求)提交给CA机构获得正规的数字证书。在实现数字证书的签名和验证过程中,Java提供了一系列用于操作X.509证书的API,如java.security.cert...
在实际应用中,这些源码示例可能包括了生成和验证数字签名以及数字证书的具体代码,对于学习和理解Java安全机制非常有帮助。通过阅读和运行这些源码,开发者可以更好地掌握如何在实际项目中应用这些安全功能。 总之...
在给定的压缩包"基于java的数字签名、数字证书生成源码.zip"中,可能包含了一些示例代码,例如如何使用Java API来实现数字签名的生成和验证,以及如何生成自签名的数字证书。这些源码可能涵盖了以下步骤: 1. 导入...