ЗАОЕП помощь для начинающих - PullRequest
0 голосов
/ 08 мая 2019

Я делаю проект на jscep. Я получил код от https://github.com/jscep/jscep. Помимо исходного кода, в документации также есть некоторый код. Мой вопрос заключается в том, где я должен ввести все коды, приведенные в документации.

Это на самом деле мой первый большой проект. Я настроил сервер NDES и CA и смог получить сертификат через Chrome. Таким образом, ручной Scep работает отлично. И теперь я пытаюсь добраться до сервера с помощью кода JSCEP, и я могу получить "200 нормально". Но также я получаю сообщение об ошибке «Несоответствие типов содержимого: было« нулевое », ожидаемое« текст / обычный »».

Следующий код доступен в документации.

// Mandatory
X500Principal requesterIssuer = new X500Principal("CN=jscep.org, L=Cardiff, ST=Wales, C=UK");
BigInteger serial = BigInteger.ONE;
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, -1); // yesterday
Date notBefore = calendar.getTime();
calendar.add(Calendar.DATE, +2); // tomorrow
Date notAfter = calendar.getTime();
X500Principal requesterSubject = new X500Principal("CN=jscep.org, L=Cardiff, ST=Wales, C=UK"); // doesn't need to be the same as issuer
PublicKey requesterPubKey = requesterKeyPair.getPublic(); // from generated key pair
JcaX509v3CertificateBuilder certBuilder = new JcaX509v3CertificateBuilder(requesterIssuer, serial, notBefore, notAfter, requesterSubject, requesterPubKey);

Документация содержит код, подобный приведенному выше, и я не знаю, куда мне вводить этот код в проекте. Где мне ввести этот код в проект?

1 Ответ

0 голосов
/ 14 мая 2019

Вам нужно изучить следующие вещи, чтобы получить представление об этом проекте.Пожалуйста, не пропускайте ни одного из этого документа, потому что я пропустил некоторые учебные материалы, и в конце концов я был вынужден перейти к этим учебным материалам.Поэтому, пожалуйста, прочитайте каждый материал, на который я ссылаюсь.

Документация 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.Просто обновите браузер, и вы получите новый.

Вы можете перепроверить этот сертификат, открыв свой СЕРТИФИКАТ ВЛАСТЯ в диспетчере серверов и под выданными сертификатами, просто обновите, и вы найдете этот новый сертификат.Убедитесь, что они оба совпадают.

...