Я пытаюсь подключить JXTA для запуска в App Engine. Учитывая, что провайдер BouncyCastle «BC» еще не поддерживается в App Engine, я должен портировать существующий код JXTA для создания X509Certificate с использованием классов, перечисленных в белом списке. Мои знания о Crypto минимальны, и я не уверен, что то, что я пытаюсь выполнить, даже возможно. Вот исходный код из PSEUtils.java из проекта Jxta:Создание X509Certificate с использованием bouncycastle X509v3CertificateBuilder
Там есть вспомогательный класс, который содержит java.security.cert.X509Certificate:
public static class IssuerInfo {
public X509Certificate cert; // subject Cert
public PrivateKey subjectPkey; // subject private key
public X509Certificate issuer; // issuer Cert
public PrivateKey issuerPkey; // issuer private key
}
В методе :
public static IssuerInfo genCert(X500Principal subject, KeyPair keypair, IssuerInfo issuerinfo)
Я передаю в теме как:
new X500Principal("CN="+useCN)
, как пара ключей (от оригинального кода):
KeyPairGenerator g = KeyPairGenerator.getInstance("RSA");
g.initialize(1024, UTILS.srng);
KeyPair keypair = g.generateKeyPair();
и JXTA закодированы IssuerInfo.
Теперь, поскольку я не могу извлечь пакеты bouncycastle.jce, мне пришлось удалить код X509Principal и X509V3CertificateGenerator, который использует JXTA и пытается заменить его реализацией, которая соответствует ограничениям GAE. Вот что я имею в настоящее время для метода genCert, используя org.bouncycastle.X509.X509v3CertificateBuilder.
SubjectPublicKeyInfo subPubKeyInfo = SubjectPublicKeyInfo.getInstance(keypair.getPublic().getEncoded());
X509v3CertificateBuilder v3CertGen = new X509v3CertificateBuilder(
new X500Name(issuer.getName()),
BigInteger.ONE,
today, until,
new X500Name(subject.getName()),
subPubKeyInfo);
Проблема заключается в том, что я не могу получить keypair.getPublic().getEncoded()
работать с методом SubjectPublicKeyInfo.getInstance()
. Выдает java.lang.IllegalArgumentException: неизвестный объект на заводе: [B
Public Key, кажется, заполняется при осмотре:
Sun RSA public key, 1024 bits
modulus: 117521430893506212334140912845641570591161279468597426442875306202350445904550279678434051874985419676760802566018092318362676224355315431299979507080364677679613392086245588766565617009250512996843008784370448997729071786062596049780632058501646041736216482596596901215941577208285499619376322050871534546271
public exponent: 65537
я нашел следующую ссылку SO, который демонстрирует этот код работать:
Моя попытка преобразовать genCert ниже, но по некоторым причинам, я не могу получить за создание SubjectPublicKeyInfo из кодированного открытого ключа?
Любая помощь очень ценится.
public static IssuerInfo genCert(X500Principal subject, KeyPair keypair, IssuerInfo issuerinfo) {
IssuerInfo info = new IssuerInfo();
try {
// set up issuer
PrivateKey signer;
X500Principal issuer;
if (null == issuerinfo) { // self-signed root cert
signer = keypair.getPrivate();
issuer = new X500Principal(subject.getEncoded());
} else { // issuer signed service sert
signer = issuerinfo.subjectPkey;
X500Principal issuer_subject = issuerinfo.cert.getSubjectX500Principal();
issuer = new X500Principal(issuer_subject.getEncoded());
}
// set validity 10 years from today
Date today = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(today);
cal.add(Calendar.YEAR, 10);
Date until = cal.getTime();
SubjectPublicKeyInfo subPubKeyInfo = SubjectPublicKeyInfo.getInstance(keypair.getPublic().getEncoded());
//**Can't get here so i'm not sure if the rest of this works?**
AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder().find("SHA1withRSA");
AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);
RSAPrivateCrtKeyParameters cps = (RSAPrivateCrtKeyParameters) keypair.getPrivate();
ContentSigner sigGen = new BcRSAContentSignerBuilder(sigAlgId, digAlgId).build(cps);
X509CertificateHolder certHolder = v3CertGen.build(sigGen);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
// Read user Certificate
InputStream is1 = new ByteArrayInputStream(certHolder.getEncoded());
X509Certificate eeCert = (X509Certificate) cf.generateCertificate(is1);
is1.close();
Не могли бы вы обновить этот класс, как многие из них методы/классы теперь устарели в BC? – Reddy
BC теперь поддерживается в App Engine, поэтому он не нужен. –
@ChukDiesel Как насчет тех из нас, кто не использует App Engine? Пожалуйста? – Phil