java - org.apache.pdfbox.examples.signature.CreateVisableSignature 抛出 null 异常

标签 java digital-signature pdfbox

我在 CreateVisableSignature 示例中的 sign() 方法上遇到问题,抛出空指针异常

    List<Certificate> certList = Arrays.asList(cert);

我想我需要创建一个证书。有人可以告诉我该怎么做吗?

这是有问题的代码:

    public byte[] sign(InputStream content) throws SignatureException,
        IOException {
    CMSProcessableInputStream input = new CMSProcessableInputStream(content);
    CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
    // CertificateChain
    List<Certificate> certList = Arrays.asList(cert);
    CertStore certStore = null;
    try {
        certStore = CertStore.getInstance("Collection",
                new CollectionCertStoreParameters(certList), provider);
        gen.addSigner(privKey, (X509Certificate) certList.get(0),
                CMSSignedGenerator.DIGEST_SHA256);
        gen.addCertificatesAndCRLs(certStore);
        CMSSignedData signedData = gen.generate(input, false, provider);
        return signedData.getEncoded();
    } catch (Exception e) {
        // should be handled
        System.err.println("Error while creating pkcs7 signature.");
        e.printStackTrace();
    }
    throw new RuntimeException("Problem while preparing signature");
}

这是设置它的代码:

    /**
 * Initialize the signature creator with a keystore (pkcs12) and pin that
 * should be used for the signature.
 * 
 * @param keystore
 *            is a pkcs12 keystore.
 * @param pin
 *            is the pin for the keystore / private key
 */
public CreateVisibleSignature(KeyStore keystore, char[] pin) {
    try {
        /*
         * grabs the first alias from the keystore and get the private key.
         * An alternative method or constructor could be used for setting a
         * specific alias that should be used.
         */
        Enumeration<String> aliases = keystore.aliases();
        String alias = null;
        if (aliases.hasMoreElements()) {
            alias = aliases.nextElement();
        } else {
            throw new RuntimeException("Could not find alias");
        }
        privKey = (PrivateKey) keystore.getKey(alias, pin);
        cert = keystore.getCertificateChain(alias);
    } catch (KeyStoreException e) {
        e.printStackTrace();
    } catch (UnrecoverableKeyException e) {
        System.err.println("Could not extract private key.");
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        System.err.println("Unknown algorithm.");
        e.printStackTrace();
    }
}

这就是我创建 keystore 的方式:

keytool -genkeypair -storepass password1 -storetype pkcs12 -alias hhscms -validity 365 -keyalg RSA -keystore keystore.p12

为什么下面的代码无法获取证书?

        privKey = (PrivateKey) keystore.getKey(alias, pin);
        cert = keystore.getCertificateChain(alias);

这是我遇到的异常:

Exception in thread "main" java.lang.NullPointerException
at java.util.Objects.requireNonNull(Unknown Source)
at java.util.Arrays$ArrayList.<init>(Unknown Source)
at java.util.Arrays.asList(Unknown Source)
at org.apache.pdfbox.examples.signature.CreateVisibleSignature.sign(CreateVisibleSignature.java:191)
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteSignature(COSWriter.java:767)
at org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(COSWriter.java:1162)
at org.apache.pdfbox.cos.COSDocument.accept(COSDocument.java:578)
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1517)
at org.apache.pdfbox.pdmodel.PDDocument.saveIncremental(PDDocument.java:1398)
at org.apache.pdfbox.examples.signature.CreateVisibleSignature.signPDF(CreateVisibleSignature.java:164)
at org.apache.pdfbox.examples.signature.CreateVisibleSignature.main(CreateVisibleSignature.java:238)

这是我的 pom.xml 条目:

        <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox</artifactId>
        <version>1.8.9</version>
    </dependency>

    <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcprov-jdk15</artifactId>
      <version>1.44</version>
    </dependency>
    <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcmail-jdk15</artifactId>
      <version>1.44</version>
    </dependency>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-ext-jdk15on</artifactId>
        <version>1.52</version>
    </dependency>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcpkix-jdk15on</artifactId>
        <version>1.52</version>
    </dependency>  

最佳答案

正如 Tilman 所指出的,您必须确保正在运行正确的 key 工具。就我而言,keytool 指向 jre1.8 而不是 jdk1.8

关于java - org.apache.pdfbox.examples.signature.CreateVisableSignature 抛出 null 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31517545/

相关文章:

java - 删除二叉树中的值

java - 如何按其值类的字段对 LinkedHashMap 进行排序?

c# - 在 Windows 中检查 OSX (.dmg) 文件的数字签名

java - PDFBox 中的行编号

java - Java中的静态变量

java - ElasticSearch Percolator API 以及针对子文档运行的查询

java.security.InvalidKeyException : Unsupported key type: Sun RSA public key, 2048 位

c# - 在 C# 中,使用 x.509 证书签署 xml 并检查签名

java - 性能 iText 与 PdfBox

java - 如何将两个 pdf 页面与 pdfbox (java) 拼接在一起?