`

java证书签名

    博客分类:
  • java
阅读更多
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PushbackReader;
import java.security.KeyStore;
import java.security.Principal;
import java.security.PrivateKey;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Arrays;

import sun.security.x509.CertificateIssuerName;
import sun.security.x509.X500Name;
import sun.security.x509.X509CertImpl;
import sun.security.x509.X509CertInfo;

public class CertificateSigner {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

String ksname=null;
String alias=null;
String inname=null;
String outname=null;
for(int i=0;i<args.length;i++)
{
if(args[i].equals("-keystore"))
ksname=args[++i];
else if(args[i].equals("-alias"))
alias=args[++i];
else if(args[i].equals("-infile"))
inname=args[++i];
else if(args[i].equals("-outfile"))
outname=args[++i];
else usage();
}

if(ksname==null||alias==null||inname==null||outname==null||outname==null)usage();

try
{
PushbackReader console=new PushbackReader(new InputStreamReader(System.in));

KeyStore store=KeyStore.getInstance("JKS","SUN");
InputStream in=new FileInputStream(ksname);
System.out.print("Keystore password:");
System.out.flush();
char[] password=readPassword(console);

store.load(in,password);
Arrays.fill(password,' ');
in.close();

System.out.println("Key password for "+alias+": ");
System.out.flush();
char[] keyPassword=readPassword(console);
PrivateKey issuerPrivateKey=(PrivateKey) store.getKey(alias, keyPassword);
Arrays.fill(keyPassword, ' ');

if(issuerPrivateKey==null)error("No such private key");

in=new FileInputStream(inname);
CertificateFactory factory=CertificateFactory.getInstance("X.509");
X509Certificate inCert=(X509Certificate) factory.generateCertificate(in);
in.close();
byte[] inCertBytes=inCert.getTBSCertificate();

X509Certificate issuerCert=(X509Certificate) store.getCertificate(alias);
Principal issuer=issuerCert.getSubjectDN();
String issuerSigAlg=issuerCert.getSigAlgName();

FileOutputStream out=new FileOutputStream(outname);
X509CertInfo info=new X509CertInfo(inCertBytes);
info.set(X509CertInfo.ISSUER, new CertificateIssuerName((X500Name)issuer));
X509CertImpl outCert=new X509CertImpl(info);
outCert.sign(issuerPrivateKey, issuerSigAlg);
outCert.derEncode(out);
out.close();


}catch(Exception e)
{
e.printStackTrace();
}
}

private static char[] readPassword(PushbackReader in)throws IOException
{
final int MAX_PASSWORD_LENGTH=100;
int length=0;
int flag=0;
char[] buffer=new char[MAX_PASSWORD_LENGTH];
while(true)
{
int ch=in.read();

if(ch=='\r'||ch=='\n'||ch==-1||length==MAX_PASSWORD_LENGTH)
{
if(ch=='\r')
{
ch=in.read();
if(ch!='\n'&&ch!=-1)
{
in.unread(ch);
}


                                      if(length==0&&flag==0)
{
length=1;
}
char[] password=new char[length];
System.arraycopy(buffer, 0, password, 0, length);
                                      if(length==0&&flag==0)
{
length=0;
flag=1;
}
//Arrays.fill(buffer,' ');
return password;
}else
{
buffer[length]=(char) ch;
length++;
}
}
}
}

private static void error(String message)
{
System.out.println(message);
System.exit(1);
}
private static void usage()
{
System.out.println("Usage:java CertificateSigner"+" -keystore keystore -alias issuerKeyAlias"+" -infile inputFile -outfile outputFile");
System.exit(1);
}
}


证书签名
1)javac *.java
创建一个密钥库
2)keytool -genkey -keystore czm.store -alias czm
导出证书文件
3)keytool -export -keystore czm.store -alias czm -file czm.cert
打印证书
4)keytool -printcert -file czm.cert
把证书输入密钥库中
5)keytool -import -keystore czm1.store alias czm1 -file czm.cert
把要签名的文档加入到jar中
6)jar cvf document.jar document.txt
将签名添加到文件中
7)jarsigner -keystore czm.store document.jar czm
客户端校验
8)jarsigner -verify -keystore czm1.store document.jar
签名匹配将会打印:java verified

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics