Вам нужно изучить следующие вещи, чтобы получить представление об этом проекте.Пожалуйста, не пропускайте ни одного из этого документа, потому что я пропустил некоторые учебные материалы, и в конце концов я был вынужден перейти к этим учебным материалам.Поэтому, пожалуйста, прочитайте каждый материал, на который я ссылаюсь.
Документация JSCEP.https://github.com/jscep/jscep
https://tools.ietf.org/html/draft-nourse-scep-23
В моем случае я также настроил сервер CA.Поэтому, если вы также хотите настроить сервер, посмотрите это видео.https://www.youtube.com/watch?v=jSPkYvU2mnI&t=1687s
Также вы можете прочитать статью ниже.Вы можете получить много ошибок при настройке CA, но есть много помощи, доступной от сообщества Microsoft, так что не теряйте надежды.
http://social.technet.microsoft.com/wiki/contents/articles/9063.network-device-enrollment-service-ndes-in-active-directory-certificate-services-ad-cs.aspx?PageIndex=2#Deployments_Scenarios
После настройки ЦС вы можете вручную получить сертификат из браузера.Просто введите следующий URL.
http://host/certsrv/default.asp, и вы можете получить свой сертификат вручную.
Кроме того, проект JSCEP является проектом Maven.Так что вам нужно узнать, что такое Maven.Просто смотрите видео YouTube на Maven в течение часа, и вы получите хорошую идею.
Теперь позвольте мне рассказать, как создать проект и выполнить его.(Я предполагаю, что вы просмотрели вышеупомянутые статьи, а также смотрели видео на YouTube).
В IntelliJ создайте проект Maven и в файле pom.xml добавьте зависимость, доступную по следующей ссылке.https://search.maven.org/artifact/com.google.code.jscep/jscep/2.5.4/jar
Не запутайтесь, так как тут и там есть несколько зависимостей, вам нужна та, которая говорит Apache Maven.Ниже приведена зависимость.(Следующий и тот же элемент в ссылке одинаковы, вы можете использовать любой из них).
<dependency>
<groupId>com.google.code.jscep</groupId>
<artifactId>jscep</artifactId>
<version>2.5.4</version>
</dependency>
Далее вам понадобятся зависимости регистратора, которые вы можете получить из документации jscep (прокрутите внизниже, и вы увидите зависимости под ведением журнала.) Вот ссылка https://github.com/jscep/jscep#logging
Теперь создайте класс, вставьте приведенный ниже код и внесите необходимые изменения.Я расскажу, что все изменения, которые вам нужно сделать, внизу.Либо используйте код в этом URL https://github.com/jscep/jscep/blob/master/src/test/java/org/jscep/client/KeyStoreExampleClientTest.java#L59
, либо вставьте этот код ниже в созданный вами класс,
import org.bouncycastle.asn1.*;
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x509.*;
import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
import org.bouncycastle.pkcs.PKCS10CertificationRequest;
import org.bouncycastle.pkcs.PKCS10CertificationRequestBuilder;
import org.bouncycastle.pkcs.jcajce.JcaPKCS10CertificationRequestBuilder;
import org.jscep.client.Client;
import org.jscep.client.DefaultCallbackHandler;
import org.jscep.client.EnrollmentResponse;
import org.jscep.client.verification.CachingCertificateVerifier;
import org.jscep.client.verification.CertificateVerifier;
import org.jscep.client.verification.ConsoleCertificateVerifier;
import org.jscep.client.verification.OptimisticCertificateVerifier;
import org.jscep.transport.request.GetCaCapsRequest;
import org.jscep.transport.request.GetCaCertRequest;
import org.jscep.transport.request.GetNextCaCertRequest;
import org.jscep.transport.response.Capabilities;
import org.jscep.transport.response.Capability;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.x500.X500Principal;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.math.BigInteger;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.net.URL;
import java.security.*;
import java.security.cert.CertStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
public class MainClient {
public static void main(String args[]) throws Exception{
URL url = new URL("http://host/certsrv/mscep_admin/mscep.dll");
DefaultCallbackHandler handler = new DefaultCallbackHandler(new OptimisticCertificateVerifier());
Client client = new Client(url, handler);
Authenticator.setDefault (new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("username", "password".toCharArray());
}
});
Capabilities caps = client.getCaCapabilities("CA name");
JcaContentSignerBuilder signerBuilder;
if (caps.contains(Capability.SHA_1)) {
signerBuilder = new JcaContentSignerBuilder("SHA1withRSA");
} else {
signerBuilder = new JcaContentSignerBuilder("MD5withRSA");
}
KeyPair idPair = KeyPairGenerator.getInstance("RSA").genKeyPair();
X500Name issuer = new X500Name("CN=entity name");
BigInteger serial = new BigInteger(16, new SecureRandom());
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
Date notBefore = cal.getTime();
cal.add(Calendar.DATE, 2);
Date notAfter = cal.getTime();
X500Name subject = issuer;
PublicKey publicKey = idPair.getPublic();
JcaX509v3CertificateBuilder certBuilder = new JcaX509v3CertificateBuilder(issuer, serial, notBefore, notAfter, subject, publicKey);
X509CertificateHolder idHolder = certBuilder.build(signerBuilder.build(idPair.getPrivate()));
X509Certificate id = (X509Certificate) CertificateFactory.getInstance("X509").generateCertificate(new ByteArrayInputStream(idHolder.getEncoded()));
X500Name entityName = new X500Name("CN=entity name");
KeyPair entityPair = KeyPairGenerator.getInstance("RSA").genKeyPair();
SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfo
.getInstance(entityPair.getPublic().getEncoded());
PKCS10CertificationRequestBuilder csrBuilder = new PKCS10CertificationRequestBuilder(entityName, publicKeyInfo);
csrBuilder.addAttribute(
PKCSObjectIdentifiers.pkcs_9_at_challengePassword,
new DERPrintableString(new String("password".toCharArray())));
ContentSigner signer = signerBuilder.build(entityPair.getPrivate());
PKCS10CertificationRequest csr = csrBuilder.build(signer);
EnrollmentResponse response = client.enrol(id, idPair.getPrivate(), csr,"CA name");
if (response.isFailure()) {
System.out.println("Failed!");
} else if (response.isPending()) {
System.out.println("Pending!");
X500Principal entityPrincipal = new X500Principal(
entityName.getEncoded());
response = client.poll(id, idPair.getPrivate(), entityPrincipal,
response.getTransactionId(),"CA name");
} else if (response.isSuccess()) {
System.out.println("Success!");
CertStore store = response.getCertStore();
Collection<? extends Certificate> certs = store
.getCertificates(null);
Certificate[] chain = new Certificate[certs.size()];
int i = 0;
for (Certificate certificate : certs) {
chain[i++] = certificate;
}
FileOutputStream os = new FileOutputStream("cert.cer");
os.write("-----BEGIN CERTIFICATE-----\n".getBytes("US-ASCII"));
os.write(Base64.encodeBase64(chain[0].getEncoded(), true));
os.write("-----END CERTIFICATE-----\n".getBytes("US-ASCII"));
os.close();
System.out.println("Certificate : "+chain[0].toString());
KeyStore entityStore = KeyStore.getInstance("JKS");
entityStore.load(null, null);
entityStore.setKeyEntry("entity", entityPair.getPrivate(),
"secret".toCharArray(), chain);
entityStore.store(new ByteArrayOutputStream(),
"secret".toCharArray());
}
}
}
Вам потребуется внести следующие изменения:
1) в URL замените хост именем вашего хоста.2) в имени пользователя и пароле замените имя пользователя и пароль вашего сервера.3) в названии CA укажите название вашего центра сертификации.4) замените имя организации на свой CN (общее название вашей организации). 5) замените пароль на пароль вызова SCEP, который вы можете получить через браузер, введя URL-адрес.http://host/certsrv/mscep_admin/mscep.dll
(16 цифр) в этой строке кода
PKCSObjectIdentifiers.pkcs_9_at_challengePassword,
new DERPrintableString(new String("**password**".toCharArray())));
Просто запустите этот основной класс, и вы получите сообщение об успешном завершении, за которым следует сертификат.
И каждый раз вы должны использовать новый пароль вызова SCEP.Просто обновите браузер, и вы получите новый.
Вы можете перепроверить этот сертификат, открыв свой СЕРТИФИКАТ ВЛАСТЯ в диспетчере серверов и под выданными сертификатами, просто обновите, и вы найдете этот новый сертификат.Убедитесь, что они оба совпадают.