2012-05-10 11 views
7

का उपयोग कर प्रमाण पत्र पुनर्प्राप्त करना मैं दूरस्थ सर्वर से प्रमाणपत्र को पुनर्प्राप्त करने के लिए OpenSSL .Net wrapper का उपयोग करना चाहता हूं। अनिवार्य रूप से, मैंOpenSSL .NET

openssl s_client -connect 192.168.254.13:636 -showcerts 

.. और अंतिम परिणाम परिणामों को X509 प्रमाणपत्र में लाएं। क्या यह संभव है, और यदि कोई मुझे सही दिशा में इंगित कर सकता है?

उत्तर

6

मुझे लगता है कि प्रश्न के दो भाग हैं:

  1. कैसे आप सर्वर का सुरक्षा प्रमाणपत्र
  2. पुनः प्राप्त करते हैं आप कैसे पुनः प्राप्त करते प्रमाण पत्र की श्रृंखला

सर्वर का सुरक्षा प्रमाणपत्र आप का उपयोग करने के लिए rertrieve एसएसएलस्ट्रीम जिसका विधियां .NET के अपने SslStream

var serverName = "...; 
var client = new TcpClient(serverName, 443);    

// Create an SSL stream that will close the client's stream. 
using (var sslStream = new SslStream(client.GetStream(),true)) 
{ 
    sslStream.AuthenticateAsClient(serverName);     
    var serverCertificate = sslStream.RemoteCertificate; 
} 
के समान हैं

ऐसा लगता है कि OpenSSL.Net प्रमाणपत्र की श्रृंखला पुनर्प्राप्त नहीं कर सकता है। TheShowcerts पैरामीटर SSL_get_peer_cert_chain फ़ंक्शन का उपयोग करता है जो OpenSSL.NET में लागू नहीं किया गया है।

यदि आप OpenSSL.Net और अंतर्निहित .NET कक्षाओं को मिश्रित करने में कोई फर्क नहीं पड़ता है, तो आप एक OpenSSL.Net प्रमाणपत्र को .NET प्रमाणपत्र में परिवर्तित कर सकते हैं और .NET के X509Chain.Build का उपयोग कर श्रृंखला पुनर्प्राप्त कर सकते हैं। आप .NET प्रमाणपत्रों को .NET प्रमाणपत्र की RawData संपत्ति का उपयोग करके OpenSSL.NET प्रमाणपत्रों में वापस परिवर्तित कर सकते हैं।

var managedCert = new System.Security.Cryptography.X509Certificates.X509Certificate2(serverCertificate.DER); 
var chain = new System.Security.Cryptography.X509Certificates.X509Chain(); 
chain.Build(managedCert); 


foreach (var element in chain.ChainElements) 
{ 
    var raw = element.Certificate.RawData; 
    using (var bio = new BIO(raw)) 
    { 
     var oc = OpenSSL.X509.X509Certificate.FromDER(bio); 
    } 
} 

शायद आप क्या आप बिल्कुल OpenSSL.Net का उपयोग किए बिना कच्चे प्रमाणपत्र डेटा का उपयोग कर करना चाहते हैं नेट के SslStream और X509Certificate2 वस्तु का उपयोग कर सकते हैं।

+0

यह बहुत ही आशाजनक लगता है - धन्यवाद! – KenD

+0

[एसएसएल कनेक्शन के लिए एक विशेष सीए का उपयोग करें] (http://stackoverflow.com/questions/22516450/use-a-particular-ca-for-a-ssl-connection/23180787#23180787) इससे बचेंगे सत्यापन के लिए विंडोज सर्टिफिकेट स्टोर से सीए चिड़ियाघर। हालांकि, श्रृंखला को सत्यापित करने के लिए आपको एक विश्वसनीय सीए प्रदान करना होगा। यदि आप प्रमाण पत्र जारी करने वाले सीए को जानते हैं, तो सैकड़ों के बजाय केवल एक सीए का उपयोग करना सबसे अच्छा है उपलब्ध। – jww

+0

@jww आपका प्रस्ताव एक सुरक्षा जोखिम है जिसे पहले से ही कई बार शोषित किया गया है - हाल ही में हार्टबलेड शोषण के परिणामस्वरूप। सीए प्रमाण पत्र * को पिछले समय समझौता किया गया था और रद्द कर दिया गया था। एक स्थानीय भंडारण का उपयोग सीए के रूप में आपके पास कोई रास्ता नहीं है ओ प्रमाणपत्र प्रमाणित करने या यह जानकर कि इसे निरस्त कर दिया गया है। कोई "सीए चिड़ियाघर" नहीं है, यह प्रमाण पत्र काम करने का तरीका है। –

2

ServicePointManager.ServerCertificateValidationCallback का उपयोग करने का प्रयास करें। यही कारण है कि

http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.servercertificatevalidationcallback.aspx

+0

मेरे लिए कोई अच्छा नहीं है मुझे डर है - मैं गैर-HTTPS सेवाओं से प्रमाण पत्र पुनर्प्राप्त करने के लिए OpenSSL का उपयोग करना चाहता हूं। – KenD

2

देखा सर्वर के X509 प्रमाणपत्र एट के साथ बुलाया जाएगा आदेश s_client करने जैसी ही बनाने के लिए, आप शायद s_client के कोड पर एक नज़र रखना चाहिए।

आप openssl-XYZtar.gz/apps/s_client.c अंदर s_client पा सकते हैं

शायद PEM_write_bio_X509 X509Certificate की "छपाई" करता है:

if (c_showcerts) 
    PEM_write_bio_X509(bio,sk_X509_value(sk,i)); 
} 

लेकिन कनेक्शन हिस्सा भी है ...

ftp://ftp.openssl.org/source/openssl-1.0.1.tar.gz

+0

मैं आशा करता था कि OpenSSL का उपयोग करके इसे करने का कुछ "आसान" तरीका होगा।नेट लेकिन यह दिखाई नहीं देगा :( – KenD

1

एक सीआरएल प्राप्त करने के लिए पहली बार एक cRLDistribu के लिए प्रमाण पत्र जारी करने और उसके प्रमाण पत्र की जांच टियन पॉइंट एक्सटेंशन जिसमें यूआरआई जनरलनाम शामिल है। यह एक्सटेंशन आरएफसी 3280 में परिभाषित किया गया है, और यह सीएएस के स्थान को संवाद करने के लिए सीएआर के लिए एक तरीका निर्दिष्ट करता है जो किसी अन्य प्रमाण पत्र को जारी करने के लिए प्रयुक्त प्रमाणपत्र से मेल खाता है। दुर्भाग्यवश, इस एक्सटेंशन को वैकल्पिक होने के रूप में परिभाषित किया गया है, और अधिकांश रूट सीए इसका उपयोग नहीं करते हैं।

+0

मुझे यकीन नहीं है कि यह मेरे मूल प्रश्न से कैसे संबंधित है? मुझे सीआरएल में दिलचस्पी नहीं है, यह "कच्चा" प्रमाण है जिसे मैं पकड़ना चाहता हूं ... – KenD

संबंधित मुद्दे