2014-11-19 2 views
0

동적으로 PDF 파일을 작성해야하므로 PDF 편집을 위해 MemoryStream 및 iTextSharp를 사용합니다. 그러나 PDF 파일을 브라우저에 보내기 전에 디지털 서명을하고 싶습니다. 필자는 샘플 프로젝트에서 iTextSharp에 PDFSigner 클래스가 있다는 것을 보았습니다.이 클래스는 주로 모든 작업을 수행합니다. 내가 그것을 보았 듯이, 그것은 다음과 같이 작동 iTextSharp 기호 PDF를 MemoryStream에서 생성했습니다.

PDFSigner signer = new PDFSigner(inputFileName, outputFileName, certificate, metaData); 
signer.Sign(......) 

그러나 MemoryStream을 가진

, 나는 하나의 입력 또는 출력에 대한 실제 파일 이름을 제공 할 수 없습니다. 내 코드는 다음과 같습니다 :

MemoryStream memoryStream = new MemoryStream(); 
var document = new Document(iTextSharp.text.PageSize.LETTER, 40, 40, 60, 40); 
PdfWriter.GetInstance(document, memoryStream).CloseStream = false; 

document.Open(); 
PopulatePDF(document, someId); 
document.Close(); 

byte[] byteArray = memoryStream.ToArray(); 

memoryStream.Write(byteArray, 0, byteArray.Length); 
memoryStream.Position = 0; 

return new FileStreamResult(memoryStream, "application/pdf"); 

내 질문 PDFSigner는 문자열 소요주고, 나는 문서에 서명하는 PDFSigner 객체를 사용하는 방법입니다 - 인수로 파일 이름을.

+2

내가 틀릴 수도 있지만 iText에 실제로'PDFSigner'라는 클래스가 있다고 생각하지 않습니다. 적어도 필자가 찾을 수있는 것은 없습니다. 온라인 자습서를 통해이 코드를 찾았습니까? 또한 사용중인 iTextSharp의 버전은 무엇입니까? –

+0

iTextSharp 5.5.3을 사용하고 있으며 위 코드는이 프로젝트에서 가져온 것입니다 (작동하는 PDFSigner 클래스를 사용하고 서명을 사용합니다) http://www.codeproject.com/Articles/14488/E-signing- PDF 문서와 iTextSharp – byby9999

답변

0

Chris Haas가 설명했듯이 iText에는 PdfSigner이라는 클래스가 없습니다. iText의 비공식 버전을 사용 중일 수 있습니다.이 경우 디지털 서명을 올바르게 적용해야합니다.

digital signatures에 대한 책에서 올바른 디지털 서명에 대해 더 자세히 읽을 수 있습니다.

기본적으로,이 당신이 된 PKCS # 12 키 스토어를 사용하여 서명 줄 방법은 다음과 같습니다

분명히
Pkcs12Store store = new Pkcs12Store(new FileStream(KEYSTORE, FileMode.Open), PASSWORD); 
String alias = ""; 
ICollection<X509Certificate> chain = new List<X509Certificate>(); 
// searching for private key 
foreach (string al in store.Aliases) 
    if (store.IsKeyEntry(al) && store.GetKey(al).Key.IsPrivate) { 
     alias = al; 
     break; 
    } 
AsymmetricKeyEntry pk = store.GetKey(alias); 
foreach (X509CertificateEntry c in store.GetCertificateChain(alias)) 
    chain.Add(c.Certificate); 
RsaPrivateCrtKeyParameters parameters = pk.Key as RsaPrivateCrtKeyParameters; 

PdfReader reader = new PdfReader(src); 
FileStream os = new FileStream(dest, FileMode.Create); 
PdfStamper stamper = PdfStamper.CreateSignature(reader, os, '\0'); 
// Creating the appearance 
PdfSignatureAppearance appearance = stamper.SignatureAppearance; 
appearance.Reason = "My reason for signing"; 
appearance.Location = "The middle of nowhere"; 
appearance.SetVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig"); 
// Creating the signature 
IExternalSignature pks = new PrivateKeySignature(pk, DigestAlgorithms.SHA256); 
MakeSignature.SignDetached(appearance, pks, chain, null, null, null, 0, CryptoStandard.CMS); 

, 당신은 취소 정보를 얻을 어쩌면 타임 스탬프를 허용 구현으로 null 값을 대체 할, 그러나 그것은 당신의 질문이 아닙니다.

귀하의 질문은 : 메모리에만있는 PDF를 제공 할 수 있습니까? 대답은 yes입니다. PdfReader 인스턴스를 만들 때 src 매개 변수는 디스크의 파일 경로 일 수 있지만 MemoryStream에서 가져온 byte[]이 될 수도 있습니다.

+0

감사합니다. 예, 실제로 공식적인 PDFSigner 클래스가 없습니다. 발견 한 프로젝트의 작성자는이 클래스를 도우미로 작성했으며 PdfStamper를 사용했습니다. – byby9999

+0

첫 줄에 KEYSTORE의 입력은 무엇입니까? – Cerveser

+0

@Cerveser 공개 키와 개인 키 쌍이 들어있는 키 저장소 (예 : .p12' 파일) 경로입니다. 개인 키는 개인 키이므로 공유 할 수 없습니다. –

관련 문제