2016-05-04 7 views
0

私はウェブアプリケーションフォームを持っています。目的は、WebフォームからXMLデータを作成し、ユーザーのUSB証明書で署名することです。 すべてのユーザー証明書を正常に開くためにCAPICOM.storeを使用しています。私がそれをエクスポートしたいものをクリックすると。その後、X509Cetificate2で​​選択した証明書をxmlに署名するためにインポートします。しかし私のコードでは、私はラインでエラーが発生しています signedXml.ComputeSignature()とメッセージは '署名キーが読み込まれていません。'これを修正するための助けや提案をお願いします。CAPICOMとX509

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 

答えて

0

解決策が見つかりました。

私はCAPICOMを使用して証明書を選択してエクスポートするJavaScriptでは、証明書から秘密鍵を取得して非表示フィールドに配置しています。私はCspParametersを(使用私のVBのコードで

var privateKey = certificates.Item(1).PrivateKey.KeySpec 

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

)は、XML文書に署名するためにさらに進行する秘密鍵とRSACryptoServiceProvider()を取得します。

関連する問題