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 {
public static void main(String[] args) {
String ksname = null; // the keystore name
String alias = null; // the private key alias
String inname = null; // the input file name
String outname = null; // the output file name
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);
char[] password = readPassword(console, "Keystore password");
store.load(in, password);
Arrays.fill(password, ' ');
in.close();
char[] keyPassword = readPassword(console, "Key password for "
+ alias);
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) {
System.out.println(exception);
}
}
public static char[] readPassword(PushbackReader in, String prompt)
throws IOException {
System.out.print(prompt + ": ");
System.out.flush();
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++;
}
}
}
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);
}
}
分享到:
相关推荐
网上转了好多圈,发现数据安全的资料太少,好用的源码就更少了,所以自己决定做一个示例的集合,供大家参考和使用。 一些C#中数据安全的基本处理以及综合使用的实际例程。...方便好用,里面是我做的多个例子的集合。
文档“监理审核意见签字范例.doc”提供了监理工程师在不同施工环节中审核并签署意见的典型例子,这些例子涵盖了从工程开始到结束的各个关键步骤。以下是对这些知识点的详细说明: 1. **工程开工报审表**:监理...
在这个例子中,评审形式是会议评审,这意味着有一组专家聚集在一起,听取项目团队的汇报,并对相关技术文件进行审查。 在简要技术说明和主要技术性能指标部分,通常会概述科研项目的创新点、核心技术以及实现的主要...
此文档标题提及的"(完整word版)授权方的软件著作权证书和相应授权关系证明",主要涉及到以下几个核心知识点: 1. **软件著作权**:根据《中华人民共和国著作权法》,软件开发者对其开发的软件享有著作权,包括但不...
在这个例子中,施工单位——南充市公信检测,被提名为进行相关检测工作的单位。 1. **企业营业执照**:这是企业合法运营的基础,表明检测单位已经通过了工商行政管理部门的注册,具有合法经营的身份。 2. **检测...
其次,协议设定了一个明确的期限,例如在这个例子中是从2018年4月9日至2019年4月8日。期满后,如果双方都同意,可以续约。在此期间,甲方有权使用乙方的证书材料,同时有义务按照约定支付乙方的聘用工资。 协议中...
在这个例子中,项目经理为李胜奎,拥有工程师职称和二级建造师证,专业方向为机电,已经缴纳了养老保险。他的教育背景是工业自动化专业,有相关项目管理经验。 技术负责人是项目的技术决策者,负责技术指导和质量...
接下来,项目监理机构会出具工程款支付证书,再次确认同意支付的金额,并由总监理工程师签字并加盖执业印章,进一步增强了支付决定的正式性和权威性。这份证书同样是一式三份,分发给项目监理机构、建设单位和施工...
8. **认证机构**:在这个例子中,认证方是北京国建联信认证中心有限公司,它是一家提供产品认证、质量管理体系、环境管理体系和职业健康安全管理认证的专业机构,需遵守相关的国家法律法规和国际标准。 总结来说,...
在文中的例子中,担保期间为两年。 4. **担保金额**:担保金额是担保人承诺承担的最高还款额度,如果借款人未能偿还的贷款本息超出这个数额,担保人无需承担超出部分。 5. **财产证明**:担保人通常需要提供财产...
7. **验收与交割**:第五条描述了气垫船的检验和验收流程,包括试航和签署交船证书,证书的法律效力和风险转移的时间点。 8. **质量保证**:第六条保证了产品的质保期和保修范围,明确了因制造问题导致的缺陷如何...
在这个例子中,签订时间为XX年07月21日,地点未具体给出,合同编号也未详述。 2. **供需关系**:甲方(购买方)同意在乙方(销售方)供应螺纹钢、盘螺、线材等建筑用钢材的情况下,优先从乙方采购。如果甲方在无...
任命书中详细列出了总监理工程师代表的基本信息,如姓名、性别、年龄和职称,以及他的注册证书号码,这些信息是证明其专业资格的重要依据。颜拥军将根据总监理工程师的授权,在指定的职责范围内代表总监理工程师进行...
8. **实例应用**:协议范本中包含了两个具体的例子,展示了实际操作中的细节处理,如联通互联网业务的转让,包括门市、网络设施和用户资源等。 通过签订这样的协议,买卖双方能够清晰地了解各自的责任和权益,减少...
4. **公章和签字**:文档中的公章和签字代表了责任和授权,这在IT项目管理和合同签署中也很常见。在数字化环境中,电子签名和数字证书被广泛使用,以确保文档的完整性和不可否认性。 5. **技术内容审查**:在申请书...
4. **相关文件**:买方有权审验一系列文件,如机动车行驶证、机动车登记证书、税讫证明、年检证明、养路费缴费凭证等,确保车辆合法性。 5. **双方权利与义务**: - 卖方必须保证对车辆的所有权或处置权,并且车辆...
在表格中,填写了试验单位的基本信息,如单位名称——渭南市临渭区建设工程质量技术监督局,以及其计量认证证书编号——(2005)量认(渭)字(R0259)号,这表明该单位已经通过了计量认证,具备了进行相关检测工作的资格...
这份官方模板适用于那些需要验证其消防安全技术工作经验的人员,例如在报考相关职业资格证书时使用。以下是根据标签"技术"和部分内容详细阐述的相关知识点: 1. 消防安全技术工作年限:工作年限是评估个人专业技能...
5. **数字签名**:制作人和客户的签字部分在电子文档中可以理解为数字签名,虽然这里没有具体的数字证书,但在实际业务流程中,电子签名是一种常见的身份验证方式,用于确认文件的完整性和签署者的同意。 6. **通信...
3. **安装单位与使用单位**:在这个例子中,安装单位是昌鹏建筑机械有限责任公司,使用单位是黔西南州兴达建筑安装工程。两者都需要在告知书上签字确认,表明各自对施工质量和安全的承诺。 4. **项目经理和技术负责...