通过 itext7 库/方法使用带密码的 .pfx 文件获取/读取 PDF 加密的公共证书

如何解决通过 itext7 库/方法使用带密码的 .pfx 文件获取/读取 PDF 加密的公共证书

我有我正在使用的 iText7 函数

现在,我正在尝试使用 .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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?