1

Ich habe ein X509Certificate2 mit einem privaten Schlüssel nicht exportierbare aus den Windows-Speichern mit diesem Code:X509Certificate2 von Speicher mit einem privaten Schlüssel

X509Certificate2 oCertificato = null; 

X509Store my = new X509Store(StoreName.My, StoreLocation.CurrentUser); 
my.Open(OpenFlags.ReadOnly); 
System.Security.Cryptography.RSACryptoServiceProvider csp = null; 
foreach (X509Certificate2 cert in my.Certificates) 
{ 
    if (cert.SerialNumber.Trim() == cSerial) 
    { 
     csp = (System.Security.Cryptography.RSACryptoServiceProvider)cert.PrivateKey; 
     oCertificato = cert; 
     break; 
    } 
} 

Wenn ich das Zertifikat mit einem Web-Dienst von Windows verwenden, fragen Sie die privaten Schlüssel. Frage: Wie kann ich den privaten Schlüssel zum Zertifikat senden?

Grüße.


EDIT: Dies ist die Funktion mit der Verbindung als Web-Service:

string cEndPoint = Leo.myendpoint(); 

ServicePointManager.ServerCertificateValidationCallback = CertificateHandler; 

datiOperatore DataOp = Leo.OperatorData();//Operator data request from system (it's ok) 
datiApplicativo DataApp = Leo.AppData();//program data request from system (it's ok) 

var b = new CustomBinding(); 
var sec = new AsymmetricSecurityBindingElement(
    new X509SecurityTokenParameters(X509KeyIdentifierClauseType.Any, SecurityTokenInclusionMode.Never), 
    new X509SecurityTokenParameters(X509KeyIdentifierClauseType.Any, SecurityTokenInclusionMode.AlwaysToRecipient)); 
sec.MessageSecurityVersion = MessageSecurityVersion.WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10; 
sec.SecurityHeaderLayout = SecurityHeaderLayout.Strict; 
sec.IncludeTimestamp = true; 
sec.SetKeyDerivation(false); 
sec.KeyEntropyMode = System.ServiceModel.Security.SecurityKeyEntropyMode.ServerEntropy; 
sec.EnableUnsecuredResponse = true; 

b.Elements.Add(sec); 

b.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8)); 
b.Elements.Add(new HttpsTransportBindingElement()); 

EndpointAddress ea = new EndpointAddress(cEndPoint); 

oClient = new CVPClient(b, ea); 

X509Certificate2 certSigned = Leo.GetSignedCert();//HERE IS THE REQUEST OF PRIVATE KEY 
X509Certificate2 certUnsigned = Leo.GetUnSignedCertificate(); 

oClient.ClientCredentials.ClientCertificate.Certificate = certSigned; 
oClient.ClientCredentials.ServiceCertificate.DefaultCertificate = certUnsigned; 
+1

was meinst du "Wenn ich das benutze Zertifikat mit einem Webdienst Windows fragt den privaten Schlüssel "- In welchem ​​Code rufen Sie diesen Webdienst an? –

+0

* "Wie kann ich den privaten Schlüssel zum Zertifikat senden?" * - Sie nicht Der private Schlüssel bleibt im Geschäft geschützt. Sie senden nur das Client-Zertifikat, um den Client zu identifizieren. Der Client und der Server verwenden den öffentlichen Schlüssel des anderen Benutzers im entsprechenden Zertifikat, um einen sicheren Kanal zu erstellen. – jww

Antwort

0

Lösung ich das Problem:

string cPin = "12345"; 
System.Security.SecureString SecurePIN = new System.Security.SecureString(); 
foreach (char ch in cPin) 
{ SecurePIN.AppendChar(ch); } 
var rsa = (RSACryptoServiceProvider)certSigned.PrivateKey; 
string ContinerName = rsa.CspKeyContainerInfo.KeyContainerName; 
string CspName = rsa.CspKeyContainerInfo.ProviderName; 
int CspType = rsa.CspKeyContainerInfo.ProviderType; 
CspParameters csp = new CspParameters(CspType, CspName, ContinerName, new System.Security.AccessControl.CryptoKeySecurity(), SecurePIN); 
RSACryptoServiceProvider CSP = new RSACryptoServiceProvider(csp); 

Ich hoffe, es ist nützlich, andere

Verwandte Themen