2016-04-13 9 views
0

に署名しながら、(私はhttp://developers.itextpdf.com/examples/security/digital-signatures-white-paper/digital-signatures-chapter-2から完全なサンプルを得た。エラーデジタル私はPDFに署名するため、次のプログラムを使用していますPDF

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.security.GeneralSecurityException; 
import java.security.KeyStore; 
import java.security.PrivateKey; 
import java.security.Security; 
import java.security.cert.Certificate; 

import org.bouncycastle.jce.provider.BouncyCastleProvider; 

import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.Rectangle; 
import com.itextpdf.text.pdf.PdfReader; 
import com.itextpdf.text.pdf.PdfSignatureAppearance; 
import com.itextpdf.text.pdf.PdfStamper; 
import com.itextpdf.text.pdf.security.BouncyCastleDigest; 
import com.itextpdf.text.pdf.security.DigestAlgorithms; 
import com.itextpdf.text.pdf.security.ExternalDigest; 
import com.itextpdf.text.pdf.security.ExternalSignature; 
import com.itextpdf.text.pdf.security.MakeSignature; 
import com.itextpdf.text.pdf.security.MakeSignature.CryptoStandard; 
import com.itextpdf.text.pdf.security.PrivateKeySignature; 

public class C2_01_SignHelloWorld { 

public static final String KEYSTORE = "src/main/resources/ks"; 
public static final char[] PASSWORD = "password".toCharArray(); 
public static final String SRC  = "src/main/resources/CA_Commercial_Construction.pdf"; 
public static final String DEST  = "results/chapter2/CA_Commercial_Construction_signed%s.pdf"; 

public void sign(String src, String dest, Certificate[] chain, PrivateKey pk, String digestAlgorithm, String provider, CryptoStandard subfilter, String reason, String location) 
     throws GeneralSecurityException, IOException, DocumentException { 
    // Creating the reader and the stamper 
    PdfReader reader = new PdfReader(src); 
    FileOutputStream os = new FileOutputStream(dest); 
    PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0'); 
    // Creating the appearance 
    PdfSignatureAppearance appearance = stamper.getSignatureAppearance(); 
    appearance.setReason(reason); 
    appearance.setLocation(location); 
    appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig"); 
    // Creating the signature 
    ExternalDigest digest = new BouncyCastleDigest(); 
    ExternalSignature signature = new PrivateKeySignature(pk, digestAlgorithm, provider); 
    MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, subfilter); 
} 

public static void main(String[] args) throws GeneralSecurityException, IOException, DocumentException { 
    BouncyCastleProvider provider = new BouncyCastleProvider(); 
    Security.addProvider(provider); 
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
    ks.load(new FileInputStream(KEYSTORE), PASSWORD); 
    String alias = (String) ks.aliases().nextElement(); 
    PrivateKey pk = (PrivateKey) ks.getKey(alias, PASSWORD); 
    Certificate[] chain = ks.getCertificateChain(alias); 
    C2_01_SignHelloWorld app = new C2_01_SignHelloWorld(); 
    app.sign(SRC, String.format(DEST, 1), chain, pk, DigestAlgorithms.SHA256, provider.getName(), CryptoStandard.CMS, "Signed for Testing", "Universe"); 
    app.sign(SRC, String.format(DEST, 2), chain, pk, DigestAlgorithms.SHA512, provider.getName(), CryptoStandard.CMS, "Test 2", "Universe"); 
    app.sign(SRC, String.format(DEST, 3), chain, pk, DigestAlgorithms.SHA256, provider.getName(), CryptoStandard.CADES, "Test 3", "Universe"); 
    //app.sign(SRC, String.format(DEST, 4), chain, pk, DigestAlgorithms.RIPEMD160, provider.getName(), CryptoStandard.CADES, "Test 4", "Ghent"); 
}} 

私はkeytoolを使用して独自のキーストアを設定が、私はPDFを開いたときとマーク証明書が信頼できると判断されましたが、私はまだエラーが発生します - 「文書に変更があったか、またはと署名してから壊れました。私は上記のプログラムから生成したこのPDFリンクから見ることができます:http://pasteboard.co/9hJX1Hv.png

