Certificates

LDAP userSMIMECertificate 屬性的內容究竟是什麼?

  • June 5, 2021

我正在嘗試使用使用者證書設置 LDAP。我已經了解到證書可以以userCertificateDER 格式或userSMIMECertificatePKCS#7 格式儲存在屬性中,後者的優點是能夠包含完整的證書鏈,以及支持的 S/MIME 算法和/或客戶的首選。

但是,我正在為必須使用 PKCS#7 格式的哪些變體而苦苦掙扎。我可以將證書導出為p7b文件,據我所知,它只是一個包含多個證書的證書包,但沒有更多資訊。

userSMIMECertificate顯然需要一個(簽名?)沒有(或至少可以忽略不計)消息文本的 CMS 消息。這是p7m電子郵件客戶端創建的格式嗎?但這似乎是加密的?如何創建所需的userSMIMECertificate格式?

奇怪的。我首先嘗試在 Cryptography 上詢問 + 發帖,然後說我的問題超出了範圍。所以搬到了stackexchange,然後也說超出了範圍。無論如何,在這個問題上與其他人(c 程式,rev eng w/ Ghidra,pcaps)合作一個月左右導致了我最終在 doc.windows.com https://docs.microsoft.com/en-上分享的內容我們/answers/questions/372996/working-sample-of-ldap-usersmimecertificate-attrib.html。因此,對於那些在同一個問題上苦苦掙扎的人,我希望這會有所幫助,並且很高興在這裡重新發布全文。

這是 PKCS7 簽名的消息。在 .Net 中,您可以使用 SignedCMS 對象

...
using System.Security.Cryptography.Pkcs;
...

var ctx = new System.DirectoryServices.AccountManagement.PrincipalContext(System.DirectoryServices.AccountManagement.ContextType.Domain);
var userPrincipal  = System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(ctx, System.DirectoryServices.AccountManagement.IdentityType.SamAccountName, "...account...");
var adObject= userPrincipal.GetUnderlyingObject() as System.DirectoryServices.DirectoryEntry;


var sm = adObject.Properties["userSMIMECertificate"] as byte[];
var sCMS = new SignedCms();
sCMS.Decode(smc);

ContentType 的類型為 1.2.840.113549.1.7.1(“PKCS 7 數據”)。

就我而言,它不是空的,而是包含 45 6d 70 74 79 20 42 6f 64 79

《空虛的身體》

如果只需要該對象的證書,可以使用 X509Certificate2Collection 的導入功能


var col = new System.Security.Cryptography.X509Certificates.X509Certificate2Collection();
col.Import((byte[])smc);

創建這個 userSMIMECertificate 對像有一個問題:您需要訪問私鑰。因此,可以創建對象的將是使用者本身,或智能卡管理系統(發行時有卡)。

不必使用“userSMIMECertificate”,而只使用“userCertificate”。後者是企業可管理的,使用兩者在不同時會產生衝突。它還取決於客戶端首先使用哪個。

引用自:https://crypto.stackexchange.com/questions/60537