0

私はウェブ申請フォームを持っています。目的は、Web フォームからデータの xml を作成し、ユーザーの USB 証明書で署名することです。CAPICOM.store を使用して、すべてのユーザー証明書を正常に開きます。必要なものをクリックすると、エクスポートされました。その後、選択した証明書を X509Cetificate2 にインポートして xml に署名します。しかし、私のコードでは、signedXml.ComputeSignature() 行でエラーが発生し、メッセージは「署名キーが読み込まれていません」です。これを修正するためのヘルプまたは提案をお願いします。

    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
4

1 に答える 1

0

これに対する解決策を見つけました。

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 ドキュメントに署名します。

于 2016-05-27T07:26:55.430 に答える