2015-09-04 10 views
0

У меня есть прецедент для приложения .NET, которое хранит сертификаты в базе данных. Одно из требований заключается в том, чтобы приложение отклоняло сертификаты, содержащие закрытые ключи. Пользователь загрузит файл сертификата (в частности .CER или .CRT), и приложение импортирует его как объект X509Certificate2, чтобы я мог проверить свойство HasPrivakeKey.Можно ли включить закрытый ключ в файл сертификата .CER?

Я знаю, что файлы .PFX могут содержать закрытые ключи, но возможно ли для файлов .CER или .CRT также содержать закрытые ключи? Если да, то как я могу сгенерировать тестовый сертификат для проверки логики приложения?

ответ

1

Во-первых, .NET не поддерживает формат PEM с закрытым ключом. Но если такой формат представлен, то определяется следующий результат:

1) если первый заголовок/нижний колонтитул файла в файле, то .NET проигнорирует остальное содержимое файла (например, информацию секретного ключа) и создаст действительный объект X509Certificate2без закрытого ключа (поскольку ключи PKCS # 1 и PKCS # 8 не поддерживаются функциями CryptoAPI, которые вызывается конструктором X509Certificate2.Хотя есть функции для работы с PKCS # 1).

2) если первый заголовок/нижний колонтитул первого ключа в файле, .NET будет вызывать исключение из-за недействительного сертификата.

p.s. эта комбинация возможна только при использовании кодирования Base64, и каждый раздел использует верхний и нижний колонтитулы (например, -----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----). Их невозможно комбинировать в двоичной форме без использования контейнера PKCS # 12.


обновление: если вы хотите, чтобы проверить это самостоятельно, вот пример такого PEM файла:

-----BEGIN CERTIFICATE----- 
MIIEIDCCA+CgAwIBAgIUHSle8379VhDdbksPu2S6q+CkCMQwCQYHKoZIzjgEAzAjMSEwHwYDVQQD 
ExhUb2tlbiBTaWduaW5nIFB1YmxpYyBLZXkwHhcNMTMwNzAzMTkzNDIzWhcNMTMwNzEwMTkzNDIz 
WjAtMSswKQYDVQQDHiIAYgBiADEANAAxADkAYQAyAGMAZgBjADEAZQAwADAAOAAAMIGfMA0GCSqG 
SIb3DQEBAQUAA4GNADCBiQKBgQDbU9p4AwJy2RZxHYMXKalKv6K6cwrUB2RnFHZbelPgggfJyIZm 
kL5pbB7u6tFYCBiNcMR6t8ItfVsi9iL33Uuluov7YZ3DPjRAVx4MZqXN3YR9bhzmOZpMgzKNxzoR 
Kdhxy3qWYFAKdYZ9P1ln+9aUGJE3f1MuM7OPg1vWFUZ2VwIDAQABo4ICoDCCApwwDgYDVR0PAQH/ 
BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMCMIIB/wYDVR0gBIIB9jCCAfIwggHuBgorBgEEAYI3 
MwMCMIIB3jCCAdoGCCsGAQUFBwICMIIBzB6CAcgATQBpAGMAcgBvAHMAbwBmAHQAIABkAG8AZQBz 
ACAAbgBvAHQAIAB3AGEAcgByAGEAbgB0ACAAbwByACAAYwBsAGEAaQBtACAAdABoAGEAdAAgAHQA 
aABlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACAAZABpAHMAcABsAGEAeQBlAGQAIABpAG4AIAB0 
AGgAaQBzACAAYwBlAHIAdABpAGYAaQBjAGEAdABlACAAaQBzACAAYwB1AHIAcgBlAG4AdAAgAG8A 
cgAgAGEAYwBjAHUAcgBhAHQAZQAsACAAbgBvAHIAIABkAG8AZQBzACAAaQB0ACAAbQBhAGsAZQAg 
AGEAbgB5ACAAZgBvAHIAbQBhAGwAIABzAHQAYQB0AGUAbQBlAG4AdABzACAAYQBiAG8AdQB0ACAA 
dABoAGUAIABxAHUAYQBsAGkAdAB5ACAAbwByACAAcwBhAGYAZQB0AHkAIABvAGYAIABkAGEAdABh 
ACAAcwBpAGcAbgBlAGQAIAB3AGkAdABoACAAdABoAGUAIABjAG8AcgByAGUAcwBwAG8AbgBkAGkA 
bgBnACAAcAByAGkAdgBhAHQAZQAgAGsAZQB5AC4wUwYDVR0jBEwwSoAUaISoloVlkV/P4JGkgUGj 
gzjrVSChJ6QlMCMxITAfBgNVBAMTGFRva2VuIFNpZ25pbmcgUHVibGljIEtleYIJAKs+FSwkyech 
MB0GA1UdDgQWBBQQOhVxyI6GdpyHsij3PQU1ep0k7DAJBgcqhkjOOAQDAy8AMCwCFAPO2/xwhf37 
xELxJhiMFEGvQXmgAhRNgAk/L2YWq1SlQ7Ax/XH5c8Ep0w== 
-----END CERTIFICATE----- 
-----BEGIN PRIVATE KEY----- 
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBANtT2ngDAnLZFnEdgxcpqUq/orpz 
CtQHZGcUdlt6U+CCB8nIhmaQvmlsHu7q0VgIGI1wxHq3wi19WyL2IvfdS6W6i/thncM+NEBXHgxm 
pc3dhH1uHOY5mkyDMo3HOhEp2HHLepZgUAp1hn0/WWf71pQYkTd/Uy4zs4+DW9YVRnZXAgMBAAEC 
gYAKMnja0ZEAk/VGJxAcOJSlZAmFz6l2OC3D2SCzmhliO8lu6ULOa/ZeYmeBxisbg6zYjqCj7/04 
LjbZhkYT7hcBNH6lns7yGZzkdly4y0Ud7tjsM+E31Y0Wb7jh/t3pvETUtTUxwhGT5nheiE3iDDj1 
RQATdYxAL57Hr5R1+jc5SQJBAPjrJtZN21JJSlrpZIGB2KKrK6thy/oMWGsw1B3TyZWZt1Q06Fe3 
MwTrJ1K4YWRyhRy9ib4yqQKMq0mcMqPCMGMCQQDhkTGDSG+lbZnhjop9YwmmJpxiaXZELphc9Tr8 
Kf0f6vcfe4mh0OIwpatlqaZiCh5yQwv4GTuwGsRv199f8LJ9AkEA2qeuAPh5XUoWL8/vQrgt9Y7J 
GI4a4PaxQM+utNjSrkBOQ4EKS+sYvQxYCZj/rH3QolN4yQO1ZRDucgXskd9GIwJBANk3n+2j6Nfu 
trwuLxFWOSmGjxx6IMjB8jm6ckX5DWgaNkZcCgsJA3kDYQ2ylKZexjkUdcdCTWdmL3rg8JwMR2UC 
QQCXhPLLIjtcdHzUHjy9dqzPyATduAmD23K7UPBDytFRyNcvUE+0Yfw3Lnvd/wATuUiFqHkhjD4v 
qkICcfVum6Yi 
-----END PRIVATE KEY----- 

