JSCEP对初学者的帮助

时间:2019-05-08 07:27:51

标签: java jscep

我正在用jscep做一个项目。我从https://github.com/jscep/jscep获得了代码。除了源代码外,文档中还提供了一些代码。我的问题是,我应该在哪里输入文档中给出的所有代码。

这实际上是我的第一个大项目。我已经设置了NDES和CA服务器,并且能够通过Chrome获得证书。因此,手动完成工作非常完美。现在,我尝试通过JSCEP代码访问服务器,并且能够获得“ 200 ok”的信息。但是我也收到一条错误消息,提示“内容类型不匹配:为'null',预期为'text / plain'”。

文档中提供了以下代码。

// 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 :(得分:0)

您需要学习以下内容才能对该项目有一个了解。请不要跳过任何文档,因为我跳过了一些学习资料,最终我不得不阅读那些学习资料。因此,请阅读我在这里引用的所有材料。

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

设置CA后,您可以从浏览器手动获取证书。只需输入以下URL。

http://host/certsrv/default.asp,您可以手动获取证书。

此外,JSCEP项目是Maven项目。因此,您需要了解Maven是什么。只需在Maven上观看YouTube视频一个小时,您就会有个好主意。

现在,让我告诉您如何创建项目并执行它。 (我认为您已经阅读了以上文章,还观看了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)在网址中,用您的主机名替换主机。 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质询密码。只需刷新浏览器,您就会得到一个新的浏览器。

您可以通过在服务器管理器中打开证书颁发机构并在已颁发的证书下交叉检查此证书,只需刷新即可找到该新证书。验证两者,它们一定会匹配。