Почему X509Certificate2 ошибка чтения закрытого ключа в Windows Server 2016, работает на W10 - PullRequest
0 голосов
/ 20 сентября 2018

Я создал сертификат .pfx с openssl из файла сертификата и закрытого ключа на Mac

Я использую его в проекте .Net Core 2.1 и читаю его с помощью:

var certificate = new X509Certificate2(fileName, password);

Затем я использую его в функции, которая подписывает токен JWT.В Windows 10 он работает правильно.

Но в Windows Server 2016 сертификат не читается правильно, и возникает ошибка при попытке использовать его для подписи (он читает с диска), при отладке программы, при анализесвойство PrivateKey сертификата, я вижу, что оно содержит исключение (в Windows 10 содержит значение).

А теперь самое странное:

Если вы импортируете сертификат в систему (Он правильно отображается в хранилище сертификатов с закрытым ключом), экспортирует его обратно в новый файл pfx и использует этот файл, он работает правильно.

Почему это происходит, это ошибка в openssl или в windows?

Здесь информация о том, как получить сертификат, это из учетной записи службы проекта Firebase, здесь код Python для получения .pem и .key, затем используйте openssl для создания pfx

import io
import urllib.request
import json,ssl
#Fix for no SSL Validation
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
#Here the filename of service account w/o ext, downloaded from then Firebase project
service_account="service_account"
with open(service_account+".json", encoding='utf-8') as data_file:
    data = json.loads(data_file.read())
#read the data must replace the literal \n    
private_key=data["private_key"].replace("\\n", "\n")
#print(private_key)
#Get the url for get the cetificate data
client_x509_cert_url=data["client_x509_cert_url"]
with urllib.request.urlopen(client_x509_cert_url, context=ctx) as url:
    clientData = json.loads(url.read())
#The private key id for get the certificate
private_key_id=data["private_key_id"]
#read the certificate must replace the the literal \n
certificate=clientData[private_key_id].replace("\\n", "\n") 
#save then certificate
with open(service_account+".pem", "w") as pem_file:
    pem_file.write(certificate)  
#save the key
with open(service_account+".key", "w") as key_file:
    key_file.write(private_key)  
print("Done.")
...