2015-11-16 19 views
8

मेरे पास स्ट्रिंग्स और पीएफएक्स प्रमाणपत्रों का एक गुच्छा है, जिसे मैं एज़ूर की वॉल्ट में स्टोर करना चाहता हूं, जहां केवल उपयोगकर्ताओं/ऐप्स उन्हें प्राप्त करने में सक्षम होंगे। एक स्ट्रिंग के रूप में स्ट्रिंग को स्टोर करना मुश्किल नहीं है, लेकिन मैं इस तरह से प्रमाण पत्र को कैसे क्रमबद्ध कर सकता हूं कि मैं इसे पुनर्प्राप्त कर सकता हूं और X509Certificate2 ऑब्जेक्ट सी # में ऑब्जेक्टिज़ कर सकता हूं?Azure Key Vault में एक पीएफएक्स प्रमाण पत्र को क्रमबद्ध और deserialize कैसे करें?

मैंने इसे एक कुंजी के रूप में स्टोर करने का प्रयास किया। यहाँ Azure powershell कोड

$securepfxpwd = ConvertTo-SecureString -String 'superSecurePassword' -AsPlainText -Force 
$key = Add-AzureKeyVaultKey -VaultName 'UltraVault' -Name 'MyCertificate' -KeyFilePath 'D:\Certificates\BlaBla.pfx' -KeyFilePassword $securepfxpwd 

है लेकिन जब मैं GetKeyAsync विधि के साथ इसे पाने के लिए कोशिश की, मैं इसका इस्तेमाल नहीं कर सका।

उत्तर

13

यहां आपके लिए पावरशेल स्क्रिप्ट है। फ़ाइल पथ, पासवर्ड, वॉल्ट नाम, गुप्त नाम बदलें।

$pfxFilePath = 'C:\mycert.pfx' 
$pwd = '123' 
$flag = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable 
$collection = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2Collection 
$collection.Import($pfxFilePath, $pwd, $flag) 
$pkcs12ContentType = [System.Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12 
$clearBytes = $collection.Export($pkcs12ContentType) 
$fileContentEncoded = [System.Convert]::ToBase64String($clearBytes) 
$secret = ConvertTo-SecureString -String $fileContentEncoded -AsPlainText –Force 
$secretContentType = 'application/x-pkcs12' 
Set-AzureKeyVaultSecret -VaultName 'myVaultName' -Name 'mySecretName' -SecretValue $Secret -ContentType $secretContentType 

यह एक आम सवाल है, इसलिए हम इसे पॉलिश करने और एक सहायक के रूप में रिलीज करने जा रहे हैं।

उपरोक्त स्क्रिप्ट पासवर्ड को स्ट्रिप्स करती है क्योंकि पासवर्ड सुरक्षित पीएफएक्स रखने और उसके आगे के पासवर्ड को संग्रहीत करने में कोई मूल्य नहीं है।

+1

$ clearBytes = $ संग्रह। निर्यात ($ pkcs12ContentType) निजी कुंजी निर्यात करने के लिए प्रतीत नहीं होता है। $ संग्रह का उपयोग करना। निर्यात ($ pkcs12ContentType, $ pwd) विधि ने मुझे पासवर्ड का उपयोग कर X509Certificate2 (C#) के रूप में प्रमाणपत्र आयात करने की अनुमति दी। – Trey

+0

@ सुमेद आप जिस सहायक का जिक्र कर रहे हैं वह यह है कि नया कुंजी वॉल्ट प्रमाण पत्र सुविधा है? https://docs.microsoft.com/en-us/rest/api/keyvault/certificate-scenarios आपको –

+1

@HBoyce हां वास्तव में धन्यवाद। प्रमाण पत्र सुविधा के लिए यहां एक ट्यूटोरियल है। ऊपर लिपि की तुलना में अब और अधिक संक्षिप्त, और आपके प्रमाणपत्र भी स्वतः नवीनीकृत रहते हैं। https://blogs.technet.microsoft.com/kv/2016/09/26/get-started-with-azure-key-vault-certificates/ (इस धागे को पुनर्जीवित करने के लिए धन्यवाद।) –

0

यहाँ नीला CLI

azure keyvault secret set --vault-name <Valut name> --secret-name <Secret Name> --value <Content of PFX file> 

अजगर में PFX फ़ाइल की सामग्री हो रही

fh = open(self.getPfxFilePath(), 'rb') 
    try: 
     ba = bytearray(fh.read()) 
     cert_base64_str = base64.b64encode(ba) 
     password = self.getPassword() 
     json_blob = { 
      'data': cert_base64_str, 
      'dataType': 'pfx', 
      'password': password 
     } 
     blob_data= json.dumps(json_blob) 
     content_bytes= bytearray(blob_data) 
     content = base64.b64encode(content_bytes) 
     return content 
    finally: 
     fh.close 
    fh.close() 
+0

डाउनवोट। सवाल सी # का उपयोग कर 'x509Certificate2' ऑब्जेक्ट के रूप में पुनर्प्राप्ति के बारे में था। – McGuireV10

1

मूल प्रश्न पूछा कैसे के रूप में जमा PFX को पुनः प्राप्त करने का उपयोग कर अजगर में pfx प्रमाण पत्र अपलोड करने के लिए स्क्रिप्ट है एक X509Certificate2 ऑब्जेक्ट। एक आधार 64 प्रक्रिया का उपयोग करके सुमेद बर्डे द्वारा पोस्ट किया गया है (जिसमें पासवर्ड को अलग करने का लाभ है), निम्न कोड X509 ऑब्जेक्ट लौटाएगा। वास्तविक अनुप्रयोग में, KeyVaultClient को कैश किया जाना चाहिए यदि आप एकाधिक रहस्य पुनर्प्राप्त कर रहे हैं, और व्यक्तिगत रहस्यों को भी कैश किया जाना चाहिए।

public static async Task<X509Certificate2> GetSecretCertificateAsync(string secretName) 
{ 
    string baseUri = @"https://xxxxxxxx.vault.azure.net/secrets/"; 

    var provider = new AzureServiceTokenProvider(); 
    var client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(provider.KeyVaultTokenCallback)); 
    var secretBundle = await KeyVaultClient.GetSecretAsync($"{baseUri}{secretName}").ConfigureAwait(false); 
    string pfx = secretBundle.Value; 

    var bytes = Convert.FromBase64String(pfx); 
    var coll = new X509Certificate2Collection(); 
    coll.Import(bytes, null, X509KeyStorageFlags.Exportable); 
    return coll[0]; 
} 
+1

यह बिल्कुल सही है। याद रखें कि आपको अपनी कुंजी को अपने कीवॉल्ट के 'रहस्य' अनुभाग के तहत सहेजने की ज़रूरत है, न कि आपके कुंजीवॉट – ElFik

+0

के 'कुंजी' अनुभाग में उन्हें वास्तव में चाबियाँ अनुभाग का नाम दिया जाना चाहिए था जो बेहतर सार्वजनिक कुंजी साझाकरण और रोटेशन के लिए स्पष्ट रूप से स्पष्ट किया गया था, बनाम सामान्य उद्देश्य कुंजी भंडारण ... – McGuireV10

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