跳转到内容

XQuery/数字签名

来自维基教科书,开放的书籍,开放的世界

您想要验证发送给您的文档是否未被修改。

我们将使用 W3C 数字签名标准。我们将使用标准 Java 函数来签署和验证文档的签名。

警告:该程序尚不可用

创建本地密钥库

[编辑 | 编辑源代码]

要使用该函数,您需要创建一个本地密钥库来存储您的信息。在生产系统中,密钥库存储在内部服务器上,但在本示例中,我们将将其存储在 eXist 数据库中作为二进制文件。

以下 shell 命令显示了如何使用 Java JRE 附带的 keytool 程序生成密钥库文件

  /usr/java/bin/keytool -genkeypair -dname "cn=Test Certificate, ou=MyDivision, o=MyCompany, c=US"
     -alias eXist -keypass kpi135 -keystore /tmp/keystore.pem -storepass ab987c -
     validity 180

运行此文件后,将 /tmp/keystore.pem 文件放入您的文件系统 /db/test/dig-sig/keystore.pem 中

添加 XQuery 函数包装器模块

[编辑 | 编辑源代码]

我们将向 $EXIST_HOME/lib/extensions 区域添加一个自定义 jar 文件,称为 x-krypt.jar。加载此文件后,我们需要将以下行添加到 $EXIST_HOME/conf.xml 的 xquery/builtin-modules 区域(大约第 780 行)

     <module class="ro.kuberam.xcrypt.XcryptModule" 
              uri="http://kuberam.ro/x-crypt" />

向文件添加数字签名

[编辑 | 编辑源代码]

重新启动服务器后,可以执行以下操作

xquery version "1.0";

let $keystore-file-path := '/db/test/dig-sig/keystore.txt'

return
if ( not(util:binary-doc-available($keystore-file-path)) )
   then
   <error><message>Keystore File {$keystore-file-path} Not Available</message></error>
   else

let $doc := <data><a>1</a><b>7</b><c/><c/></data>
let $certificate-details :=
    <digital-certificate>
        <keystore-type>JKS</keystore-type>
        <keystore-name>{$keystore-file-path}</keystore-name>
        <keystore-password>ab987c</keystore-password>
        <key-alias>eXist</key-alias>
        <private-key-password>kpi135</private-key-password>
    </digital-certificate>
   
let $signed-doc := x-crypt:generate-signature($doc, "inclusive", "", "DSA_SHA1", "ds", "enveloped", $certificate-details ) 

return
<results>
  <doc>{$doc}</doc>
  <keystore-file-path>{$keystore-file-path}</keystore-file-path>
</results>

验证数字签名

[编辑 | 编辑源代码]

用于签署 XML 文档的相同过程可用于验证其签名。

华夏公益教科书