+0

完全なスタックトレースを追加してください。 – Jens

+0

@Jens、done。リンク先はhttp://pasteboard.co/9hJX1Hv.pngです。また、私の編集を読む – JackSparrow

+0

あなたのコードと分析のためにキーで作成されたサンプルPDFを共有してください。 – mkl

答えて

0

DigestAlgorithmをSHA1に変更しました。「署名済みのため、ドキュメントが変更または破損しました」というエラーはなくなりました。以下の完全な貼り付け:

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.security.GeneralSecurityException; 
import java.security.KeyStore; 
import java.security.PrivateKey; 
import java.security.Security; 
import java.security.cert.Certificate; 

import org.bouncycastle.jce.provider.BouncyCastleProvider; 

import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.Rectangle; 
import com.itextpdf.text.pdf.PdfReader; 
import com.itextpdf.text.pdf.PdfSignatureAppearance; 
import com.itextpdf.text.pdf.PdfStamper; 
import com.itextpdf.text.pdf.security.BouncyCastleDigest; 
import com.itextpdf.text.pdf.security.DigestAlgorithms; 
import com.itextpdf.text.pdf.security.ExternalDigest; 
import com.itextpdf.text.pdf.security.ExternalSignature; 
import com.itextpdf.text.pdf.security.MakeSignature; 
import com.itextpdf.text.pdf.security.MakeSignature.CryptoStandard; 
import com.itextpdf.text.pdf.security.PrivateKeySignature; 

public class C2_01_SignHelloWorld { 

public static final String KEYSTORE = "src/main/resources/ks"; 
public static final char[] PASSWORD = "password".toCharArray(); 
public static final String SRC  = "src/main/resources/CA_Commercial_Construction.pdf"; 
public static final String DEST  = "results/chapter2/CA_Commercial_Construction_signed%s.pdf"; 

public void sign(String src, String dest, Certificate[] chain, PrivateKey pk, String digestAlgorithm, String provider, CryptoStandard subfilter, String reason, String location) 
     throws GeneralSecurityException, IOException, DocumentException { 
    // Creating the reader and the stamper 
    PdfReader reader = new PdfReader(src); 
    FileOutputStream os = new FileOutputStream(dest); 
    PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0'); 
    // Creating the appearance 
    PdfSignatureAppearance appearance = stamper.getSignatureAppearance(); 
    appearance.setReason(reason); 
    appearance.setLocation(location); 
    appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig"); 
    // Creating the signature 
    ExternalDigest digest = new BouncyCastleDigest(); 
    ExternalSignature signature = new PrivateKeySignature(pk, digestAlgorithm, provider); 
    MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, subfilter); 
} 

public static void main(String[] args) throws GeneralSecurityException, IOException, DocumentException { 
    BouncyCastleProvider provider = new BouncyCastleProvider(); 
    Security.addProvider(provider); 
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
    ks.load(new FileInputStream(KEYSTORE), PASSWORD); 
    String alias = (String) ks.aliases().nextElement(); 
    PrivateKey pk = (PrivateKey) ks.getKey(alias, PASSWORD); 
    Certificate[] chain = ks.getCertificateChain(alias); 
    C2_01_SignHelloWorld app = new C2_01_SignHelloWorld(); 
    app.sign(SRC, String.format(DEST, 1), chain, pk, DigestAlgorithms.SHA1, provider.getName(), CryptoStandard.CADES, "Signed for Testing", "Universe"); // only change done was in this line to resolve this problem 

}} 
+1

この10年で署名のためにSHA1を使って新しいソフトウェアを書きたいとは思わないでしょうか? – mkl

+0

私には何がありますか?現在のiText(5.5.9)にSHA256のバグがあると判断するのは安全ですか? – JackSparrow

+1

*現在のiText(5.5.9)にSHA256 *のバグがあります。* - いいえ、私はあなたに(あなたの質問へのコメントで)そのエラーのあるサンプルPDFを分析のために尋ねました。この問題は、キーストアまたはソースドキュメントの性質によるものでもあります。 – mkl

関連する問題