JAVA编写CA认证中的.KEYSTORE的问题

Eros1219 2003-08-20 07:18:58
用BIN目录下KEYTOOL生成自签证书中的秘钥对存在.keystore文件中,
但为什么.KEYSTORE不能打开?
各位高手能提点一下么,小女子不盛感激。

...全文
193 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eros1219 2003-08-20
  • 打赏
  • 举报
回复
谢谢高人,实在惭愧,请问这些包要在哪下?
Euyi 2003-08-20
  • 打赏
  • 举报
回复
package criptografia.protocolos;

import java.security.*;
import java.security.cert.*;
import java.security.spec.*;
import java.security.interfaces.*;
import javax.crypto.*;
import java.io.*;
import java.util.*;
import java.math.*;
import java.net.*;

import iaik.asn1.structures.Name;
import iaik.asn1.structures.AlgorithmID;
import iaik.asn1.ObjectID;

public class CA {

public static void main(String args[]) throws Exception {

// Verificar se os parametros est correctos
if (args.length == 5) {

// Requisitar uma keystore do tipo JKS
KeyStore ks = KeyStore.getInstance("JKS");

// Carregar a keystore a partir do ficheiro especificado

FileInputStream fis = new FileInputStream(args[0]);
ks.load(fis,args[1].toCharArray());
fis.close();

// Obter o certificado do issuer
java.security.cert.Certificate[] issuerChain = ks.getCertificateChain(args[2]);
X509Certificate issuer = (X509Certificate)issuerChain[0];

// Obter chave p lica do issuer e par etros comuns
DSAPublicKey caPublicKey = (DSAPublicKey) issuer.getPublicKey();
BigInteger p = caPublicKey.getParams().getP();
BigInteger q = caPublicKey.getParams().getQ();
BigInteger g = caPublicKey.getParams().getG();

// Obter chave privada do issuer
PrivateKey chave = (PrivateKey) ks.getKey(args[2],args[3].toCharArray());

// Criar um server socket na porta parametrizada
ServerSocket ss = new ServerSocket(Integer.parseInt(args[4]));

while (true) {

System.out.println("Estou ?espera na porta "+args[4]);

// Ficar ?espera de uma comunica o
Socket s = ss.accept();
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
ObjectInputStream in = new ObjectInputStream(s.getInputStream());

// Enviar par etros comuns da comunidade
out.writeObject(p);
out.writeObject(q);
out.writeObject(g);

// Construir um certificado para o subject

// Temos que usar os certificados do provider IAIK
// porque na JCA n ?poss el criar

iaik.x509.X509Certificate cert = new iaik.x509.X509Certificate();
// Este n ero de sie aleatio n faz muito sentido...
cert.setSerialNumber(new BigInteger(32, new Random()));

// Definir o DN do issuer
cert.setIssuerDN(converte(issuer.getSubjectDN().getName()));
// Definir o DN do subject
String subjectDN = (String) in.readObject();
System.out.println("Vou emitir um certificado para "+subjectDN);
cert.setSubjectDN(converte(subjectDN));

// Definir a chave plica do subject
PublicKey subjectPK = (PublicKey) in.readObject();
cert.setPublicKey(subjectPK);

// Definir prazo de validade do certificado
GregorianCalendar data = (GregorianCalendar) Calendar.getInstance();
cert.setValidNotBefore(data.getTime());
data.add(Calendar.MONTH, 6);
cert.setValidNotAfter(data.getTime());

// Assinar o certificado
cert.sign(AlgorithmID.dsa,chave);

// Imprimir o conteudo do certificado
System.out.println(cert.toString(true));

// Enviar o certificado ao subject
out.writeObject(cert.getEncoded());

}
} else {
System.out.println("Modo de utiliza玢o: java CA <keystore> <password> <issuer> <keypass> <porta>");
}
}

// M閠odo auxiliar utilizado para converter uma string com um DN
// numa inst钞cia de iaik.asn1.structures.Name

private static Name converte(String aux) {
Name res = new Name();
int i, f;
i=aux.indexOf("C=");
f=aux.indexOf(",",i);
if (f==-1) f=aux.length();
String c = aux.substring(i+2,f);
i=aux.indexOf("ST=");
f=aux.indexOf(",",i);
if (f==-1) f=aux.length();
String st = aux.substring(i+3,f);
i=aux.indexOf("L=");
f=aux.indexOf(",",i);
if (f==-1) f=aux.length();
String l = aux.substring(i+2,f);
i=aux.indexOf("O=");
f=aux.indexOf(",",i);
if (f==-1) f=aux.length();
String o = aux.substring(i+2,f);
i=aux.indexOf("OU=");
f=aux.indexOf(",",i);
if (f==-1) f=aux.length();
String ou = aux.substring(i+3,f);
i=aux.indexOf("CN=");
f=aux.indexOf(",",i);
if (f==-1) f=aux.length();
String cn = aux.substring(i+3,f);
res.addRDN(ObjectID.country, c);
res.addRDN(ObjectID.stateOrProvince, st);
res.addRDN(ObjectID.locality, l);
res.addRDN(ObjectID.organization, o);
res.addRDN(ObjectID.organizationalUnit, ou);
res.addRDN(ObjectID.commonName, cn);
return res;
}

}


------------------------------------------------------------------
Euyi

zhaoruyi2003@263.net
------------------------------------------------------------------

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