Я создал сертификат .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.")