2017-04-19 15 views
5

का उपयोग कर सेककी से सीएसआर उत्पन्न करना मैंने SecKeyGeneratePair के साथ एक सार्वजनिक/निजी कुंजी जोड़ी (एल्लिप्टिक वक्र) बनाई है।ओपनएसएसएल

स्विफ्ट में ओपनएसएसएल का उपयोग कर सीएसआर उत्पन्न करने के लिए मैं SecKey उदाहरणों का उपयोग कैसे कर सकता हूं?

+1

[संबंधित] (https://stackoverflow.com/questions/13456237/generating-an-openssl-certificate-signing-request-in-ios-with-keychain-stored-ke?rq=1) लेकिन इन में नहीं स्विफ्ट। –

उत्तर

1

जहां तक ​​मैं ऐप्पल के अपने सुरक्षा ढांचे को बता सकता हूं कि वर्तमान में एपीआई का खुलासा नहीं हुआ है या सीएसआर उत्पन्न कर रहा है। यह तकनीकी रूप से ओपनएसएसएल लपेटा गया है; इसलिए यदि आपके पास ओपनएसएसएल है (मैं व्यक्तिगत रूप से लिबरएसएसएल पसंद करता हूं, तो libtls जीवन को आसान बनाता है)।

एक वैकल्पिक, आप भी Commoncrypto उपयोग कर सकते हैं जो मेरा उत्तर कवर नहीं किया जाएगा, लेकिन कई कई उदाहरण वहाँ

तो जानने ऐसा करने के तरीके के कदम के माध्यम से जाने की सुविधा देता है देखते हैं के रूप में। मैंने पाया कि OpenSSL के साथ काम करने का सबसे आसान तरीका दस्तावेज़ीकरण को पूरी तरह से अनदेखा करना और सीधे स्रोत पढ़ने के लिए जाना है।

openssl ecparam -out server.key -name prime256v1 -genkey

openssl req -new -key server.key -out server.csr

महत्वपूर्ण नोट:: एक सुरक्षित वक्र लेने के लिए सुनिश्चित करें

प्राप्त करने के लिए हम क्या जरूरत है, हम 'दोहराने' निम्नलिखित 2 आदेशों की जरूरत है। Openssl के अपने संस्करण द्वारा समर्थित वक्र की एक सूची प्राप्त करने के लिए openssl ecparam -list_curves का उपयोग करें। Read more

चरण 1 जेनरेट किया जा रहा कुंजी

ecparam हमें हम पहले sslsource/apps/openssl/ecparam.c में देखना है बताता है।

स्रोत हमें 3 कदम देता है: लेखन के लिए बीआईओ सेट अप करें, समूह पैरामीटर सेट अप करें और अंत में कुंजी उत्पन्न करें।

चरण 2 सीएसआर

इसी सिद्धांत के बाद

लेकिन इस बार req.c में देख रही है और apps.c में कुछ कोड है जो कुछ बॉयलरप्लेट req.c

में इस्तेमाल किया कोड मैं इस विधि का इस्तेमाल किया एक कच्चे बनाने के लिए होता है जनरेट कर रहा है लेकिन अवधारणा का काम करने वाला सबूत जो तेजी से चलता है, आप इसे यहां जिथब पर देख सकते हैं: CertificateTool कोड किसी भी सिस्टम पर चलाएगा जो आप swift4 + टूलचेन और ओपनएसएसएल के कुछ संस्करण को संकलित कर सकते हैं।

संपादित करें:

चुनाव आयोग गुप्त कुंजी जेनरेट:

// 
// CertificateRequest.swift 
// CertificateToolPackageDescription 
// 
// Created by Antwan van Houdt on 10/01/2018. 
// 
import CLibreSSL 

public enum NIDType: String { 
    case email = "emailAddress" 
    case hostName = "CN" 
    case organizationalUnit = "OU" 
    case organization  = "O" 
    case city  = "L" 
    case state  = "ST" 
    case countryCode = "C" 
} 

public class CertificateSigningRequest { 
    private let request: UnsafeMutablePointer<X509_REQ> 
    private let key:  ECKey 
    private let name: UnsafeMutablePointer<X509_NAME> 

    public init(key: ECKey, email: String, hostName: String, organizationalUnit: String, organization: String, countryCode: String, state: String, city: String) { 
     request = X509_REQ_new() 
     self.key = key 

     name = X509_NAME_new() 
     X509_REQ_set_version(request, 2) 

     self.add(name: email, type: .email) 
     self.add(name: hostName, type: .hostName) 
     self.add(name: organizationalUnit, type: .organizationalUnit) 
     self.add(name: organization, type: .organization) 
     self.add(name: countryCode, type: .countryCode) 
     self.add(name: city, type: .city) 
     self.add(name: state, type: .state) 

     X509_REQ_set_subject_name(request, name) 

     self.setPublicKey() 
    } 

    deinit { 
     X509_REQ_free(request) 
     X509_NAME_free(name) 
    } 

    private func add(name: String, type: NIDType) { 
     var buff = Array(name.utf8) 
     X509_NAME_add_entry_by_NID(self.name, OBJ_txt2nid(type.rawValue), MBSTRING_UTF8, &buff, Int32(buff.count), 0, 0) 
    } 

    private func setPublicKey() { 
     let certKey = EVP_PKEY_new() 
     EVP_PKEY_set1_EC_KEY(certKey, key.secretKey) 

     X509_REQ_set_pubkey(request, certKey) 
     X509_REQ_sign(request, certKey, EVP_sha256()) 

     EVP_PKEY_free(certKey) 
    } 
} 

नोट इस कोड को किसी भी जैव संबंधित कार्यों शामिल नहीं है (:

// 
// ECKey.swift 
// CertificateToolPackageDescription 
// 
// Created by Antwan van Houdt on 10/01/2018. 
// 
import CLibreSSL 

public class ECKey { 
    internal let secretKey: OpaquePointer 
    private let group: OpaquePointer 

    public init() { 
     group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1) 
     EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE) 
     EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_COMPRESSED) 

     secretKey = EC_KEY_new() 
     EC_KEY_set_group(secretKey, group) 
     EC_KEY_generate_key(secretKey) 
    } 

    deinit { 
     EC_KEY_free(secretKey) 
     EC_GROUP_free(group) 
    } 
} 

हस्ताक्षर अनुरोध बनाना अभी तक) पीईएम डेटा को किसी फ़ाइल या डेटा बफर में लिखने के लिए, लेकिन वे हैं जोड़ने के लिए वास्तव में आसान है।

अस्वीकरण: मैं पेशेवर क्रिप्टोग्राफर नहीं हूं और न ही मैं ओपनएसएसएल एपीआई के सभी इंस और आउट जानता हूं। मैं गारंटी नहीं दे सकता कि मैंने जो कोड प्रदान किया है वह 100% सही कार्यान्वयन है। हमेशा वेब से डाउनलोड कोड, विशेष रूप से क्रिप्टो कोड से सावधान रहें।

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