при создании экземпляра объекта X509Certificate2 из этого файла, то вызов будет успешным. Разделите разделы, и вы увидите исключение из недопустимого формата.

+0

Есть ли у вас какие-либо ссылки? –

+0

Не уверен, если он задокументирован. Я просто человек, который имеет опыт в криптографии Windows.Я знаю об этом поведении, потому что есть вызов функции CryptStringToBinary' для преобразования Base64 в двоичную форму, и эта функция ведет себя так, как я описал: возвращается только первый раздел с заголовком/нижним колонтитулом, остальные игнорируются. – Crypt32

1

Сертификат X509 в формате PEM - это всего лишь текстовый файл. Это не редкость для людей, чтобы добавить сертификат и ключ в тот же файл, так что вы в конечном итоге с чем-то, что выглядит как:

-----BEGIN CERTIFICATE----- 
...certificate data... 
-----END CERTIFICATE----- 
-----BEGIN RSA PRIVATE KEY----- 
...key data... 
-----END RSA PRIVATE KEY----- 

Программное обеспечение ожидает читать секретный ключ будет игнорировать все вне BEGIN RSA PRIVATE KEY/END RSA PRIVATE KEY линии и программное обеспечение, ожидающие чтения общедоступного сертификата, будут игнорировать все за пределами линий BEGIN CERTIFICATE/END CERTIFICATE.

Самый простой способ проверить закрытый ключ в этом случае - это просто посмотреть маркер BEGIN RSA PRIVATE KEY.

Я не верю, что можно объединить сертификаты, закодированные DER, таким образом.

+0

Если у меня есть .pfx-файл или .cer + .pvk, могу ли я использовать makecert или openssl для генерации PEM-кода .cer-файла, описанного выше? Я знаю, что могу получить данные RSA с помощью метода X509Certificate2.PrivateKey.ToXmlString() и вручную создать файл, но я бы предпочел автоматически использовать его. –

+0

Я не знаю, что существует автоматизированный способ создания такого файла. По моему опыту, люди просто вручную объединяют вещи. – larsks