C# 数字签名分离期间无法访问关闭流错误
请帮我解决这个问题。显示错误显示无法访问关闭的流。 我使用的内存流从RLDC和水印首先然后数字签名的过程开始 我认为最后6行有问题,或者我没有正确关闭变量 我做错了什么C# 数字签名分离期间无法访问关闭流错误,c#,asp.net,pdf,itext,C#,Asp.net,Pdf,Itext,请帮我解决这个问题。显示错误显示无法访问关闭的流。 我使用的内存流从RLDC和水印首先然后数字签名的过程开始 我认为最后6行有问题,或者我没有正确关闭变量 我做错了什么 public static byte[] AddWatermark(byte[] bytes, BaseFont baseFont, string watermarkText) { using (var ms = new MemoryStream(10 * 1024)) {
public static byte[] AddWatermark(byte[] bytes, BaseFont baseFont, string watermarkText)
{
using (var ms = new MemoryStream(10 * 1024))
{
using (var reader = new PdfReader(bytes))
using (var stamper = new PdfStamper(reader, ms))
{
var pages = reader.NumberOfPages;
for (var i = 1; i <= pages; i++)
{
var dc = stamper.GetOverContent(i);
AddWaterMarkText(dc, watermarkText, baseFont, 100, 45, BaseColor.GRAY, reader.GetPageSizeWithRotation(i));
// Keypair Generator
RsaKeyPairGenerator kpGenerator = new RsaKeyPairGenerator();
kpGenerator.Init(new KeyGenerationParameters(new SecureRandom(), 2048));
// Create a keypair
AsymmetricCipherKeyPair kp = kpGenerator.GenerateKeyPair();
// Certificate Generator
X509V3CertificateGenerator cGenerator = new X509V3CertificateGenerator();
cGenerator.SetSerialNumber(BigInteger.ProbablePrime(120, new Random()));
cGenerator.SetSubjectDN(new X509Name("CN=" + "abc.com"));
cGenerator.SetIssuerDN(new X509Name("CN=" + "Aalok"));
cGenerator.SetNotBefore(DateTime.Now);
cGenerator.SetNotAfter(DateTime.Now.Add(new TimeSpan(365, 0, 0, 0))); // Expire in 1 year
cGenerator.SetSignatureAlgorithm(HashType.SHA256withRSA.ToString()); // See the Appendix Below for info on the hash types supported by Bouncy Castle C#
cGenerator.SetPublicKey(kp.Public); // Only the public key should be used here!
Org.BouncyCastle.X509.X509Certificate cert = cGenerator.Generate(kp.Private); // Create a self-signed cert
byte[] encoded = cert.GetEncoded();
try
{
FileStream outStream = new FileStream("abc.der", FileMode.Create, FileAccess.ReadWrite);
{
outStream.Write(encoded, 0, encoded.Length);
}
}
catch (FileNotFoundException)
{
Console.WriteLine("File not found");
}
// Create the PKCS12 store
Pkcs12Store store = new Pkcs12StoreBuilder().Build();
// Add a Certificate entry
X509CertificateEntry certEntry = new X509CertificateEntry(cert);
store.SetCertificateEntry(cert.SubjectDN.ToString(), certEntry); // use DN as the Alias.
// Add a key entry
AsymmetricKeyEntry keyEntry = new AsymmetricKeyEntry(kp.Private);
store.SetKeyEntry(cert.SubjectDN.ToString() + "_key", keyEntry, new X509CertificateEntry[] { certEntry }); // Note that we only have 1 cert in the 'chain'
// Save to the file system
try
{
var filestream = new FileStream(@"abc.pfx", FileMode.Create, FileAccess.ReadWrite);
{
store.Save(filestream, "123".ToCharArray(), new SecureRandom());
}
}
catch (FileNotFoundException)
{
Console.WriteLine("File not found");
}
String alias = "";
ICollection<Org.BouncyCastle.X509.X509Certificate> chain = new List<Org.BouncyCastle.X509.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).ToList())
{
chain.Add(c.Certificate);
}
RsaPrivateCrtKeyParameters parameters = pk.Key as RsaPrivateCrtKeyParameters;
PdfReader read = new PdfReader(bytes);
// PdfStamper.CreateSignature(read, ms, '\0');
PdfStamper stamp = PdfStamper.CreateSignature(read, ms, '\0');
// Creating the appearance
PdfSignatureAppearance appearance = stamp.SignatureAppearance;
appearance.Reason = "My reason for signing";
appearance.Location = "The middle of nowhere";
// appearance.SignDate = DateTime.Now;
appearance.SetVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig");
// Creating the signature
IExternalSignature pks = new PrivateKeySignature(parameters, DigestAlgorithms.SHA256);
MakeSignature.SignDetached(appearance, pks, chain, null, null, null, 0, CryptoStandard.CMS);
stamp.Close();
read.Close();
break;
}
//stamper.Close();
reader.Close();
ms.Close();
}
return ms.ToArray();
}
}
publicstaticbyte[]AddWatermark(byte[]bytes,BaseFont,BaseFont,stringwatermarktext)
{
使用(var ms=新内存流(10*1024))
{
使用(变量读取器=新PdfReader(字节))
使用(var压模=新PdfStamper(读卡器,ms))
{
var pages=reader.NumberOfPages;
对于(var i=1;i哪一行代码引发错误?对于使用
ed(例如,ms
)的变量,不需要调用Close
)。每当调用stamper.Close()函数时,它直接捕获错误“无法访问关闭的流”进入我的父函数。@mjwills好的,让我详细解释一下。stamp.Close()上面的6行代码;如果被注释,则不存在此类问题,并且生成的pdf没有数字签名。但是,如果我取消注释这6行,则会发生此错误。在上面的代码中,我在最后几行中编写的所有Close语句都存在,因为我之前已经测试过,在发布之前忘记从代码中删除。主要问题是6 l在中使用(var stamper=new PdfStamper(reader,ms))
块创建另一个stamperPdfStamper stamp=PdfStamper.CreateSignature(read,ms,“\0”);
写入同一目标内存流ms
。因此,即使该代码没有抛出错误,您也会在ms
中得到两个结果文件的大杂烩。