首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CAPICOM和X509

CAPICOM和X509
EN

Stack Overflow用户
提问于 2016-05-04 07:41:56
回答 1查看 476关注 0票数 0

我有一张网上申请表。其目的是从web表单创建一个xml数据,并使用用户usb证书对其进行签名。我正在使用CAPICOM.store成功地打开所有的用户证书。当我点击一个我想要的,我导出它。之后,我将在X509Cetificate2中导入选定的证书来对xml进行签名。但是在我的代码中,我在signedXml.ComputeSignature()行中得到了错误,消息是‘签名键没有丢失。’请提供任何帮助或建议来解决这个问题。

代码语言:javascript
复制
    Function SignXML(uppXML As String) As String

    Dim bResult As Boolean = False
    Dim pCertContext As IntPtr = IntPtr.Zero
    Dim doc As XmlDocument = Nothing
    Dim signedXml As SignedXml = Nothing
    Dim reference As Reference = Nothing
    Dim trns As XmlDsigC14NTransform = Nothing
    Dim env As XmlDsigEnvelopedSignatureTransform = Nothing
    Dim keyInfo As KeyInfo = Nothing
    Dim xmlDigitalSignature As XmlElement = Nothing 

    Dim hideFiledCapicom As String = Replace(txtCapicom.Text, " ", "+")
    Dim certificate As New X509Certificate2(Convert.FromBase64String(hideFiledCapicom)) 
        Dim key As AsymmetricAlgorithm = certificate.PrivateKey

        doc = New XmlDocument
        doc.PreserveWhitespace = True
        doc.LoadXml(uppXML)

        signedXml = New SignedXml(doc)
        signedXml.SigningKey = key

        reference = New Reference
        reference.Uri = ""

        trns = New XmlDsigC14NTransform

        reference.AddTransform(trns)

        env = New XmlDsigEnvelopedSignatureTransform

        reference.AddTransform(env)

        signedXml.AddReference(reference)

        keyInfo = New KeyInfo()
        keyInfo.AddClause(New KeyInfoX509Data(certificate))

        signedXml.KeyInfo = keyInfo
        signedXml.ComputeSignature()

        xmlDigitalSignature = signedXml.GetXml()

        doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, True))

        If TypeOf doc.FirstChild Is XmlDeclaration Then
            doc.RemoveChild(doc.FirstChild)
        End If

        uppXML = doc.OuterXml

    Return uppXML

End Function
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-27 07:26:55

我找到了解决办法。

在JavaScript中,我使用CAPICOM选择和导出证书,并且从证书中获取私钥并将其放入隐藏字段。

代码语言:javascript
复制
 var privateKey = certificates.Item(1).PrivateKey.KeySpec

 var exportKey = document.getElementById("<%=hideFieldKey.ClientID%>");
     exportKey = privateKey
     document.getElementById('HiddenKey').value = exportKey;

在我的vb代码中,我使用CspParameters()获取私钥,使用RSACryptoServiceProvider()进一步签名xml。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37021435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档