【发布时间】:2017-11-09 10:02:13
【问题描述】:
我有一些字符串,用逗号分隔。我必须为主题备用名称扩展添加与任何 GeneralName 匹配的所有扩展。有人可以帮我完成 for 循环吗?
@Override
public boolean saveKeypair(String arg0) {
KeyPair keyPair = generateKeyPair(Integer.parseInt(access.getPublicKeyParameter()));
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
X500Name name = new X500Name(access.getSubject());
BigInteger serial = new BigInteger(access.getSerialNumber());
Date notBefore = access.getNotBefore();
Date notAfter = access.getNotAfter();
X509v3CertificateBuilder certBuilder = new JcaX509v3CertificateBuilder(name, serial, notBefore, notAfter, name,
publicKey);
// BEGIN extensions
// certificate policies
boolean isCritPol = access.isCritical(3);
PolicyInformation[] policies = new PolicyInformation[1];
policies[0] = new PolicyInformation(new ASN1ObjectIdentifier("2.16.840.1.101.2.1.11.5"),
new DERSequence(new PolicyQualifierInfo(access.getCpsUri())));
try {
certBuilder.addExtension(Extension.certificatePolicies, isCritPol, new CertificatePolicies(policies));
} catch (CertIOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// END CP
// subject alternative name
List<GeneralName> altNames = new ArrayList<GeneralName>();
String [] altSubNames = access.getAlternativeName(5);
for(String altName : altSubNames){
// I NEED THIS LOOP, AND I DON'T KNOW HOW TO DO IT
}
// END SAN
// END extensions
try {
// Content Signer
Security.addProvider(new BouncyCastleProvider());
ContentSigner sigGen = new JcaContentSignerBuilder(signatureAlgorithm).setProvider(providerName)
.build(privateKey);
// Certificate
X509Certificate certificate = new JcaX509CertificateConverter().setProvider(providerName)
.getCertificate(certBuilder.build(sigGen));
certificate.verify(publicKey);
X509Certificate[] chain = new X509Certificate[1];
chain[0] = certificate;
keyStore.setKeyEntry(arg0, privateKey, password.toCharArray(), chain);
} catch (OperatorCreationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CertificateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchProviderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SignatureException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (KeyStoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
// BEGIN of functions for saveKeypair
public KeyPair generateKeyPair(int keySize) {
KeyPair keyPair = null;
try {
KeyPairGenerator keyGenerator = KeyPairGenerator.getInstance(algorithm);
keyGenerator.initialize(keySize);
keyPair = keyGenerator.generateKeyPair();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return keyPair;
}
// END of functions for saveKeypair
该功能的其余部分正在工作。
我在 Java 中使用 BouncyCastle。 altSubName 是一个数组,由一些字符串组成。并且应该以某种方式检查这些字符串是哪个 SubjectAlternativeName,并且应该添加包含所有通用名称的扩展。
【问题讨论】:
-
有人可以帮我完成 for 循环吗? 我们不是为您提供远程编程工具,请您自己完成。停止使用 StackOverflow 作为你懒惰的捷径。
-
我并不懒惰,我尝试了一些不正确的方法。我可以只发布我不正确的功能,这不是问题吗?我真的需要这个帮助。因为我在 Internet 上找到的所有内容都是关于仅添加一个备用名称。
-
我有一个想法,那就是使用正则表达式并检查备用名称的类型,如果有更好的解决方案,我很感兴趣?
-
GeneralName 可以有很多不同的类型(dnsName、ipAddress、rfc822name 等等),你知道你的字符串应该是什么吗?你说“应该以某种方式检查字符串它们是哪个 SubjectAlternativeName” - 你有一些字符串的例子以及它是如何决定它们的类型的吗?
-
您使用的是哪个版本的 BouncyCastle?
标签: java certificate x509certificate bouncycastle subject-alternative-name