XQuery/数字签名
外观
< 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 中
我们将向 $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 文档的相同过程可用于验证其签名。