लक्ष्य एक ऐसा वेब एप्लिकेशन है जो उपयोगकर्ता के पीसी पर स्थापित C# एप्लिकेशन के साथ जानकारी का आदान-प्रदान करता है। क्लाइंट एप्लिकेशन वेबसाईट सर्वर है और ब्राउज़र वेबसाईट क्लाइंट है।वेबसॉकेट सुरक्षित कनेक्शन स्वयं हस्ताक्षरित प्रमाणपत्र
अंत में उपयोगकर्ता के ब्राउज़र में वेबसाईट क्लाइंट कोणीय के माध्यम से लगातार बनाया जाता है और एप्लिकेशन पीसी पर चल रहा है और कुछ चीजें कर रहा है।
सी # लाइब्रेरी का उपयोग WebSocket-Sharp है। Websocket क्लाइंट सामान्य जावास्क्रिप्ट है।
स्पष्ट रूप से यह कनेक्शन केवल स्थानीय होता है ताकि ग्राहक लोकलहोस्ट से जुड़ सके। चूंकि वेबसाइट HTTPS के माध्यम से सुरक्षित है क्योंकि वेबस्केट को भी सुरक्षित किया जाना है। इस उद्देश्य के लिए सी # एप्लिकेशन शुरू होने पर प्रमाण पत्र बनाता है (यह वास्तव में परीक्षण उद्देश्यों के लिए है)।
कनेक्शन काम नहीं करता है क्योंकि प्रमाणपत्र अविश्वसनीय है। क्लाइंट के लिए सभी सर्वर चेक अक्षम हैं लेकिन कनेक्शन स्थापित नहीं होगा।
इस भाग सर्वर
_server = new WebSocketServer($"wss://localhost:4649")
{
SslConfiguration =
{
ServerCertificate = Utils.Certificate.CreateSelfSignedCert(),
ClientCertificateRequired = false,
CheckCertificateRevocation = false,
ClientCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true
}
};
_server.AddWebSocketService<CommandsBehaviour>("/commands");
_server.AddWebSocketService<NotificationsBehaviour>("/notifications");
_server.Start();
बनाई गई है जहां इस तरह के प्रमाण पत्र BouncyCastle
private static AsymmetricKeyParameter CreatePrivateKey(string subjectName = "CN=root")
{
const int keyStrength = 2048;
// Generating Random Numbers
var randomGenerator = new CryptoApiRandomGenerator();
var random = new SecureRandom(randomGenerator);
// The Certificate Generator
var certificateGenerator = new X509V3CertificateGenerator();
// Serial Number
var serialNumber = BigIntegers.CreateRandomInRange(BigInteger.One, BigInteger.ValueOf(long.MaxValue), random);
certificateGenerator.SetSerialNumber(serialNumber);
// Issuer and Subject Name
var subjectDn = new X509Name(subjectName);
var issuerDn = subjectDn;
certificateGenerator.SetIssuerDN(issuerDn);
certificateGenerator.SetSubjectDN(subjectDn);
// Valid For
var notBefore = DateTime.UtcNow.Date;
var notAfter = notBefore.AddYears(70);
certificateGenerator.SetNotBefore(notBefore);
certificateGenerator.SetNotAfter(notAfter);
// Subject Public Key
var keyGenerationParameters = new KeyGenerationParameters(random, keyStrength);
var keyPairGenerator = new RsaKeyPairGenerator();
keyPairGenerator.Init(keyGenerationParameters);
var subjectKeyPair = keyPairGenerator.GenerateKeyPair();
return subjectKeyPair.Private;
}
public static X509Certificate2 CreateSelfSignedCert(string subjectName = "CN=localhost", string issuerName = "CN=root")
{
const int keyStrength = 2048;
var issuerPrivKey = CreatePrivateKey();
// Generating Random Numbers
var randomGenerator = new CryptoApiRandomGenerator();
var random = new SecureRandom(randomGenerator);
ISignatureFactory signatureFactory = new Asn1SignatureFactory("SHA512WITHRSA", issuerPrivKey, random);
// The Certificate Generator
var certificateGenerator = new X509V3CertificateGenerator();
certificateGenerator.AddExtension(X509Extensions.SubjectAlternativeName, false, new GeneralNames(new GeneralName[] { new GeneralName(GeneralName.DnsName, "localhost"), new GeneralName(GeneralName.DnsName, "127.0.0.1") }));
certificateGenerator.AddExtension(X509Extensions.ExtendedKeyUsage, true, new ExtendedKeyUsage((new ArrayList() { new DerObjectIdentifier("1.3.6.1.5.5.7.3.1") })));
// Serial Number
var serialNumber = BigIntegers.CreateRandomInRange(BigInteger.One, BigInteger.ValueOf(Int64.MaxValue), random);
certificateGenerator.SetSerialNumber(serialNumber);
// Signature Algorithm
//const string signatureAlgorithm = "SHA512WITHRSA";
//certificateGenerator.SetSignatureAlgorithm(signatureAlgorithm);
// Issuer and Subject Name
var subjectDn = new X509Name(subjectName);
var issuerDn = new X509Name(issuerName);
certificateGenerator.SetIssuerDN(issuerDn);
certificateGenerator.SetSubjectDN(subjectDn);
// Valid For
var notBefore = DateTime.UtcNow.Date;
var notAfter = notBefore.AddYears(70);
certificateGenerator.SetNotBefore(notBefore);
certificateGenerator.SetNotAfter(notAfter);
// Subject Public Key
var keyGenerationParameters = new KeyGenerationParameters(random, keyStrength);
var keyPairGenerator = new RsaKeyPairGenerator();
keyPairGenerator.Init(keyGenerationParameters);
var subjectKeyPair = keyPairGenerator.GenerateKeyPair();
certificateGenerator.SetPublicKey(subjectKeyPair.Public);
// self sign certificate
var certificate = certificateGenerator.Generate(signatureFactory);
// corresponding private key
var info = PrivateKeyInfoFactory.CreatePrivateKeyInfo(subjectKeyPair.Private);
// merge into X509Certificate2
var x509 = new X509Certificate2(certificate.GetEncoded());
var seq = (Asn1Sequence)Asn1Object.FromByteArray(info.ParsePrivateKey().GetDerEncoded());
if (seq.Count != 9)
{
throw new PemException("malformed sequence in RSA private key");
}
var rsa = RsaPrivateKeyStructure.GetInstance(seq); //new RsaPrivateKeyStructure(seq);
var rsaparams = new RsaPrivateCrtKeyParameters(
rsa.Modulus, rsa.PublicExponent, rsa.PrivateExponent, rsa.Prime1, rsa.Prime2, rsa.Exponent1, rsa.Exponent2, rsa.Coefficient);
x509.PrivateKey = DotNetUtilities.ToRSA(rsaparams);
return x509;
}
यह व्यवहार तार्किक है, हालांकि यह प्रमाणपत्र की जांच shouldn 'के रूप में अजीब बात है के साथ बनाया जाता है है टी स्थानीय रूप से प्रदर्शन किया जाना चाहिए। क्या इस समस्या को बाईपास करने की संभावना है? मैंने पहले से ही विश्वसनीय कर्ट को जारीकर्ता प्रमाण पत्र स्थापित करने के बारे में सोचा है लेकिन यह एक इष्टतम समाधान नहीं है।
'प्रमाण पत्र स्थानीय रूप से नहीं किया जाना चाहिए' हू? – SLaks
@SLaks मेरा मतलब है कि जब कनेक्शन स्थानीयहोस्ट – chris579