[返回博客](/cn/blog) # 为 .dwg 文件附加和验证数字签名

Iakov Shamrai 九月 07, 2017 [\#getting started](/cn/blog/tag/getting-started) [\#Example](/cn/blog/tag/example)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

随着 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 文件附加和验证数字签名。

![image1](/files/inline-images/image001_12.png)![image2](/files/inline-images/image002_6.png)![image3](/files/inline-images/image003_6.png)

## 今天就开始行动

**免费试用 ODA 软件 60 天。  
无风险，无需信用卡。**

[免费试用](https://www.opendesign.com/cn/free-trial)
