⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 certificatesigner.java

📁 精通Java网络编程代码全部
💻 JAVA
字号:
/*
 * Created on 2005-4-29
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

import java.io.*;
import java.security.*;
import java.security.cert.*;
import java.util.*;

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

/**
此程序给出认证
*/
public class CertificateSigner
{
	public static void main(String[] args)
	{
        String ksname = null; //  keystore名字
        String alias = null; // 私有的别名
        String inname = null; // 输入的文件名
		String outname = null; //输出的文件名
        for (int i = 0; i < args.length; i += 2)
		{
			if (args[i].equals("-keystore"))
				ksname = args[i + 1];
			else if (args[i].equals("-alias"))
				alias = args[i + 1];
			else if (args[i].equals("-infile"))
				inname = args[i + 1];
			else if (args[i].equals("-outfile"))
				outname = args[i + 1];
			else usage();
        }
		
		if (ksname == null || alias == null ||
			inname == 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.print("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 exception)
        {
			exception.printStackTrace();
        }
	}
	
	/**
	读入密码
	*/
    public static char[] readPassword(PushbackReader in)
		throws IOException
    {
		final int MAX_PASSWORD_LENGTH = 100;//设置密码最大位
		int length = 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') // handle DOS "\r\n" line ends
				{
					ch = in.read();
					if (ch != '\n' && ch != -1) in.unread(ch);
				}
				char[] password = new char[length];//设置密码
				System.arraycopy(buffer, 0, password, 0, length);
				Arrays.fill(buffer, ' ');
				return password;
			}
			else
			{
				buffer[length] = (char)ch;
				length++;
			}
		}
    }
	
    /**
	打印错误信息并退出
	@param message
	*/
	public static void error(String message)
	{
		System.out.println(message);
		System.exit(1);
    }
	
	/**
	打印有用信息
	*/
    public static void usage()
    {
		System.out.println("Usage: java CertificateSigner"
			+ " -keystore keyStore -alias issuerKeyAlias"
			+ " -infile inputFile -outfile outputFile");
		System.exit(1);
    }
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -