如何解决通过 itext7 库/方法使用带密码的 .pfx 文件获取/读取 PDF 加密的公共证书
现在,我正在尝试使用 .pfx 格式的证书和密码来加密我的 PDF 文件。
问题是,该函数无法读取 .pfx,因为它没有提供如下所示的密码
using System.IO;
using iText.Kernel.Pdf;
using Org.BouncyCastle.X509;
namespace iText.Samples.SandBox.Security
{
public class EncryptWithCertificate
{
public static readonly String DEST = "results/sandBox/security/encrypt_with_certificate.pdf";
public static readonly String SRC = "../../../resources/pdfs/hello.pdf";
public static readonly String PUBLIC = "../../../resources/encryption/test.cer";
public static void Main(String[] args)
{
FileInfo file = new FileInfo(DEST);
file.Directory.Create();
new EncryptWithCertificate().ManipulatePdf(DEST);
}
public X509Certificate GetPublicCertificate(String path)
{
using (FileStream stream = File.Open(path,FileMode.Open))
{
X509CertificateParser parser = new X509CertificateParser();
X509Certificate readCertificate = parser.ReadCertificate(stream);
return readCertificate;
}
}
protected void ManipulatePdf(String dest)
{
// The file created by this example can not be opened,unless
// you import the private key stored in test.p12 in your certificate store.
// The password for the p12 file is kspass.
X509Certificate cert = GetPublicCertificate(PUBLIC);
PdfDocument document = new PdfDocument(new PdfReader(SRC),new PdfWriter(dest,new WriterProperties().SetPublicKeyEncryption(
new[] {cert},new[] {EncryptionConstants.ALLOW_PRINTING},EncryptionConstants.ENCRYPTION_AES_256)));
document.Close();
}
}
}
如果我尝试加载一个普通的 .cer 文件,它会正常加载 GetPublicCertificate
。没有问题。但我正在尝试使用 .pfx 文件对其进行加密,因为 adobe acrobat 只能使用 .p12/.pkf 格式注册数字 ID,并且该函数确实会引发错误。
Org.BouncyCastle.Security.Certificates.CertificateException
HResult=0x80131500
Message=Failed to read certificate
Inner Exception 1:
ArgumentException: UnkNown object in GetInstance: Org.BouncyCastle.Asn1.DerInteger
Parameter name: obj
我希望使用 cert 加密 pdf,因为可以根据我设置的内容将证书设置为随时过期,并且用户只能根据证书过期查看 PDF 文件。
提前致谢。
解决方法
根据您的原始帖子,您的意图是:
我希望使用 cert 加密 pdf,因为可以根据我设置的内容将证书设置为随时过期,并且用户只能根据证书过期查看 PDF 文件。
基本上,您希望向授权用户授予对 PDF 的限时访问权限。您尝试在代码示例中构建的解决方案不能解决问题。数据加密的证书有效性无关紧要,因为在解密期间不检查证书有效性。其实连证书都不需要,只要有私钥解密数据就够了。换句话说,基于证书的加密等同于基于密码的加密。添加什么证书 - 一种更简单的方法来定位解密密钥(秘密),仅此而已。
此外,一旦数据被解密,客户端可以以未加密的形式保存数据,因此您的限制是无用的。即使您尝试在 JavaScript 或本地其他任何内容中设置时间限制(并且 JavaScript 仅在本地执行),这也不是解决方案。只要客户端可以操作设备上的日期/时间,客户端总是可以设置所需的日期/时间来违反您的限制。
如果不发明一个第 3 方实体来决定是否允许请求的操作、应用必要的限制并最大限度地减少数据以未加密形式泄漏的可能性(仅最小化,而不是阻止),您的问题就无法解决。此类功能在 Digital Rights Management (DRM) 或权限管理服务 (RMS) 中实现,您需要围绕这些工具构建解决方案,而不是尝试将它们集成到您的解决方案中。有很多供应商提供 DRM/RMS 解决方案,您可以研究并利用他们的功能来构建满足您要求的解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。