随着 Teigha 4.3.1 新版本的发布,您可以为 .dwg 文件附加数字签名并验证 .dwg 文件的数字签名。数字签名表明文件来源以及创建数字签名时文件的状态,而验证则确认此信息。
附加数字签名
要附加数字签名,您应该拥有由认可供应商颁发的数字证书(数字 ID)。证书颁发机构 (CA) 通常会颁发 PFX 文件和密码,这是在证书存储中注册所必需的。此外,您还需要安装根 CA 证书作为受信任的证书。
例如,在 Microsoft Windows 上,您可以使用 Internet Explorer 中提供的证书导入向导(工具\Internet 选项\内容\证书)来导入证书。
在存储中注册证书后,您可以使用 Teigha 签署 .dwg 文件。
要在保存图形时对其进行签名,首先将相应的参数设置为 OdSecurityParams,然后使用 OdDbDatabase::setSecurityParams() 方法将参数传递给要保存的数据库。例如:
OdSecurityParams secParam;
secParam.sCertSubject = certSubject;
secParam.sCertIssuer = certIssuer;
secParam.sCertSerialNum = certSerialNum;
secParam.nFlags = SECURITYPARAMS_SIGN_DATA;
pDb->setSecurityParams(secParam);
紧接着,打开一个目标流进行读写:
OdStreamBufPtr pTargetFileBuf = createFile(m_drawingFilePath, (Oda::FileAccessMode)(Oda::kFileRead | Oda::kFileWrite), Oda::kShareDenyReadWrite, Oda::kCreateAlways);
然后调用 OdDbDatabase::writeFile() 方法:
pDb->writeFile(pTargetFileBuf, OdDb::kDwg, OdDb::kDHL_CURRENT);
您为 OdSecurityParams 字段设置的证书参数必须与可以构建完整证书链(从您的证书到根证书的链)的证书相对应。
要获取合适证书的参数,您的自定义应用程序应使用依赖于系统的机制访问证书存储。有关详细信息,请参阅 OdDwgSignEx 示例应用程序的相关源代码 (Drawing\Examples\win\OdDwgSignEx)。
验证数字签名
要验证附加到 .dwg 文件的数字签名,请使用 Teigha API 中的相应全局函数:
TOOLKIT_EXPORT OdResult validateDrawingSignature(const OdString& drawingFullPath, OdString& verifResultMsg, OdSignatureDescriptionData* pSignDesc);
文件的完整路径应作为第一个参数传递给函数。
该函数返回验证结果消息 (verifResultMsg 字符串),并填充由作为参数传递的地址 (pSignDesc) 定位的 OdSignatureDescriptionData 结构。
此外,它返回以下 OdResult 值之一:
- 如果验证过程完成且没有错误,并且 verifResultMsg 包含验证结果,则为 eOk。
- 如果无法打开 drawingFullPath 指定的图形文件,则为 eCantOpenFile。
- 如果图形文件版本无法执行验证过程,则为 eInvalidInput。
调用如下:
OdString verifResultMsg;
OdSignatureDescriptionData sigData;
OdResult res;
res = validateDrawingSignature(m_drawingFilePath, verifResultMsg, &sigData);
有关详细信息,请参阅 OdDwgSignEx 示例应用程序的相关源代码 (Drawing\Examples\win\OdDwgSignEx)。
OdDwgSignEx 示例应用程序和相关源代码
Teigha 提供了 OdDwgSignEx 示例应用程序,可在 Windows 平台上使用数字签名 API。
该示例使用 OdCrypt 接口的 Windows 实现 (OdWinNTCrypt) 来操作数字签名信息(请参阅扩展源代码:Kernel\Extensions\win\Crypt)。
要启动示例,首先按照上述说明在存储中导入您的证书。
下图说明了如何使用 OdDwgSignEx 示例为 .dwg 文件附加和验证数字签名。